Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Java's OOM and k8s' OOM 遭遇した2つのOOMと対策 ~ Launcha...

Avatar for Konboi Konboi
June 09, 2025
56

Java's OOM and k8s' OOM 遭遇した2つのOOMと対策 ~ Launchableでの事例 ~ / JJUG 2025 Spring

Avatar for Konboi

Konboi

June 09, 2025
Tweet

More Decks by Konboi

Transcript

  1. 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
  2. Confidential. ©2025 CloudBees, Inc. All Rights Reserved. アジェンダ • 運用しているサービスの紹介

    • Java's OOM Part ◦ 発生した事象について ◦ どのように対応したか • k8s' OOM Part ◦ 発生した事象について ◦ k8s の Resource - RequestsとLimitについて ◦ HeapとOff Heap ◦ どのように対応したか • まとめ
  3. Confidential. ©2025 CloudBees, Inc. All Rights Reserved. 運用しているサービスの紹介 • テストの結果を集め

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

    Predictive Test Selection - 効率的なテストの実施をサポート ◦ テストのリストを受け取り失敗しやすいテストリストを返す ◦ 数MB ~ 数百MBの機械学習モデルを使用した処理 ◦ Memory Heavy な処理 ▪ リストのサイズによっても CPUもHeavy • 特性の異なる処理を 1つのアプリケーションで処理
  5. Confidential. ©2025 CloudBees, Inc. All Rights Reserved. あらまし • テスト結果収集簡略化のため

    Jenkins Plugin の新規開発 ◦ 通常はCLIをセットアップし利用してもらう • Plugin をインストールするだけでテスト結果を送信できるように
  6. Confidential. ©2025 CloudBees, Inc. All Rights Reserved. あらまし • リリース前に社内でドッグフーディング

    • 社内のJenkins CI サーバー のプロジェクトにテスト導入 ◦ 直列実行だと約50時間 ◦ テストケース数は 3万件以上 • 結果... ◦ Java の OOM ◦ k8s の OOM
  7. Confidential. ©2025 CloudBees, Inc. All Rights Reserved. 発生した事象 - Java

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

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

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

    part • 該当箇所をストリームで処理するように修正 • OOM 時に heap dump を取るように変更 ◦ XXHeapDumpPath=/foo/bar/
  11. Confidential. ©2025 CloudBees, Inc. All Rights Reserved. まとめ - Java

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

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

    part • 調査してみると OOM Kill されていた • ただ heap dump file は作成されず ◦ なぜ...? 🤔 • 何が原因か手がかりが得られず
  14. Confidential. ©2025 CloudBees, Inc. All Rights Reserved. k8s の Resource

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

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

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

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

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

    Heap と Off Heap • Heap ◦ JVMに割り当てられるメモリ ◦ Java Object は Heap領域 に生成される ◦ GC の対象 • Off Heap ◦ ヒープ外に割り当てられるメモリ ◦ GC の対象外 ◦ 大規模なデータ処理に使われる
  20. 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 によってまちまち
  21. Confidential. ©2025 CloudBees, Inc. All Rights Reserved. 発生した事象 - k8s

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

    Part • Resource / Limit の サイズを見直し • メモリ使用量の監視強化 • スケーリング戦略の調整 • JVMの監視もしたいけど後回しに ...)
  23. Confidential. ©2025 CloudBees, Inc. All Rights Reserved. まとめ • Java

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

    AI & ML Engineer を募集しています • 日本から世界と戦いませんか? • 気になったら気軽に DMください!!
  25. 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
  26. 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
  27. 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
  28. 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
  29. Confidential. ©2025 CloudBees, Inc. All Rights Reserved. おまけ • リリース前のテスト大事

    • バグで色々大変だったけどこうやって JVM x k8s についての知見が増えた