Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
詳解 AWS Lambdaコールドスタート
Search
TomoyaIwata
July 31, 2024
Programming
1
1.9k
詳解 AWS Lambdaコールドスタート
2024/7/29のClassmethod ODYSSEY Onlineで発表した際の資料です
TomoyaIwata
July 31, 2024
Tweet
Share
More Decks by TomoyaIwata
See All by TomoyaIwata
これでLambdaが不要に?!Step FunctionsのJSONata対応について
iwatatomoya
2
4k
Qdrantでベクトルデータベースに入門してみよう
iwatatomoya
0
360
真のサーバーレスへ向けたAuroraの進化Aurora Limitless Database
iwatatomoya
1
4.5k
AWS SDKのClientはFactory経由で作ろう
iwatatomoya
1
720
OpentelemetryでアプリケーションのObservabilityを強化しよう
iwatatomoya
0
940
AWS Lambdaは俺が作った
iwatatomoya
2
2.3k
SnapStartの未来についての期待と妄想
iwatatomoya
1
1.3k
実例から学ぶ! AWSを活用したシステム開発の勘所
iwatatomoya
1
3k
目指せ完全制覇!3大クラウドの認定資格制度と勉強方法について
iwatatomoya
0
9.3k
Other Decks in Programming
See All in Programming
CloudflareStack でRAGに入門
asahiiwm
0
140
見えないメモリを観測する: PHP 8.4 `pg_result_memory_size()` とSQL結果のメモリ管理
kentaroutakeda
0
880
テストコードのガイドライン 〜作成から運用まで〜
riku929hr
6
1.3k
毎日13時間もかかるバッチ処理をたった3日で60%短縮するためにやったこと
sho_ssk_
1
490
為你自己學 Python
eddie
0
500
React 19でお手軽にCSS-in-JSを自作する
yukukotani
5
530
Итераторы в Go 1.23: зачем они нужны, как использовать, и насколько они быстрые?
lamodatech
0
1.2k
menu基盤チームによるGoogle Cloudの活用事例~Application Integration, Cloud Tasks編~
yoshifumi_ishikura
0
130
命名をリントする
chiroruxx
1
550
「とりあえず動く」コードはよい、「読みやすい」コードはもっとよい / Code that 'just works' is good, but code that is 'readable' is even better.
mkmk884
6
1.3k
PHPで学ぶプログラミングの教訓 / Lessons in Programming Learned through PHP
nrslib
4
1k
EC2からECSへ 念願のコンテナ移行と巨大レガシーPHPアプリケーションの再構築
sumiyae
3
540
Featured
See All Featured
Designing on Purpose - Digital PM Summit 2013
jponch
116
7k
How to Think Like a Performance Engineer
csswizardry
22
1.3k
Become a Pro
speakerdeck
PRO
26
5.1k
Being A Developer After 40
akosma
89
590k
The Pragmatic Product Professional
lauravandoore
32
6.3k
Building Adaptive Systems
keathley
38
2.3k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Side Projects
sachag
452
42k
How to train your dragon (web standard)
notwaldorf
88
5.8k
Code Review Best Practice
trishagee
65
17k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Transcript
詳解 AWS Lambda コールドスタート 2024.7.29 リテールアプリ共創部 岩⽥ 智哉
このセッションで扱うこと 2 コールドスタート関連の⾖知識 ...70%ぐらい 実務に役⽴つ話 ...30%ぐらい
⾃⼰紹介 3 岩⽥ 智哉 産業⽀援グループ リテールアプリ共創部 マッハチーム 普段は開発やってます TypeScript and
(ECS or Lambda) が多め ⼤阪オフィス所属 好きなAWSサービスはAWS Lambda
コールドスタートのライフサイクル 4 AWS Lambda Under the Hood より引⽤ https://serverlessland.s3.amazonaws.com/pdf/mike_danilov_qcon_23_final.pdf
コールドスタートを改善するには 5 AWSが最適化する領域について 最適化の恩恵を受けやすくする ユーザー側で最適化すべき領域を 最適化する
ここから コールドスタートについて 深堀りしていきます 6
Lambdaの実⾏環境について 7 ↓まずはココの話から
Lambdaの舞台裏 8 Lambda executions - Security Overview of AWS Lambdaより引⽤
https://docs.aws.amazon.com/whitepapers/latest/security-overview-aws-lambda/lambda-executions.html Worker
MicroManager 9 Firecracker: Lightweight Virtualization for Serverless Applications より引⽤ https://assets.amazon.science/96/c6/302e527240a3b1f86c86c3e8fc3d/firecracker-lightweight-virtualization-
for-serverless-applications.pdf
Full cold StartとPartial cold Start 10 AWS re:Invent 2020: AWS
Lambda – Part 2: Optimizing your Lambda function performance より引⽤ https://www.youtube.com/watch?v=rrK7PA8ZK7M
LambdaのコードDL 11 ↓続いてココの話
コンテナイメージ 形式のLambda 12
コンテナイメージ形式のLambda 13 re:invent2020で発表 最⼤10Gのコンテナイメージがデプロイ可能 10Gのイメージが数百msで起動可能
なぜコールドスタートが早いのか︖ 14 コンテナイメージを⼩さなチャンクに分割 チャンクは重複排除して保存 オンデマンドでチャンクをロード
コンテナイメージの保存⽅法 15 Deep dive into AWS Lambda security: Function isolation
より引⽤ https://d1.awsstatic.com/events/reinvent/2020/Deep_dive_into_AWS_Lambda_security_Function_isolation_SVS404.pdf Worker
キャッシュヒット率を上げるには 16 AWS が提供するベースイメージは、Lambda サービスによってプロ アクティブにキャッシュされます。つまり、ベースイメージは近く の別のアップストリームキャッシュにあるか、ワーカーインスタン スキャッシュにすでに存在しています。 コンテナイメージとしてパッケージ化された Lambda
関数の最適化 より引⽤ https://aws.amazon.com/jp/blogs/news/optimizing-lambda-functions-packaged-as-container-images/
キャッシュの考え⽅は ZIP形式のパッケージにも 共通しているのか︖︖ 17
その昔…findmntの実⾏結果 18 TARGET SOURCE …略 ├─/var/task /dev/vdb[/opt/amazon/asc/worker/tasks/<AWSアカウン トID>/<Lambda関数名>/<UUIDらしきランダムな⽂字列>] …略 ├─/var/runtime
/dev/root[/opt/amazon/asc/worker/runtime/nodejs-8.x] ├─/var/lang /dev/root[/opt/amazon/asc/worker/lang/node-v8.10.x] …略
聞いてみた 19 サーバーレスアンチパターン今昔物語 第五夜- 解体新書 - https://www.youtube.com/live/rlYurgnHyFY?si=82MI1poDhq34jGcp ⽬の付け所が良いで すね〜 …
これはですね、 回答できません ので、察して下さい
LambdaのInit処理 20 最後にココ↓
LambdaのInitフェーズ 21 コールドスタート時のみ実⾏されるフェーズ DBとの接続などを管理するためのグローバル変数を宣⾔ するプラクティスが知られている 画像は Comparing the effect of
global scope より引⽤ https://docs.aws.amazon.com/ja_jp/lambda/latest/operatorguide/global-scope.html
遅延実⾏について 掘り下げて考える 22
遅延実⾏ 23 import boto3 client = None def handler(event, context):
global client if client is None: client = boto3.client(‘s3’) # ...略 import boto3 client = boto3.client(‘s3') def handler(event, context): # ...略 遅延実⾏なし 遅延実⾏あり
遅延実⾏に効果はあるのか︖ 24 Init Invoke Init Invoke t1 t2 Initフェーズの処理をInvokeフェーズに移動することで Initフェーズを⾼速化
Lambda利⽤者から⾒るとコールドスタート時の処理時間 はInitフェーズ + Invokeフェーズ
遅延実⾏が効果を発揮するケース 25 def handler(event, context): global client # ...略 if
hoge == ‘fuga’ : if client is None: client = boto3.client(‘s3’) Invokeフェーズに移動した処理が呼び出される頻度 次第で全体最適化が図れるかも︖︖
遅延実⾏しない⽅が速い︖︖ 26 遅延実⾏あり 遅延実⾏なし
boost host CPU 27 InitフェーズではCPU割当が最⼤10秒間までブーストする AWS re:Invent 2019: [REPEAT 1]
Best practices for AWS Lambda and Java (SVS403-R1) より引⽤ https://d1.awsstatic.com/events/reinvent/2019/REPEAT_1_Best_practices_for_AWS_Lambda_and_Java_SVS403-R1.pdf
遅延実⾏なしの場合 28 import boto3 client = boto3.client(‘s3') def handler(event, context):
# ...略 (メモリ割当によらず) ブーストしたCPUパワーで処理
遅延実⾏ありの場合 29 import boto3 client = None def handler(event, context):
global client if client is None: client = boto3.client(‘s3’) # ...略 メモリ割当に応じたCPUパワーで処理
boost host CPUの検証 30 boost host CPU 実行 箇所 メモリ
所要時間 有 INIT 128M 約6.02秒 無 INIT 128M 約84.34秒 無 INV OKE 128M 約85.31秒 無 INV OKE 1769M 約6.08秒 メモリ割り当ての追加は Initフェーズの⾼速化につながらない
ここからは⾔語別に コールドスタート改善の TIPSを紹介 31
.NET(C#)の場合 32 Native AOT(Ahead-Of-Time) 実⾏時に中間⾔語からコンパイルするのではなく実⾏ 前に事前にコンパイルする⽅式 .NET 8のランタイムからNative AOTに対応
Node.jsの場合 33 https://dev.classmethod.jp/articles/node-extra-ca-certs-influence-cold-start/ ~Node.js18x: AmazonのRoot CA証明書を読み込む Node.js20x: 追加のRoot CA証明書は読み込まない /var/runtime/ca-cert.pemに全てのAmazonのRoot
CA証明書を含むファイルが配置されている 環境変数NODE_EXTRA_CA_CERTSで指定されたファ イルを追加で読み込む
CA証明書読み込みの影響 34 https://dev.classmethod.jp/articles/node-extra-ca-certs-influence-cold-start/ NODE_EXTRA_CA_CERTS min max avg median 95%tile 設定無し
128.56 201.57 139.8471 137.37 168.3 /var/task/ap-northeast-1-bundle.pem 141.45 216.89 155.3957 153.45 170.87 /var/runtime/ca-cert.pem 156.23 220.24 171.9132 171.59 181.15 追加のCA証明書を読み込まない場合は全部⼊りのCA証明書 を読み込む場合と⽐較して平均30ms程度⾼速に
不要ファイルはデプロイしない 35 REDME.md *.d.ts 単にnpm installしただけだとnode_modulesの中は 不要ファイルでいっぱい
CDKでのNode.js向けレイヤー作成例 36 bundling: { …略 [ …略, 'find node_modules -type
l | xargs rm -f’, 'find node_modules -type f -name *.d.ts | xargs rm -f’, 'modclean -r’, 'node-prune’, 'mv node_modules /asset-output/nodejs/', ].join(' && '),
レイヤーを使うよりバンドルを 37 ESBuild等でバンドルすることで未使⽤のライブラリはデ プロイパッケージに含めない ライブラリのドキュメントなども⾃動的にデプロイ対象外 になる 最近はJSではなくTSを使うケースが多いので、⾃動的に 恩恵を受けているケースも多いはず
今後はLLRTに注⽬ 38 Lambda向けの軽量JavaScriptランタイム JITコンパイラを搭載しない 画像は Lambda Cold Starts analysis より引⽤
https://maxday.github.io/lambda-perf/
Javaの場合 39 Java のようなコンパイル済み⾔語の関数でレイヤーを使⽤しても、Python のようなインタープリター⾔語と同じメリットが得られない場合がありま す。Java はコンパイル済み⾔語なので、関数は初期化フェーズで共有アセ ンブリを⼿動でメモリに読み込む必要があり、コールドスタート時間が⻑ くなる可能性があります。代わりに、コンパイル時にすべての共有コード を含めて、組み込みコンパイラ最適化機能を活⽤することをお勧めします。
.zip または JAR ファイルアーカイブで Java Lambda 関数をデプロイする より引⽤ https://docs.aws.amazon.com/lambda/latest/dg/java-package.html
依存するjarファイルは/libに 40 Java で記述されたデプロイパッケージを Lambda で解凍する所 要時間を短縮します。そのために、依存する .jar ファイルを別個 の
/lib ディレクトリにファイルします。これで関数のすべてのコ ードを多数の .class ファイルと⼀緒に単⼀の Jar に収納するより も⾼速化されます。 AWS Lambda 関数を使⽤するためのベストプラクティス より引⽤ https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/best-practices.html
パッケージング⽅法の⽐較 41 AWS re:Invent 2020: Ahead of time: Optimize your
Java application on AWS Lambda より引⽤ https://d1.awsstatic.com/events/reinvent/2020/Ahead_of_time_Optimize_your_Java_application_on_AWS_Lambda_SVS408.pdf
SnapStartを使う 42 re:invent 2022で発表された新機能 Initフェーズ完了後にMicroVMのスナップショットを取得 コールドスタート時にスナップショットからMicroVMをリ ストアして利⽤
スナップショットの構成要素 43 メモリ Lambdaのメモリ割り当てに⽐例して⼤きくなる︖ VMの状態 Disk /tmp領域のサイズに⽐例して⼤きくなる︖ ※SnapStartは512MB以上の/tmp領域と併⽤不可
SnapStartとメモリの関係 44 AWS Lambda Under the Hood より引⽤ https://serverlessland.s3.amazonaws.com/pdf/mike_danilov_qcon_23_final.pdf
リストア時間はメモリに⽐例しない 45 メモリ10GでもRestore Durationは⼗分に短い
Pythonの場合 46 du -d 1 -h lib/python3.12/site-packages/botocore/data/ …略 1.6M lib/python3.12/site-packages/botocore/data//ec2
32K lib/python3.12/site-packages/botocore/data//apprunner 28K lib/python3.12/site-packages/botocore/data//lookoutmetrics 28K lib/python3.12/site-packages/botocore/data//redshift-serverless 18M lib/python3.12/site-packages/botocore/data/ コールドスタート⾼速化のためにboto3をスリム化して改善効果を測定してみた https://dev.classmethod.jp/articles/coldstart-with-minified-boto3/ botocoreから不要サービスのJSONを削除すればスリム化が図れる
botocoreのjsonを事前解凍 47 endpoint-rule-set-1.json.gz examples-1.json paginators-1.json service-2.json.gz waiters-2.json 必要なAWSサービスの定義を事前に解凍 endpoint-rule-set-1.json examples-1.json
paginators-1.json service-2.json waiters-2.json
Client⽣成の所要時間を⽐較 48 def handler(event, context): client = boto3.client(‘dynamodb’) client =
boto3.client(‘iot’) client = boto3.client(‘iot-data’) client = boto3.client(‘s3’) client = boto3.client(‘sns’) client = boto3.client(‘sqs’) client = boto3.client(‘ssm’) メモリ128MBでコールドスタート時のdurationを⽐較
事前解凍で微妙に⾼速化 49 GZIP解凍 件数 最小値 最大値 平均 中央値 95%タイル 無し
99 4317.58 5012.98 4762.81 4772.86 4976.62 有り 99 3254.42 4836.53 4599.8 4610.88 4800.26 filter @type = "REPORT" and ispresent(@initDuration)| stats count(@duration) , min(@duration), max(@duration), avg(@duration), median(@duration) , pct(@duration, 95)
⿊魔術的なテクニックの 利⽤にはご注意ください 50
最後にまとめ 51
まとめ 52 Lambdaを使う以上はコールドスタートは避け られない コールドスタートについて深く理解すること でパフォーマンスが最適化できる このセッションで紹介した知識やTIPSがヒン トになれば
良いLambdaライフを︕ 53
ありがとうございました 54