Slide 1

Slide 1 text

Java's OOM and k8s' OOM 遭遇した2つのOOMと対策 ~ Launchableでの事例 ~ 2025.06.07 Presented by Ryosuke Yabuki a.k.a Konboi

Slide 2

Slide 2 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. 自己紹介 ● 矢吹遼介 a.k.a Konboi ● CloudBees, Inc. ○ ex.Launchable - 昨年7月に買収されました ● Sr. Software Engineer ● JJUG初参加 & 初登壇 ● SNS ○ blog: https://blog.konboi.com ○ GitHub/X(twitter)/Bluesky: Konboi

Slide 3

Slide 3 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. アジェンダ ● 運用しているサービスの紹介 ● Java's OOM Part ○ 発生した事象について ○ どのように対応したか ● k8s' OOM Part ○ 発生した事象について ○ k8s の Resource - RequestsとLimitについて ○ HeapとOff Heap ○ どのように対応したか ● まとめ

Slide 4

Slide 4 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. 運用しているサービスの紹介 ● テストの結果を集め AIを使ってテストにまつわる困り事を助けるサービス ● Case: テスト結果の収集 ○ 数百 ~ 数百万のテスト結果を受け取り保存 ○ CPU Heavy な処理が多い

Slide 5

Slide 5 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. 運用しているサービスの紹介 ● Case: Predictive Test Selection - 効率的なテストの実施をサポート ○ テストのリストを受け取り失敗しやすいテストリストを返す ○ 数MB ~ 数百MBの機械学習モデルを使用した処理 ○ Memory Heavy な処理 ■ リストのサイズによっても CPUもHeavy ● 特性の異なる処理を 1つのアプリケーションで処理

Slide 6

Slide 6 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. あらまし Java / k8s の OOMが起きるまで...

Slide 7

Slide 7 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. あらまし ● テスト結果収集簡略化のため Jenkins Plugin の新規開発 ○ 通常はCLIをセットアップし利用してもらう ● Plugin をインストールするだけでテスト結果を送信できるように

Slide 8

Slide 8 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. あらまし ● リリース前に社内でドッグフーディング ● 社内のJenkins CI サーバー のプロジェクトにテスト導入 ○ 直列実行だと約50時間 ○ テストケース数は 3万件以上 ● 結果... ○ Java の OOM ○ k8s の OOM

Slide 9

Slide 9 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. Java Part

Slide 10

Slide 10 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. 発生した事象 - Java part ● 社内CIサーバーにプラグインをインストール後 ● 複数の 5xx エラーを観測 ● Sentryで原因が OOM なのを確認

Slide 11

Slide 11 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. 原因 - Java part ● 送られてきたテスト結果を一時的に全てメモリーにロード ● 想定よりも件数/サイズが多くメモリに乗り切らず OOM が発生

Slide 12

Slide 12 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. 原因 - Java part ● 送られてきたテスト結果を一時的に全てメモリーにロード ● 想定よりもサイズが多くメモリに乗り切らず OOM が発生 󰢃

Slide 13

Slide 13 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. どのように対応したか - Java part ● 該当箇所をストリームで処理するように修正 ● OOM 時に heap dump を取るように変更 ○ XXHeapDumpPath=/foo/bar/

Slide 14

Slide 14 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. まとめ - Java part ● 一気にメモリに載せるような処理は避けましょう ○ 意図せずそうなってしまう場合も ○ 想定よりもデータのサイズが大きいことも ありますよね... ● heap dump をとるようにしましょう ○ 今回は原因がすぐに判明したが ... ○ ⚠ dump file はサイズが大きくなりがち。 disk space に注意

Slide 15

Slide 15 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. Kubernetes Part

Slide 16

Slide 16 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. 発生した事象 - k8s part ● Java側の修正を反映後 頻繁にPodが再起動するように ...

Slide 17

Slide 17 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. 発生した事象 - k8s part ● 調査してみると OOM Kill されていた ● ただ heap dump file は作成されず ○ なぜ...? 🤔 ● 何が原因か手がかりが得られず

Slide 18

Slide 18 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests / Limits

Slide 19

Slide 19 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits

Slide 20

Slide 20 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits

Slide 21

Slide 21 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits

Slide 22

Slide 22 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits

Slide 23

Slide 23 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits ● Requests: ○ Podを動かすための必要なリソース ○ Nodeのリソースとrequests を見比べてPodの配置を決める ● Limits: ○ Podが使っていいリソースの上限 ○ 超過すると... ■ CPUは制限される ■ メモリは OOM で Kill される

Slide 24

Slide 24 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits ● Requests: ○ Podを動かすための必要なリソース ○ Nodeのリソースとrequests を見比べてPodの配置を決める ● Limits: ○ Podが使っていいリソースの上限 ○ 超過すると... ■ CPUは制限される ■ メモリは OOM で Kill される

Slide 25

Slide 25 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits ● Requests: ○ Podを動かすための必要なリソース ○ Nodeのリソースとrequests を見比べてPodの配置を決める ● Limits: ○ Podが使っていいリソースの上限 ○ 超過すると... ■ CPUは制限される ■ メモリは OOM で Kill される

Slide 26

Slide 26 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. Java側と思っていたが...

Slide 27

Slide 27 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits

Slide 28

Slide 28 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits OOM

Slide 29

Slide 29 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits Restart

Slide 30

Slide 30 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s側で発生していた

Slide 31

Slide 31 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits

Slide 32

Slide 32 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits

Slide 33

Slide 33 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits

Slide 34

Slide 34 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits

Slide 35

Slide 35 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits

Slide 36

Slide 36 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits

Slide 37

Slide 37 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits

Slide 38

Slide 38 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits OOM Kill

Slide 39

Slide 39 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits

Slide 40

Slide 40 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits

Slide 41

Slide 41 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource および Requests/Limits

Slide 42

Slide 42 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. 発生した事象 - k8s part ● よくよくMessageを見てみると... ● Pod は OOM で Kill され 再起動していた ● “OOMˮ だから Java 側だと勘違いしていた ○ Java側の対応をしたばかりというのもあり ...) ● k8s 側の OOM だから heap dump file が無いのは当たり前

Slide 43

Slide 43 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. 発生した事象 - k8s part ● でも、何故 limits を指定してるのに こんなにメモリが使われているんだ ...? 🤔 ● 8178740Ki → 約8GB ● JVM の オプションで Xmx 5G と最大ヒープサイズを指定している

Slide 44

Slide 44 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. Java JVM の Heap と Off Heap

Slide 45

Slide 45 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. Java JVM の Heap と Off Heap ● Heap ○ JVMに割り当てられるメモリ ○ Java Object は Heap領域 に生成される ○ GC の対象 ● Off Heap ○ ヒープ外に割り当てられるメモリ ○ GC の対象外 ○ 大規模なデータ処理に使われる

Slide 46

Slide 46 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. Java JVM の Heap と Off Heap ● Off Heap の利用サイズを指定できるオプションもある ● が、デフォルトでは Heap Size を基準に決まるものも ● e.g.) XXMaxDirectMemorySize ○ ~ Java 8: heap size の 87.5% ○ Java 11 heap size と 同サイズ ■ OpenJ9 の場合 ● JVM の Option によってまちまち

Slide 47

Slide 47 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. 発生した事象 - k8s Part ● 処理するデータサイズが増 ● Off Heap が今まで以上に使われるようになった ● Heap サイズ + Off Heap サイズ > k8sʼ Limits ○ 10 (= 5  5 > 6 ● k8s の OOMKilled が頻発

Slide 48

Slide 48 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. どのように対応したか - k8s Part ● Resource / Limit の サイズを見直し ● メモリ使用量の監視強化 ● スケーリング戦略の調整 ● JVMの監視もしたいけど後回しに ...)

Slide 49

Slide 49 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. まとめ ● Java と k8s 2 つの OOM について Launchable で起きた事例紹介 ● k8s の Resource および Requests / Limits ● Heap と Off Heap ● k8s 環境における Java アプリケーション の メモリ管理の難しさ

Slide 50

Slide 50 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. Weʼre Hiring ● AI & ML Engineer を募集しています ● 日本から世界と戦いませんか? ● 気になったら気軽に DMください!!

Slide 51

Slide 51 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. おまけ ● 問題は解決したが調査したところ Jenkins Plugin にバグがあった ● 既に送った結果も重複して送っていた Workflow 1-1 Workflow 1-2 Workflow 1-3 Workflow 2-1 Workflow 2-2 Workeflow 2-3

Slide 52

Slide 52 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. おまけ ● 問題は解決したが調査したところ Jenkins Plugin にバグがあった ● 既に送った結果も重複して送っていた Workflow 1-1 Workflow 1-2 Workflow 1-3 Workflow 2-1 Workflow 2-2 Workeflow 2-3 Send

Slide 53

Slide 53 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. おまけ ● 問題は解決したが調査したところ Jenkins Plugin にバグがあった ● 既に送った結果も重複して送っていた Workflow 1-1 Workflow 1-2 Workflow 1-3 Workflow 2-1 Workflow 2-2 Workeflow 2-3 Send Send

Slide 54

Slide 54 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. おまけ ● 問題は解決したが調査したところ Jenkins Plugin にバグがあった ● 既に送った結果も重複して送っていた Workflow 1-1 Workflow 1-2 Workflow 1-3 Workflow 2-1 Workflow 2-2 Workeflow 2-3 Send Send Send

Slide 55

Slide 55 text

Confidential. ©2025 CloudBees, Inc. All Rights Reserved. おまけ ● リリース前のテスト大事 ● バグで色々大変だったけどこうやって JVM x k8s についての知見が増えた