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
[JJUG CCC 2022 fall] Fargate上のJVMからCPUを認識するまで 〜...
Search
orekyuu
November 27, 2022
Programming
1
2.1k
[JJUG CCC 2022 fall] Fargate上のJVMからCPUを認識するまで 〜正しく認識されないCPUの謎を追え〜
orekyuu
November 27, 2022
Tweet
Share
More Decks by orekyuu
See All by orekyuu
OpenJDKアンカンファレンス 2022-09
orekyuu
0
150
至極の難問言語仕様クイズ 〜最強のマルチリンガル決定戦〜
orekyuu
2
2.1k
burikaigi2021 Rails製ECサイトの決済速度を上げろ!〜決済処理チューニングの記録〜
orekyuu
3
1.6k
実際困る!クロスドメイン間のセッション管理を考えよう
orekyuu
1
830
pixiv PAYで運用している フレンズパターン
orekyuu
1
3.4k
日本初のキャッシュレス即売会を支えた決済アプリ pixiv PAYの技術
orekyuu
1
1.5k
Other Decks in Programming
See All in Programming
もう僕は OpenAPI を書きたくない
sgash708
6
1.9k
PHPのバージョンアップ時にも役立ったAST
matsuo_atsushi
0
230
15分で学ぶDuckDBの可愛い使い方 DuckDBの最近の更新
notrogue
3
750
Bedrock Agentsレスポンス解析によるAgentのOps
licux
3
930
コミュニティ駆動 AWS CDK ライブラリ「Open Constructs Library」 / community-cdk-library
gotok365
2
250
第3回関東Kaggler会_AtCoderはKaggleの役に立つ
chettub
3
1.2k
Serverless Rust: Your Low-Risk Entry Point to Rust in Production (and the benefits are huge)
lmammino
1
160
機能が複雑化しても 頼りになる FactoryBotの話
tamikof
1
220
「個人開発マネタイズ大全」が教えてくれたこと
bani24884
1
270
楽しく向き合う例外対応
okutsu
0
710
AIプログラミング雑キャッチアップ
yuheinakasaka
19
4.9k
ナレッジイネイブリングにAIを活用してみる ゆるSRE勉強会 #9
nealle
0
160
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
11
1.3k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.1k
What's in a price? How to price your products and services
michaelherold
244
12k
Building Flexible Design Systems
yeseniaperezcruz
328
38k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
193
16k
A Tale of Four Properties
chriscoyier
158
23k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Typedesign – Prime Four
hannesfritz
41
2.5k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
45
9.4k
Transcript
Fargate上のJVMからCPUを認識するまで 〜正しく認識されないCPUの謎を追え〜 金川 祐太郎 株式会社ディー・エヌ・エー
2 自己紹介 金川 祐太郎 • 所属: 株式会社ディー・エヌ・エー • twitter: @orekyuu
• 最近の悩み: コロナ禍に入ってから太ってしまった 久しぶりに登壇で顔を出したらTwitterで「顔のアス比かわったね」
3 本日のゴール • 今回の事例を例に、JVMがどのようにCPU数を認識しているかを知る 非ゴール: ECSでJavaアプリケーションを使うためのコツや知見 OpenJDKのコードを読むためのきっかけになれば幸いです
事例の紹介
5 環境の紹介 1 • Quarkus: 2.9.2 • JDK: amazon corretto
17 • quarkus-container-image-jibでビルドしたimageをECS fargateへdeploy
6 GCのアルゴリズムを指定せず動かすとSerial GCになっている 2 • 負荷試験でJFRの記録をとったところ、 SerialGCが使われていることが分かった • ECS Taskのcpuの指定は2048になっていて、
G1 GCが使われるはず
7 目次 OpenJDKのGCに関する登場人物 OpenJDKが使うGC選択の流れ AvailableProcessorsの検出の流れ 1 2 3
8 OpenJDKのGCに関する登場人物
9 OpenJDKのディレクトリの構造 • src/hotspot以下にosやcpuアーキテクチャ毎の 実装が書かれており、shareは共通の実装 • share以下は機能ごとにディレクトリが 掘られている 1
10 登場人物 1 Arguments GCConfig GCArguments SerialArguments SerialArguments initialize GCの決定
GCアルゴリズムごとの引数 GCアルゴリズムごとにサブクラスを持つ CollectedHeap createHeap
11 登場人物 1 Arguments GCConfig GCArguments SerialArguments SerialArguments initialize GCの決定
GCアルゴリズムごとの引数 GCアルゴリズムごとにサブクラスを持つ CollectedHeap createHeap
12 OpenJDKが使うGC選択の流れ
13 GCアルゴリズムの決定 1
14 GCアルゴリズムの決定 1
15 GCアルゴリズムの決定 1 起動オプションでGCが 明示的に指定されていない
16 GCアルゴリズムの決定 1 サーバークラスマシンなら G1GC そうでないならSerialGCを選んでいる
17 GCアルゴリズムの決定 1 active_processor_countが2以上 physical_memoryが約2GB以上 右辺の変数は直前で宣言している
18 jcmd VM.infoしてみる 2 initial active 1 になっている?
AvailableProcessorsの検出の流れ
20 active_processor_countの取得 1 os::active_processor_countはosごとに 実装が異なる 今回のイメージでは linuxの実装になる
21 active_processor_countの取得 1 -XX:ActiveProcessorCountが 指定されている場合
22 active_processor_countの取得 1 コンテナのときはこちらの処理に入る
※ここから2022/08頃のコードです OpenJDKのmasterを見ていましたが、変更が入って処理の内容が変わっているためです
24 active_processor_countの取得 1 CgroupSubsystemとは?
25 寄り道: cgroups 1 • linuxの機能で、プロセスの利用するリソースに制限をかけるもの • dockerではcgroupsを活用しているらしく、コンテナ対応のコードでcgroups の名前が出てきた
26 active_processor_countの取得 1 どうやらDockerコンテナのサポート っぽい
27 active_processor_countの取得 1 share / 1024がshare_countになる
28 active_processor_countの取得 1 最終的にcpu_countとlimit_countの 小さい値がactive_processor_count
29 active_processor_countの取得 1 これらのログを確認したい
30 ログの確認 2 • -Xlogオプションを使う ◦ 今回の場合はjava -Xlog:os+container=trace -versionを ECSのコンテナ内で実行して検証
31 ログの確認 2 CPU Sharesが2になっている?
32 active_processor_countの取得 1 share / 1024がshare_countになる
33 原因を知る 3 • 「詳解: Amazon ECS による CPU とメモリのリソース管理」という記事を読
む
34 原因を知る 3 コンテナにCPUユニットを設定しない場合、 2を設定します
35 原因を知る 3 • ECSにはTask DefinitionとContainer Definitionの両方にCPUの制限をつけられ る • JVMが見ているのはContainer
DefinitionのCPU制限で、指定をしない場合は2 になる
36 まとめ 3 • ECSにはTask DefinitionとContainer Definitionの両方にCPU制限があり、JVM が見るのはContainerの方なので必ず宣言しよう • GCは明示的に指定しない場合、意図しないGCになる場合があるので明示的
に宣言しておくと安心 • -Xlogオプションでログを出力できるので、デバッグする際には活用 してみよう • JDKのコードを読むのは怖くない!みんな読もう!