こんにちは。 ディベロップメントサービス1課の山本です。
今回は AWS Lambda (以降、Lambda) のパッケージサイズによって、コールドスタート時間がどれくらい変わるのか調べてみました。
この記事の対象者は?
- Lambda のコールドスタート時間に悩んでいる方
- 単純にパッケージサイズが与えるコールドスタート時間の影響に興味のある方
Lambda のコールドスタート時間とは
Lambda の起動時に以下の処理を実施する時間です。
- 関数のコードをダウンロード
- イベントハンドラー外に記述された初期化コードを実行
ファイルサイズが大きくなるにつれて時間が長くなり、時には数秒かかって全体の処理時間に影響を与えることがあります。
Operating Lambda: パフォーマンスの最適化 – Part 1 | Amazon Web Services ブログ
コールドスタート時間の短縮方法
AWS 公式から様々な方法が提案されておりますが、今回は二つの内容に着目して検証したいと思います。
・デプロイパッケージのサイズを最小限にします。デプロイパッケージが小さいほど、機能の起動が速くなります。関数がインポートする依存関係と外部ライブラリの数を最小限に抑え、デプロイパッケージのサイズは 50 MB 未満にしてください。
・Lambda 関数コードを最適化して、初期化にかかる時間を最小限に抑えます。関数がインポートする依存関係と外部ライブラリの数を減らします。初期化中に実行されるコードの量を減らします。
Lambda 関数のコールドスタート問題のトラブルシューティング | AWS re:Post
デプロイパッケージのサイズを小さくする or インポートの量を小さくすることで、コールドスタート時間が短縮される模様です。
気になったので、それぞれどのくらい変わるか検証してみます。
検証方法
二つのファイルを Lambda (メモリ:1024MB) にデプロイします。
-- app.py (ハンドラー関数持ち) |_ weight.py (極大サイズファイル:10MB, 50MB, 100MB)
その後、以下の2パターンでコールドスタート時間を計測します。
- デプロイパッケージのサイズが大きいパターン
- weight.py を import しない
- インポート量が大きいパターン
- weight.py を import する
app.py
import weight # 検証パターンによっては行削除 def lambda_handler(event, context): return { "statusCode": 200, "body": "test", }
weight.py
def weight_code(): print("AAAAAAAAAAA.......") print("AAAAAAAAAAA.......") # 無限に記載
結果
顕著に違いが見えたので、検証は各 1 回実施しました。
インポート無し
ファイルサイズ | コールドスタート時間 |
---|---|
10 MB | 77.82 ms |
50 MB | 76.18 ms |
100 MB | 86.6 ms |
インポート有り
ファイルサイズ | コールドスタート時間 |
---|---|
10 MB | 290.43 ms |
50 MB | 1152.67 ms |
100 MB | 2258.67 ms |
グラフにすると以下のような形になります。
単純にファイルサイズが大きくなるだけではあまり変わらず、インポートするサイズによってコールドスタート時間が変わるようです。
まとめ
- パッケージサイズが単純に大きくなるだけでは、コールドスタート時間は伸びない
- インポートするサイズが大きくなることで、初めてコールドスタート時間が伸びる
- 無駄なインポートはやめましょう
さいごに
少しでもインポートする量を減らすために from xxx import yyy
を活用しましょう。
本ブログがどなかたのお役に立てれば幸いです。