4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Lambdaのメモリサイズの設定値について考える

Posted at

概要

  • Lambdaでのパラメータ値であるメモリサイズについての選択についての記事です
  • Lambdaをあまり使ったことのない人、チュートリアルで使ったことのある人向けに記事です

tl;dr

  • Lambdaは実行時間課金なのでメモリサイズを大きくする=ランニングコストが高くなるわけではない
  • コスパの良いメモリサイズを選択するために、「AWS Lambda Power Tuning」で測定してみましょう
  • 並列処理(CPU依存)をしている場合にはメモリサイズとコア数の関係を意識してメモリサイズを選択しましょう

Lambdaの課金体系

Lambdaの利用料金は、「リクエスト数」×「実行時間」によって決まります。
ここでいう実行時間は、「何MBのメモリサイズで何秒実行されたか」というような計算で決まります。
つまり、EC2などのサービスとは異なり、リソースサイズが大きいほど利用料金が高くなるというわけではありません。

例: メモリサイズを2倍にすることで実行時間が1/2になる場合は、利用料金としては変わらなくなります(変わらないということはレイテンシーが低い分メリットの方が大きいという捉え方もできます)

参考: https://aws.amazon.com/jp/lambda/pricing/

AWS Lambda Power Tuningでの最適なメモリサイズの選択

実行準備

こちらのページを開くと、aws-lambda-power-tuningのデプロイページに飛ぶことができ、デプロイボタンを押すだけでデプロイができます。
https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:451282441545:applications~aws-lambda-power-tuning

実行

ツールの実体はStepFunctionsなので、StepFunctionsのコンソールを開き、powerTuningStateMachine-XXXのステートマシンを開きます。

ステートマシンの実行時に、

{
    "lambdaARN": "your-lambda-function-arn",
    "powerValues": [128, 256, 512, 1024, 2048, 3008],
    "num": 10,
    "payload": "{}",
    "parallelInvocation": true,
    "strategy": "cost"
}

をインプットします。
※ strategyには、"cost" or "speed" or "balanced" の3つがあるそうです。

実行結果

Analyzerのステートの出力に、visualization用のURLがあるのでそちらを開きます。

Screenshot 2022-11-26 12.49.20.png

このような可視化されたデータが得られ、今回だと256MBのコストを選ぶと最もコスト的に優れているという結果が得られました。
メモリの間隔やプロット数(実行数)などはパラメータで調整可能です。

並列処理を実装していて、コア数によって性能が変わる場合

プログラム内で並列処理を実装している場合、ライブラリや実装方法にも依りますが並列数の上限値がコア数に依存するケースがあります。その場合、少しメモリサイズをアップさせることでコア数が上がるのであればメモリサイズをアップさせた方が良い場合もあるかと思います。

メモリサイズとコア数については公表はしていないようですが、下の記事等で検証している実例があったりするので、ある程度参考になりそうです。先ほどのLambda Power Tuningでざっくりとメモリサイズを選んだ上で更に細かくコア数が変わる前後のメモリサイズでレイテンシーなどを比べてみるのも選択肢の1つとしては持っておいても良いかと思います。

まとめ

Lambdaを利用する際に、実行時間上限値やメモリサイズなど色々な設定値がありますが、今回は、メモリサイズについての考え方、選び方について触れさせていただきました。
APIGateway+LambdaでAPIを構築する際などは、リソースごとにLambdaを分けるか1つのLambdaで全てのリソースを実装するか等の構成に悩むこともありますが、このような観点を持っておくと、1つだけメモリサイズを極端に大きくしたい場合にはLambdaを分けるといったような構成にするという選択肢を検討する材料になるかと思います。とはいえ、Lambdaを分けるとCloudWatchLogsのロググループが分かれたりとメリット・デメリットあるかと思いますので、あくまでも構成を考える上での1つの材料になれば幸いです。

LambdaはAPIであったり、バッチ処理、Webhookなど利用シーンも多岐に渡るので、ユースケースに合わせて最適な使い方ができると良いなと改めて考えるきっかけとなりました。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?