Lambdaの実行時間について

2019-07-17

Lambdaチューニング(Lambdaの仕組みと実行時間)

Lambda実行環境の仕組み

  • Lambda が Lambda 関数を実行する時の環境には、Amazon Linuxが動作するコンテナが使われます。この実行環境を「実行コンテキスト」と呼びます。
  • この実行コンテキストの起動には多少の準備時間が掛かり、Lambda関数を実行する際に実行コンテキストの起動から行うケース(コールドスタート)と、実行コンテキストを再利用するケース(ウォームスタート)があります(一定の時間は実行コンテキストが維持されるため)。また、コールドスタートによるLambda関数実行までの遅延は、度々Lambda のパフォーマンストラブルにも繋がります。
  • 開発者は実行コンテキストが再利用されるケースを想定して開発してはいけません。実行コンテキストが再利用された時は、データベースとの接続や/tmpなどの一時領域、定義済みの環境変数が引き継がれます。ただし、Lambdaの実行コンテキストはユーザー側が制御できるものではありません。再利用される保証はありませんので、開発者は再利用を想定してはいけません。
  • 以下、AWS Lambda開発者ガイドからの引用です。
AWS Lambda が Lambda 関数を実行するとき、Lambda 関数を実行するために必要なリソースがプロビジョニングおよび管理されます。Lambda 関数を作成する際に、Lambda 関数に許可するメモリ容量や最大実行時間などの設定情報を指定します。Lambda 関数が呼び出されると、AWS Lambda は指定する構成設定に基づいて実行コンテキストを起動します。実行コンテキストとは、データベース接続あるいは HTTP エンドポイントなど、Lambda 関数コードのすべての外部依存関係を初期化する一時的なランタイム環境です。これにより、次に説明するように、「コールドスタート」やこれらの外部依存関係を初期化する必要がなくなるため、後続の呼び出しパフォーマンスが向上します。
実行コンテキストの設定には時間がかかります。また、「ブートストラップ」が必要なため、Lambda 関数を呼び出すたびに若干のレイテンシーが発生します。通常、この遅延は Lambda 関数を初めて呼び出したとき、または更新されたときに発生します。Lambda 関数を連続して呼び出す場合、AWS Lambda はできる限り実行コンテキストを再利用します。
Lambda 関数が実行されると、AWS Lambda は別の Lambda 関数呼び出しに備えて、実行コンテキストを一定期間維持します。実際には、サービスは Lambda 関数の完了後実行コンテキストをフリーズさせ、再び Lambda 関数が呼び出された際に AWS Lambda がコンテキストを再利用する場合は、コンテキストを解凍して再利用します。 Lambda 関数コードを記述するときは、AWS Lambda によって後続の関数の呼び出しに実行コンテキストが自動的に再利用されると想定しないでください。他の要因で AWS Lambda によって新しい実行コンテキストが作成される場合があるため、データベース接続の失敗など予期しない結果になることがあります。

Lambda関数の実行時間

  • Lambda関数の実行までには、下記のステップを必要とします。
    1. ENIの作成
      (ENIの作成は、VPC内にLambdaを配置する場合に必要。ENI:Elastic Network Interfaceを指す。)
    2. 実行コンテキストの起動
    3. デプロイパッケージの読み込み
    4. デプロイパッケージの展開
    5. ランタイムの起動と初期化
    6. 関数の実行
  • ENIの作成には10秒程度掛かります。
  • CloudWatchにて計測されるLambdaのDuration(実行時間)には、1~5は含まれません。実行時間は6のみとなります(Lambdaの実行時間=コストのため、関数実行に掛かる時間以外は含まれない)。

Lambdaのコールドスタート vs ウォームスタート

  • Lambdaのコールドスタートは、ステップ1~6を行います。
  • Lambdaのウォームスタートは、ステップ1~5を再利用し、6のみを行います。
  • コールドスタートが必要なケースは下記の通り。
    • 1つも実行コンテキストがない
    • 利用可能な実行コンテキストの数以上に同時に処理すべきリクエストを受けた
    • コードや設定を変更した
  • 常時安定的なリクエストが来ているならばコールドスタートは発生しません。ただし、いかなるシステムでもコールドスタートを0にはできません。コールドスタートを許容できないシステムは、アーキテクチャの選択を見直す必要があります。

参考資料

  • Lambdaの仕組みを勉強する時に役立つ資料
  • チューニング(Lambdaを早くするコツ)が紹介されています。

AWS, Lambda

Posted by takaaki