2025-10-18 #aws

AWS Lambda のメモリ設定による CPU の変化


みんな大好き AWS Lambda (以降,Lambda) は,サーバレスでアプリケーションを実行できる便利なサービスです.
Lambda の設定には,メモリサイズを指定する項目はありますが,CPU は直接指定できません (アーキテクチャを x86_64 または ARM64 にするかは選択可能です).
公式ドキュメントには,以下の通り記載があります.

Lambda は、設定されたメモリの量に比例して CPU パワーを割り当てます。メモリは、実行時に Lambda 関数で使用できるメモリの量です。[メモリ] 設定を使用して、関数に割り当てられたメモリと CPU パワーを増減できます。メモリは、128 MB~10,240 MB の値を 1 MB 単位で設定できます。1,769 MB の場合、1 つの vCPU (1 秒あたりのクレジットの 1 vCPU 秒分) に相当します。

しかし,CPU バウンドな処理に Lambda を使いたい場合,メモリしか設定できないと困ります.
4 vCPU が欲しいけれども,メモリサイズをどの値に設定するといいんだろうかといった悩みが生じます.
そこで,実際に複数のメモリ設定で Lambda を実行してみて,CPU のコア数やクロック周波数がどう変化するか観測してみました.

先駆者もいらっしゃいますが,その記事から 5 年も経っているので,改めて現在の Lambda がどうなのか検証しています.

結果

先に結果を示します.4 GiB くらいまでは 2 コアで,それ以上は段階的にコア数が増えるようです.この傾向は CPU アーキテクチャに依らず一貫していました.
コア数の推移は先駆者の実験結果と変わらず,今も同じアルゴリズムで割り当てられていると予想できます.

また,x86_64 の CPU モデルは Intel Xeon 系であり,ほとんどが, 2.50 GHz のものでしたが,まれに 2.90 GHz のアタリを引くこともあるみたいです.
100 回のコールドスタートを試行していますが,1%程度の頻度なので,あまり期待しないほうが良さそうです.
ARM64 の場合は,/proc/cpuinfo から CPU モデル名を取得できませんでしたが,おそらく Graviton 系のプロセッサを使っていると思われます.

メモリサイズ (MB)CPU アーキテクチャ論理コア物理コアCPU モデル
128amd6422Intel(R) Xeon(R) Processor @ 2.50GHz (99/100)
Intel(R) Xeon(R) Processor @ 2.90GHz (1/100)
128arm642--
256amd6422Intel(R) Xeon(R) Processor @ 2.50GHz -
256arm642--
512amd6422Intel(R) Xeon(R) Processor @ 2.50GHz -
512arm642--
1024amd6422Intel(R) Xeon(R) Processor @ 2.50GHz -
1024arm642--
2048amd6422Intel(R) Xeon(R) Processor @ 2.50GHz (99/100)
Intel(R) Xeon(R) Processor @ 2.90GHz (1/100)
2048arm642--
3008amd6422Intel(R) Xeon(R) Processor @ 2.50GHz -
3008arm642--
4096amd6433Intel(R) Xeon(R) Processor @ 2.50GHz -
4096arm643--
8192amd6455Intel(R) Xeon(R) Processor @ 2.50GHz (99/100)
Intel(R) Xeon(R) Processor @ 2.90GHz (1/100)
8192arm645--
10240amd6466Intel(R) Xeon(R) Processor @ 2.50GHz -
10240arm646--

実験方法

実験に使用したコードはこちらに置いています.
このコードには,3 つの異なる目的のプログラムで構成されています.

  • lambdasrc/main.go: /proc/cpuinfo から CPU 情報を取得し,DynamoDB に保存する Lambda 関数.x86_64 と ARM64 の両方の Lambda 関数がデプロイ.
  • invoke.py: 先述の Lambda 関数を様々なメモリ設定で呼び出すスクリプト.
    ※ Lambda は設定を変更すると次の実行はコールドスタートになるので,実行基盤の変更を強制しています.
  • stats.py: DynamoDB に保存された結果を集計するスクリプト.

メモリ設定を 128MB から 10,240MB まで変更しつつ Lambda を実行し,DynamoDB に蓄積した CPU 情報を集計しました.
なお,本稿の「論理コア/物理コア」は /proc/cpuinfoprocessor 数や cpu cores を基準に算出しています.

まとめ

  • 約 4GB までは論理コア 2,それ以上で段階的に増加 (4096MB: 3,8192MB: 5,10240MB: 6).
  • x86_64 では,ほとんどが Intel Xeon @ 2.50GHz .まれに 2.90GHz を引くこともある.
  • ARM64 はモデル名が取得できず (おそらく Graviton).
  • CPU バウンド処理でスレッド並列性を引き出すには,4–8GiB 以上のメモリ設定を検討するとよい.