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
FaaS における Java 起動時間の比較 (AWS / Azure / GCP) #jjug_ccc #jjug_ccc_d
Search
Kihara, Takuya
June 04, 2023
Technology
2
1.7k
FaaS における Java 起動時間の比較 (AWS / Azure / GCP) #jjug_ccc #jjug_ccc_d
JJUG CCC 2023 Spring 登壇資料
2023/06/04 16:40〜17:00
Kihara, Takuya
June 04, 2023
Tweet
Share
More Decks by Kihara, Takuya
See All by Kihara, Takuya
AWS Lambda で LLRT を動かしてみた #北海道まったりLT大会
tacck
0
56
地方から始める登壇のステップアップ 〜Java Do から JJUG CCC への登壇参加記録 #javado
tacck
0
85
ゆるWebの新型コロナ Before/After とこれからのこと #seb_yearend
tacck
0
25
AWS Amplify と Amazon Bedrock を使ってオレオレ生成AIサイトを作る #ゆるWeb札幌
tacck
0
150
「普通」のエンジニアとしての生存戦略〜または、いかにして技術を楽しむか。 #情報メディア入門
tacck
0
57
噂の Amazon Bedrock を Java から使ってみる #javado
tacck
1
280
ソラカメとAmplifyでお手軽ライブカメラを作ってみた(制限あり) #ゆるWeb札幌
tacck
0
220
ゆるWeb勉強会@札幌 #24 #ゆるWeb札幌
tacck
0
120
AWS Amplify と Cloudflare Pages 比べてみれば / #CloudflareUG_cts #AWSAmplifyJP
tacck
1
640
Other Decks in Technology
See All in Technology
VS CodeでAWSを操作しよう
smt7174
8
1.7k
アクセス制御にまつわる改善 / Improving access control
itkq
0
540
自己改善からチームを動かす! 「セルフエンジニアリングマネージャー」のすゝめ
shoota
6
730
家族アルバム みてねにおけるGrafana活用術 / Grafana Meetup Japan Vol.1 LT
isaoshimizu
1
750
Google Cloud Next '24 Recap(Cloud Run/k8s)
mokocm
0
230
レガシーをぶっ壊せ。AEONで始めるDevRelの話 / Qiita Night 2024-2-22
aeonpeople
3
1.3k
AWSに詳しくない人でも始められるコスト最適化ガイド
yuhta28
1
240
FrontDoorとWebAppsを組み合わせた際のリダイレクト処理の注意点
kenichirokimura
1
520
競技としてのKaggle、役に立つKaggle
yu4u
3
1.6k
エンジニア候補者向け資料2024.04.24.pdf
macloud
0
3.3k
Building Dashboards as a Hobby
egmc
0
220
アクセシビリティを考慮したUI/CSSフレームワーク・ライブラリ選定
yajihum
2
1k
Featured
See All Featured
The Art of Programming - Codeland 2020
erikaheidi
42
12k
[RailsConf 2023] Rails as a piece of cake
palkan
23
4k
StorybookのUI Testing Handbookを読んだ
zakiyama
13
4.6k
Designing the Hi-DPI Web
ddemaree
276
33k
Rebuilding a faster, lazier Slack
samanthasiow
73
8.2k
ParisWeb 2013: Learning to Love: Crash Course in Emotional UX Design
dotmariusz
104
6.6k
Building Better People: How to give real-time feedback that sticks.
wjessup
355
18k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
14
1.6k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
2
1.3k
Bootstrapping a Software Product
garrettdimon
PRO
302
110k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
40
4.4k
10 Git Anti Patterns You Should be Aware of
lemiorhan
648
58k
Transcript
FAAS における JAVA 起動時間の比較 AWS / AZURE / GCP JJUG
CCC 2023 Spring 2023/06/04 tacck (Kihara, Takuya) JJUG CCC 2023 Spring #jjug_ccc #jjug_ccc_d 1
JJUG CCC 2023 Spring #jjug_ccc #jjug_ccc_d 2 木原 卓也 Kihara,
Takuya / @tacck 生活協同組合コープさっぽろ デジタル推進本部システム部 Amplify Japan User Group 運営メンバー ゆるWeb勉強会@札幌 主催 AWS Community Builder Since Q2 2021 / Category: Front-end Web and Mobile 好きなフィギュアスケートの技 スプレッド・イーグル
きっかけ - 前職で、 AWS Lambda に Java を採用したプロジェクトがあった。 - 依頼元の技術スタックの関係から、
Java 8 が指定されていた。 - Cold Start の遅さに遭遇。 - FaaS で Java は人類には早かったことを痛感 それから2〜3年。 - AWS Lambda SnapStart の速さに驚愕! JJUG CCC 2023 Spring #jjug_ccc #jjug_ccc_d 3
きっかけ JJUG CCC 2023 Spring #jjug_ccc #jjug_ccc_d 4 Javaユーザーグループ北海道(Java Do)での発表
Cloud上での高速化は、みんな注目しているっぽい。
きっかけ JJUG CCC 2023 Spring #jjug_ccc #jjug_ccc_d 5 タイミングよく流れてくる 寺田さんのFacebook投稿
他のクラウドプロバイダーだと、 どういう高速化方法があるんだろう? →というのをCfPで応募 →今に至る
今回お話しすること - クラウドプロバイダーごとに提供している FaaS (Function as a Service) で、 Java
を実行してみたらどのくらい時間がかかるのか? - 今回は AWS 、 Azure 、 GCP で計測。 - 各プロバイダーごとのFaaSの高速化技術によって、 それぞれどの程度の効果が得られるのか? コードや実行環境の詳細は割愛させていただきます JJUG CCC 2023 Spring #jjug_ccc #jjug_ccc_d 6
FaaS の処理概要 - 各プロバイダーとも基本的な考え方は同じ - 準備 (Cold Start でのみ必要) -
インスタンス(VM/コンテナ)起動 - ランタイム準備 - プログラムコードのロード - ファンクションの初期処理実行 - 実行 (Warm Start はここから) - ファンクションのハンドラ実行 JJUG CCC 2023 Spring #jjug_ccc #jjug_ccc_d 7
Cold Start に与える影響 - 各プロバイダーとも基本的な考え方は同じ - 準備 (Cold Start でのみ必要)
- インスタンス(VM/コンテナ)起動 - ランタイム準備 - プログラムコードのロード - ファンクションの初期処理実行 - 実行 (Warm Start はここから) - ファンクションのハンドラ実行 JJUG CCC 2023 Spring #jjug_ccc #jjug_ccc_d 8 ランタイム問わず共通 ランタイムによる プログラムによる
Java で考えると - 各プロバイダーとも基本的な考え方は同じ - 準備 (Cold Start でのみ必要) -
インスタンス(VM/コンテナ)起動 - ランタイム準備 - プログラムコードのロード - ファンクションの初期処理実行 - 実行 (Warm Start はここから) - ファンクションのハンドラ実行 JJUG CCC 2023 Spring #jjug_ccc #jjug_ccc_d 9 ここで時間がかかる • JVMの起動を伴うため • プログラム(JAR)が大きくなりがち ランタイム問わず共通 ランタイムによる プログラムによる
Cold Start の時間を減らすために - 方針は大きく二つ - 準備を早くするための仕組み (パターンA) - AWS:
SnapStart - GCP: 起動時の CPU ブースト - そもそも Cold Start させない仕組み (パターンB) - AWS: Provisioned Concurrency - Azure: Functions Premium JJUG CCC 2023 Spring #jjug_ccc #jjug_ccc_d 10
確認してみる - 各サービスで、設定なし、設定あり、で測定。 - アプリケーション - Spring Cloud Function リポジトリの
Sample を利用。 - 計測方法 - Cold Start (相当)の確認では、20分ごとにアクセス、10回確認。 - Warm Start (相当)の確認では、1分ごとにアクセス、10数回アクセスし直近10回を確認。 - 実行時間の取得方法 - AWS は CloudWatch Logs の出力結果から実行時間を取得。 - Azure は Insight の出力結果から実行時間を取得。 - GCP は、ログから取得できなかったため、手元のPCから time + curl コマンドで計測。 - 計測結果の平均値で、設定の効果を確認。 プロバイダ間の計測条件が異なるので、プロバイダ間の数字の比較は行いません。 JJUG CCC 2023 Spring #jjug_ccc #jjug_ccc_d 11
パターンA 準備を早くするための仕組み - AWS: SnapStart - GCP: 起動時の CPU ブースト
JJUG CCC 2023 Spring #jjug_ccc #jjug_ccc_d 12
AWS: SnapStart JJUG CCC 2023 Spring #jjug_ccc #jjug_ccc_d 13 起動パターン
設定なし(ms) 設定あり (ms) 短縮率 Cold Start 4227.77 676.91 16.01% Warm Start 2.66 2.71 101.92% Spring Cloud Function v3.2.10 のサンプルを利用 Java 11 ランタイムを利用 その他: 追加料金無しで設定可能。 Arm64で使えないなど一部制限あるので、利用できる構成であれば利用推奨。 「初期化処理実行済み」のコンテナイメージを作成し、それを起動させることで高速化。
GCP: 起動時の CPU ブースト JJUG CCC 2023 Spring #jjug_ccc #jjug_ccc_d
14 起動パターン 設定なし(ms) 設定あり (ms) 短縮率 Cold Start 15646.40 2646.80 16.92% Warm Start 157.00 151.90 96.75% Spring Cloud Function v4.0.2 のサンプルを利用 Java 17 ランタイムを利用 その他: 費用は追加となる可能性があるが、今回のテストで試した程度では体感できなかった。 (CPUリソースを5個分割り当てて起動時間が1/5になるなら、実質料金が変わらない?) 設定はデフォルトでONになっている。 Cold Start 中のCPU割り当てを、設定以上に自動で割り当てることで高速化。
パターンB そもそも Cold Start させない仕組み - AWS: Provisioned Concurrency -
Azure: Functions Premium JJUG CCC 2023 Spring #jjug_ccc #jjug_ccc_d 15
AWS: Provisioned Concurrency JJUG CCC 2023 Spring #jjug_ccc #jjug_ccc_d 16
起動パターン 設定なし(ms) 設定あり (ms) 短縮率 Cold Start 4227.77 129.48 3.06% Warm Start 2.66 2.68 100.75% Spring Cloud Function v3.2.10 のサンプルを利用 Java 11 ランタイムを利用 その他: 設定中に、月で+$7目安とコンソール上表示される。 設定ありの場合に、ログには準備実行が記録されても、 呼び出し側には待ち時間としては現れなかった。 動き続けるコンテナが切り替わりながら維持されているように見える。 同時実行数を予約(provisioned)して、事前リソースを確保することで高速化を実現。
Azure: Functions Premium JJUG CCC 2023 Spring #jjug_ccc #jjug_ccc_d 17
起動パターン 設定なし(ms) 設定あり (ms) 短縮率 Cold Start 2740.00 34.13 1.25% Warm Start 63.88 38.77 60.69% Spring Cloud Function v4.0.2 のサンプルを利用 Java 17 ランタイムを利用 その他: 常時コンテナが稼働するため、効果は高いが費用も高くなる可能性がある。 常時コンテナを稼働することで、高速化を実現。
全体比較 JJUG CCC 2023 Spring #jjug_ccc #jjug_ccc_d 18 パターン プロバイダー
Java 起動パターン 設定なし(ms) 設定あり (ms) 短縮率 A 準備時間 短縮 AWS SnapStart 11 Cold Start 4227.77 676.91 16.01% Warm Start 2.66 2.71 101.92% GCP 起動時の CPU ブースト 17 Cold Start 15646.40 2646.80 16.92% Warm Start 157.00 151.90 96.75% B Cold Start なくす AWS Provisioned Concurrency 11 Cold Start 4227.77 129.48 3.06% Warm Start 2.66 2.68 100.75% Azure Functions Premium 17 Cold Start 2740.00 34.13 1.25% Warm Start 63.88 38.77 60.69%
まとめ - 各プロバイダーごとに手法がそれぞれあり、 いずれも高い効果が確認できた。 - 特に「Cold Start をなくす」パターンは劇的な改善。 - 今回はシンプルなアクセス方法での計測。
ある程度負荷を与える形で計測した場合に、待ち時間のパーセンタイルが どのようにでてくるかも、今後確認してみた。 JJUG CCC 2023 Spring #jjug_ccc #jjug_ccc_d 19
END JJUG CCC 2023 Spring #jjug_ccc #jjug_ccc_d 20