Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

コンテナ環境でのJavaトラブルシューティング

 コンテナ環境でのJavaトラブルシューティング

JJUG CCC 2023 Fall

Kenji Kazumura

November 11, 2023
Tweet

More Decks by Kenji Kazumura

Other Decks in Technology

Transcript

  1. © 2023 Fujitsu Limited 自己紹介 Jakarta EE 仕様策定委員 MicroProfile ステコミ委員

    JCP Executive Committee メンバー Eclipse Foundation ボードディレクター EclipseCon、 JakartaOne、JJUGなどで登壇 3
  2. 5 コンテナ利用の動機 パッケージング ⚫ 依存するものをすべてパッケージング ポータビリティ ⚫ どのプラットフォームでも、開発環境と運用環境 軽量 (lightweight)

    ⚫ VMよりは起動が速い 独立性 (isolation) ⚫ 効率的にスケール可能 ・・・ トラブルシューティングやセキュリティの動機はない © 2023 Fujitsu Limited
  3. 8 コンテナイメージ 小サイズ化 の動機 起動時間短縮 ⚫ ダウンタイムの縮小 ⚫ スケールアウト時間の短縮 セキュリティ向上

    ⚫ 必要最小限の構成で、脆弱性が入り込む余地を 小さくする 依然、トラブルシューティングの動機はない © 2023 Fujitsu Limited
  4. 13 Javaのコンテナイメージを小さくする方法 © 2023 Fujitsu Limited distroless ベースイメージ を小さくする Java版もあり

    jlink アプリケーション に必要な モジュールのみ パッケージ JRE JDKに含まれる ツール類がなくなる (jshell/jarコマンドなど) jfrは含まれる
  5. Java機能に関する調査はできない 15 JRE © 2023 Fujitsu Limited JREにはJDKに含まれる、ほぼすべてのツールが含まれない jcmd /

    jstack / jar / javac / jdb / javadoc / ・・・ JREに含まれないツール JREに含まれるツール java / keytool / rmiregistry / jfr / ・・・
  6. 16 Javaコンテナのジレンマ © 2023 Fujitsu Limited 実現手段 起動時間 セキュリティ トラシュー

    小イメージ化 相性が悪い JDKツール、OSトラシューツールが使えない
  7. iノードで管理 8個のnamespaceでプロセスを分離 ⚫ cgroup/net/ipc/uts/user/pid/time/mnt ⚫ それぞれを共有する・しないことで、 コンテナの柔軟な独立性を実現 namespace 関連コマンド 例

    ⚫ lsns ⚫ nsenter ⚫ ・・・ `docker exec` コマンドは、namespaceの変更 ⚫ `nsenter --target ${PID} --all` と同等 22 Linux の namespace © 2023 Fujitsu Limited
  8. 24 ノードからコンテナにアクセス © 2023 Fujitsu Limited コンテナ内のプロセスは、 ホスト・ノードのプロセスとしても 見える。ただし、PIDは違う どのプロセスがどのコンテナの

    ものかは一見では分からない ホスト・ノードにアクセス可能 なら、この方法でもよいが。。。 コンテナ視点 (ネットワーク設定など)での トラシューは難しいかも ホスト・ノード コンテナ JDK jstackなど Java アプリ
  9. 25 ノード上でデバッグコンテナ作成 © 2023 Fujitsu Limited K8Sノードでホストのnamespaceで動作するコンテナ kubectl debug node/{ノード名}

    -it \ --image={イメージ} -- bash Pod コンテナ コンテナ Java アプリ Pod ノード jstackなど ノードの namespaceで動作
  10. Podのnamespace共有 © 2023 Fujitsu Limited Pod 26 コンテナ1 pid mnt

    共有 共有 プロセスへのアクセス不可 コンテナ2 pid mnt uts net 共有 共有
  11. サイドカーでのnamespace共有 © 2023 Fujitsu Limited Pod 28 コンテナ アプリ(JRE) mnt

    プロセスへのアクセス可能 mnt コンテナ デバッガ(JDK) pid 共有 共有 uts net 共有 共有 shareprocess
  12. 29 サイドカー © 2023 Fujitsu Limited Pod内にトラシュー用のイメージを サイドカーとして実行しておく ⚫ pod定義で、以下を指定

    spec.shareProcessNamespace:true アプリのコンテナイメージにトラシューツール が入れる必要はなくなるが、トラブルがなくても 常に起動されるのでリソースの無駄 ⚫ 開発時など、最初からトラブルが発生することが 分かっていれば有用
  13. コピーによるnamespace共有 © 2023 Fujitsu Limited Pod 31 プロセスへのアクセス可能 Pod net

    コピー Pod net uts コンテナ デバッガ(JDK) コンテナ net uts アプリ(JRE) コンテナ アプリ(JRE) コンテナ pid アプリ(JRE) mnt pid mnt mnt pid uts mnt shareprocess
  14. エフェメラルコンテナによる共有 © 2023 Fujitsu Limited Pod 34 プロセスへのアクセス可能 Pod net

    uts mnt コンテナ net uts mnt アプリ(JRE) エフェメラル コンテナ デバッガ(JDK) コンテナ mnt アプリ(JRE) pid 追加 pid
  15. 35 エフェメラルコンテナ © 2023 Fujitsu Limited トラシュー対象コンテナと、namespaceが 共通なコンテナを既存Podに追加 dockerの場合 Kubernetesの場合

    docker run \ -it --name=debugger --pid=container:jre \ jdk-image bash kubectl debug -it -c debugger --target debuggee \ --image=jdk-image debuggee -- bash
  16. 36 トラブルシューティング方法比較 © 2023 Fujitsu Limited 長所 短所 ノードからコンテナに アクセス

    N/A ホスト権限が必要 コンテナ視点の欠如 docker exec 手軽 トラシューツールが 使えない場合あり サイドカー トラシューツール用コンテナ とアプリ用コンテナが分離 リソースの無駄 コピー トラブル時にのみコピー可能 トラブルコンテナ そのものを対象にできない エフェメラルコンテナ トラブルコンテナにトラブル時 にのみ、アクセス可能 一度作った エフェメラルコンテナ を削除できない
  17. 39 OpenJDKのperf対応 © 2023 Fujitsu Limited JDK-8080650: Enable stubs to

    use frame pointers correctly JDK-8254723: Add diagnostic command to write Linux perf map file JDK-8316286: Add diagnostic command to write Linux perf jit dump file JDK-8314029: Add file name parameter to Compiler.perfmap JDK-8314027: Add code heap list parameter to Compiler.perfmap Fix:9 HotSpot VMのhsperfdata(UsePefData)とは関係ない Fix:16 open open open
  18. 40 perf使用手順 © 2023 Fujitsu Limited perfとJDKの入ったイメージを作成する オプションでFrameGraphを入れてもよい https://github.com/brendangregg/FlameGraph 1

    対象Javaアプリケーションは、 “-XX:+PreserveFramePointer”を指定しPodを起動しておく 2 Step1で作成したイメージを、Step2のPodに、 エフェメラルコンテナ化し追加する 3 perfコマンドで、性能情報を収集する 4 jcmdで、perf.mapを作成する 5 perfコマンドで、データ解析・表示する 6
  19. JVMのワークロードベンチマーク 手軽に起動可能 複数のテストスイート 41 ルネサンスベンチマーク © 2023 Fujitsu Limited ⚫

    https://renaissance.dev/ ⚫ https://github.com/renaissance-benchmarks/renaissance/ $ java -jar 'renaissance-gpl-0.15.0.jar' <benchmarks> ⚫ apache-spark / concurrency / database / functional /scala / web
  20. 42 デモ (Renaissance) © 2023 Fujitsu Limited Pod “rena” コンテナ

    “rena” jcmd コピー perf エフェメラルコンテナ “perf” perf report renaissance /tmp/perf-1.map perf.data /tmp/perf-1.map レポート JRE