AWS LambdaにProvisioned Concurrencyを設定した際、不可解な現象に遭遇したため、原因を調査した。
発生した現象
Provisioned Concurrencyを設定したLambda関数について、同時実行がないにも関わらず下記のような Init Duration
を含むログが出力され、コールドスタートが発生してしているように見える。さらに Init Duration
の数値がOn-Demand Concurrencyの場合に比べて大幅に増加している。
REPORT RequestId: xxxx Duration: xx ms Billed Duration: xx ms Memory Size: xx MB Max Memory Used: xx MB Init Duration: xx ms
解析結果
- 結論としては、ログに
Init Duration
が出力されているが、実際にはコールドスタートは発生していない。 - Provisioned Concurrencyを設定した場合も定期的にインスタンスの破棄・再構築が行われる。設定したConcurrency数を常に維持するように、インスタンスの破棄・再構築はLambda関数実行とは非同期に実行されるが、再構築直後の関数実行時のREPORTログに再構築時のInit処理時間が
Init Duration
として記録される。 - On-Demand ConcurrencyではInit処理にCPU burstが適用されるが、Provisioned Concurrencyでは適用されない。このためInit処理時間が長くなる。
参考
- Understand the Lambda execution environment lifecycle - AWS Lambda
- Provisioned Concurrencyで予約したLambda実行環境のライフサイクルを調べてみた #reinvent | DevelopersIO
- LambdaのINITフェーズではメモリ128MでもCPUパワーをフルに使える?!boost host CPUの動きを確認してみた | DevelopersIO
- Provisioned Concurrency な Lambda の実行時間をどう監視すべきか - ENECHANGE Developer Blog
- Why cold starts of a lambda with provisioned concurrency are much slower than cold starts of on demand instances? | AWS re:Post