[AWS CDK] Graviton2 プロセッサを使用する AWS Lambda 関数(Node.js)を構築する
こんにちは、CX事業本部 Delivery部の若槻です。
2021年より arm64 ベースの AWS Graviton 2 プロセッサ が搭載された AWS Lambda 関数が利用可能になりました。
Graviton2 は最大 19% の性能向上と最大 20% のコスト削減が可能とのことです。
今回は、arm64 ベースの Lambda 関数(Node.js ランタイム)を AWS CDK で構築し、また x86 ベースの Lambda 関数と性能比較してみました。
やってみた
実装
AWS CDK では Architecture
クラスを使って、Lambda 関数で利用するアーキテクチャを指定できます。
現在 Architecture
クラスで指定可能なアーキテクチャは次の2つです。
ARM_64
:ARM 命令セットの 64 bit アーキテクチャX86_64
:x86 命令セットの 64 bit アーキテクチャ
Architecture
クラスを aws_lambda_nodejs または aws_lambda コンストラクトクラスの architecture
プロパティに指定することで、Lambda 関数で利用するアーキテクチャを指定できます。既定値は X86_64
です。
import { aws_lambda_nodejs, aws_lambda, Duration, Stack, StackProps, } from 'aws-cdk-lib'; import { Construct } from 'constructs'; export class CdkSampleStack extends Stack { constructor(scope: Construct, id: string, props: StackProps) { super(scope, id, props); new aws_lambda_nodejs.NodejsFunction(this, 'hogeFunc', { timeout: Duration.seconds(30), // architecture: aws_lambda.Architecture.X86_64, // 既定値は x86 architecture: aws_lambda.Architecture.ARM_64, // arm64 を利用する場合 }); } }
比較用コード
両アーキテクチャの性能比較を行うため、1から10億までの整数の加算処理を行う以下の Node.js コード を利用します。
export const handler = async (): Promise<void> => { let sum = 0; for (let i = 0; i < 1000000000; i++) { sum += i; } console.log(sum); };
比較してみる
前述のコードを両を実行し、実行時間を比較してみます。
- x86 アーキテクチャ
Duration: 18388.36 ms Billed Duration: 18389 ms Memory Size: 128 MB Max Memory Used: 61 MB Init Duration: 150.93 ms
- arm64 アーキテクチャ
Duration: 16904.87 ms Billed Duration: 16905 ms Memory Size: 128 MB Max Memory Used: 59 MB Init Duration: 158.90 ms
(1 - 16904.87 / 18388.36) * 100 = 8.06754925398
となり、arm64 アーキテクチャの Lambda 関数は x86 アーキテクチャの Lambda 関数に比べて、約8%高速化されました。
AWS Graviton 3 プロセッサは?
2022年には、AWS Graviton3 プロセッサを搭載した Amazon EC2 C7g インスタンス の提供が開始されました。
この Graviton3 の arm64 アーキテクチャは Lambda 関数で利用できるようにならないのか気になりましたが、そもそも両者で向いているワークロードが違うようです。Graviton2 プロセッサはアプリケーションサーバーやマイクロサービスなどの Lambda 関数を利用して実装されることが多いワークロードに対しても適している対し、Graviton3 プロセッサは機械学習などメモリインテンシブなワークロードに最適化されているとのことです。
よって Lambda 関数での arm64 アーキテクチャの利用は、引き続き Graviton2 プロセッサを使うことになりそうです。
おわりに
AWS CDK で Graviton2 プロセッサを使用する AWS Lambda 関数(Node.js)を構築し、x86 との性能比較をしてみました。
Infrastructure as Code である AWS CDK でも Lambda 関数のアーキテクチャとして arm64 を指定できることですし、今後は性能向上やコスト削減が期待できる Graviton2 プロセッサを使用しない手は無いのではないでしょうか。
参考
以上