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を認識するまで 〜正しく認識されないCPUの謎を追え〜
Search
orekyuu
November 27, 2022
Programming
1
1.8k
[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
140
至極の難問言語仕様クイズ 〜最強のマルチリンガル決定戦〜
orekyuu
2
2k
burikaigi2021 Rails製ECサイトの決済速度を上げろ!〜決済処理チューニングの記録〜
orekyuu
3
1.5k
実際困る!クロスドメイン間のセッション管理を考えよう
orekyuu
1
730
pixiv PAYで運用している フレンズパターン
orekyuu
1
3.2k
日本初のキャッシュレス即売会を支えた決済アプリ pixiv PAYの技術
orekyuu
1
1.3k
Other Decks in Programming
See All in Programming
Async Await: Mastering Python's Time-Bending Tricks - EuroPython2024
yanbo
1
290
Ruby メモリ管理 プログラミング
megmogmog1965
0
130
Rubyのパフォーマンスプロファイリングの改善 / Enhancing performance profiling for Ruby
osyoyu
1
410
feature環境をGitHub ActionsとCloudFormationでいい感じに管理する
nealle
2
310
GraphQL はいいぞ! ~Laravel で学ぶ GraphQL 入門~
azuki
1
160
HMSコンペ 11th Solution (team : kansai-kaggler)
t88
1
680
Microservices rules (July 2024) : what good looks like
cer
PRO
0
1.6k
DynamoDB コスト最適化っぽいことの基本 with Terraform
kuro_kurorrr
2
250
Prompt FlowによるLLMアプリケーション開発
yuto2000
1
1k
ぼっちを避けて楽しむためのアノテコノテ / Various Tips and Tricks to Avoid Loneliness and Have Fun
nrslib
3
1.7k
Advanced App Shrinking Techniques
cbeyls
2
150
3 Effective Rules for Success with Signals in Angular
manfredsteyer
PRO
0
120
Featured
See All Featured
The Straight Up "How To Draw Better" Workshop
denniskardys
229
130k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
149
45k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
36
9.1k
How to train your dragon (web standard)
notwaldorf
79
5.5k
Fashionably flexible responsive web design (full day workshop)
malarkey
399
65k
The Illustrated Children's Guide to Kubernetes
chrisshort
39
47k
Art, The Web, and Tiny UX
lynnandtonic
291
20k
Put a Button on it: Removing Barriers to Going Fast.
kastner
58
3.3k
Six Lessons from altMBA
skipperchong
24
3.2k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
78
15k
Infographics Made Easy
chrislema
238
18k
The Brand Is Dead. Long Live the Brand.
mthomps
52
36k
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のコードを読むのは怖くない!みんな読もう!