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.4k
[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
190
至極の難問言語仕様クイズ 〜最強のマルチリンガル決定戦〜
orekyuu
2
2.2k
burikaigi2021 Rails製ECサイトの決済速度を上げろ!〜決済処理チューニングの記録〜
orekyuu
3
1.7k
実際困る!クロスドメイン間のセッション管理を考えよう
orekyuu
1
930
pixiv PAYで運用している フレンズパターン
orekyuu
1
3.6k
日本初のキャッシュレス即売会を支えた決済アプリ pixiv PAYの技術
orekyuu
1
1.7k
Other Decks in Programming
See All in Programming
Go Conference mini in Sendai 2026 : Goに新機能を提案し実装されるまでのフロー徹底解説
yamatoya
0
520
AIとペアプロして処理時間を97%削減した話 #pyconshizu
kashewnuts
1
210
JPUG勉強会 OSSデータベースの内部構造を理解しよう
oga5
2
240
AIコーディングの理想と現実 2026 | AI Coding: Expectations vs. Reality 2026
tomohisa
0
1.1k
社内規程RAGの精度を73.3% → 100%に改善した話
oharu121
13
7.6k
2026年は Rust 置き換えが流行る! / 20260220-niigata-5min-tech
girigiribauer
0
220
猫の手も借りたい!ので AIエージェント猫を作って社内に放した話 Claude Code × Container Lambda の Slack Bot "DevNeko"
naramomi7
0
250
AWS Infrastructure as Code の新機能 2025 総まとめ 〜SA 4人による怒涛のデモ祭り〜
konokenj
10
3.2k
maplibre-gl-layers - 地図に移動体たくさん表示したい
kekyo
PRO
0
200
AHC061解説
shun_pi
0
340
AI主導でFastAPIのWebサービスを作るときに 人間が構造化すべき境界線
okajun35
0
590
PJのドキュメントを全部Git管理にしたら、一番喜んだのはAIだった
nanaism
0
240
Featured
See All Featured
Un-Boring Meetings
codingconduct
0
220
How to make the Groovebox
asonas
2
2k
GraphQLの誤解/rethinking-graphql
sonatard
75
11k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
260
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
0
220
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
140
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.9k
エンジニアに許された特別な時間の終わり
watany
106
240k
Documentation Writing (for coders)
carmenintech
77
5.3k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
290
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
0
230
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
470
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のコードを読むのは怖くない!みんな読もう!