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
2024年のkintone API振り返りと2025年 / kintone API look back in 2024
tasshi
0
220
『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya
o0h
PRO
2
260
Spring gRPC について / About Spring gRPC
mackey0225
0
220
WebDriver BiDiとは何なのか
yotahada3
1
140
GitHub Actions × RAGでコードレビューの検証の結果
sho_000
0
270
2024年のWebフロントエンドのふりかえりと2025年
sakito
3
250
メンテが命: PHPフレームワークのコンテナ化とアップグレード戦略
shunta27
0
120
Lottieアニメーションをカスタマイズしてみた
tahia910
0
130
Formの複雑さに立ち向かう
bmthd
1
850
SpringBoot3.4の構造化ログ #kanjava
irof
2
1k
ソフトウェアエンジニアの成長
masuda220
PRO
10
1.2k
AIの力でお手軽Chrome拡張機能作り
taiseiue
0
170
Featured
See All Featured
Code Review Best Practice
trishagee
67
18k
Optimizing for Happiness
mojombo
376
70k
The Pragmatic Product Professional
lauravandoore
32
6.4k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
GraphQLの誤解/rethinking-graphql
sonatard
68
10k
Fontdeck: Realign not Redesign
paulrobertlloyd
83
5.4k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
12
960
How GitHub (no longer) Works
holman
314
140k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
10
1.3k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
7
630
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.5k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.2k
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のコードを読むのは怖くない!みんな読もう!