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
2k
[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
2k
burikaigi2021 Rails製ECサイトの決済速度を上げろ!〜決済処理チューニングの記録〜
orekyuu
3
1.6k
実際困る!クロスドメイン間のセッション管理を考えよう
orekyuu
1
810
pixiv PAYで運用している フレンズパターン
orekyuu
1
3.4k
日本初のキャッシュレス即売会を支えた決済アプリ pixiv PAYの技術
orekyuu
1
1.5k
Other Decks in Programming
See All in Programming
Beyond ORM
77web
11
1.6k
PSR-15 はあなたのための ものではない? - phpcon2024
myamagishi
0
410
Rubyでつくるパケットキャプチャツール
ydah
0
170
Androidアプリの One Experience リリース
nein37
0
1.2k
Androidアプリのモジュール分割における:x:commonを考える
okuzawats
1
280
Simple組み合わせ村から大都会Railsにやってきた俺は / Coming to Rails from the Simple
moznion
3
2.1k
Stackless и stackful? Корутины и асинхронность в Go
lamodatech
0
1.3k
PHPで学ぶプログラミングの教訓 / Lessons in Programming Learned through PHP
nrslib
4
1.1k
Lookerは可視化だけじゃない。UIコンポーネントもあるんだ!
ymd65536
1
130
PHPUnitしか使ってこなかった 一般PHPerがPestに乗り換えた実録
mashirou1234
0
420
ある日突然あなたが管理しているサーバーにDDoSが来たらどうなるでしょう?知ってるようで何も知らなかったDDoS攻撃と対策 #phpcon.2024
akase244
2
7.7k
PHPとAPI Platformで作る本格的なWeb APIアプリケーション(入門編) / phpcon 2024 Intro to API Platform
ttskch
0
390
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.4k
It's Worth the Effort
3n
183
28k
Visualization
eitanlees
146
15k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
28
9.2k
GitHub's CSS Performance
jonrohan
1030
460k
Done Done
chrislema
182
16k
Designing for Performance
lara
604
68k
Making Projects Easy
brettharned
116
6k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
How to Think Like a Performance Engineer
csswizardry
22
1.3k
For a Future-Friendly Web
brad_frost
176
9.5k
Statistics for Hackers
jakevdp
797
220k
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のコードを読むのは怖くない!みんな読もう!