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

コンテナ環境でのJava技術の進化

Kenji Kazumura
November 27, 2022

 コンテナ環境でのJava技術の進化

JJUG CCC Fall 2022

Kenji Kazumura

November 27, 2022
Tweet

More Decks by Kenji Kazumura

Other Decks in Technology

Transcript

  1. © 2022 Fujitsu Limited 2022/11/27 数村憲治 コンテナ環境での Java技術の進化 JJUG CCC

    Fall 2022 @kkzr
  2. 自己紹介 © 2022 Fujitsu Limited Jakarta EE 仕様策定委員 MicroProfile ステコミ委員

    JCP Executive Committee メンバー Eclipse Foundation ボードディレクター JJUG CCC、EclipseCon、JakartaOneなどで登壇 2
  3. Javaのコンテナ対応とは © 2022 Fujitsu Limited Java自身がコンテナで動作していることを認識できる 認識しないと、いろいろ不都合あり コンテナの特徴を意識した、Java機能エンハンス 起動時間、メモリフットプリント コンテナ(で有用な)機能を利用した、

    Java機能エンハンス K8S HealthCheck、CRIU・CRaC 3
  4. アジェンダ © 2022 Fujitsu Limited コンテナ認識 ネイティブ化 サマリ CRIU・CRaC 4

  5. アジェンダ © 2022 Fujitsu Limited コンテナ認識 ネイティブ化 サマリ CRIU・CRaC 5

  6. コンテナ認識 © 2022 Fujitsu Limited コンテナ上で動作するJavaプロセスは、 自身がコンテナで動作しているか意識する必要はあるか? 必要 不要 Java言語仕様

    コアライブラリ JVM ツール 6
  7. 影響ある Java API の例 © 2022 Fujitsu Limited java.lang.Runtime#availableProcessors() com.sun.management.OperatingSystemMXBean

    #availableProcessors() com.sun.management.OperatingSystemMXBean #getTotalMemorySize() ForkJoinPool#getCommonPoolParallelism() ・・・ 7
  8. エルゴノミクス機能への影響 © 2022 Fujitsu Limited Javaヒープサイズの自動設定 初期値:物理メモリの1/64 最大値:物理メモリの1/4 ForkJoinPool並行度 論理CPU数

    - 1 ざっくり言うと・・・ 8
  9. コンテナ対応修正一覧(抜粋)1/2 © 2022 Fujitsu Limited バグID 修正概要 8186248 Allow more

    flexibility in selecting Heap % of available RAM 8196007 Improve out of memory handling in containers 8146115 Improve docker container detection and resource configuration usage 8179498 attach in linux should be relative to /proc/pid/root and namespace aware 8190739 Generating Docker containers by Java Packager 8193710 jcmd -l and jps commands do not list Java processes running in Docker containers 9
  10. コンテナ対応修正一覧(抜粋)2/2 © 2022 Fujitsu Limited バグID 修正概要 8203357 Container Metrics

    8220786 Create new switch to redirect error reporting output to stdout or stder 8250627 Use -XX:+/-UseContainerSupport for enabling/disabling Java container metrics 8203359 Container level resources events 8258854 jhsdb cannot attach to Java processes running in Docker containers 8266490 Extend the OSContainer API to support the pids controller of cgroups 8281274 deal with ActiveProcessorCount in os::Linux::print_container_info 10
  11. HotSpotにおけるコンテナ検出方法 © 2022 Fujitsu Limited https://github.com/openjdk/jdk/blob/fd594302f79b934c9eca713d84313b73f4899aa3/ src/hotspot/os/linux/cgroupSubsystem_linux.cpp#L338-L349 src/hotspot/os/linux/cgroupSubsystem_linux.cpp Cgroup v1

    Cgroup v2 マウント情報からCgroup利用を検出 https://github.com/openjdk/jdk/blob/fd594302f79b934c9eca713d84313b73f4899aa3 /src/hotspot/os/linux/cgroupSubsystem_linux.cpp#L324-L326 11
  12. コンテナサポートオプション © 2022 Fujitsu Limited -XX:+UseContainerSupport -Xlog:os+container=trace メインスイッチ ※ デフォルトはオン

    ログ統合オプション 12
  13. リネーム問題 © 2022 Fujitsu Limited import java.io.File; public class Rename

    { public static void main(String ... arg) { boolean ok = new File(arg[0]).renameTo(new File(arg[1])); System.out.println(ok); } } 13
  14. OverlayFSの特徴 © 2022 Fujitsu Limited https://docs.docker.jp/v1.9/engine/userguide/storagedriver/overlayfs-driver.html rename(2)がEXDEVを返すのはLinuxの仕様通りだが・・ 14

  15. アジェンダ © 2022 Fujitsu Limited コンテナ認識 ネイティブ化 サマリ CRIU・CRaC 15

  16. コンテナ環境での性能向上期待 © 2022 Fujitsu Limited Java アプリケーション コンテナ Javaアプリケーション 数秒

    数秒 コンテナ 数秒 従来型 Javaアプリケーション 数分 コンテナ型 Javaアプリケーション 16
  17. コンパイラの歴史 © 2022 Fujitsu Limited C/C++ Java Go Python Ruby

    静的 コンパイラ インタプリタ 動的 コンパイラ 静的 コンパイラ 17
  18. 起動性能とピーク性能 © 2022 Fujitsu Limited 時間 性能 動的コンパイラ 静的コンパイラ <起動時間>

    <暖気時間> 18
  19. Javaネイティブ化技術 © 2022 Fujitsu Limited gcj 2016年9月で終了 Dalvik Android 5.0より、Android

    Runtimeに Avian 2020年くらいに終息 Excelsior JET 2019年5月EOL GraalVM Oracle Labのプロジェクト 19
  20. Project Leyden © 2022 Fujitsu Limited OpenJDKのプロジェクト • https://openjdk.org/projects/leyden/ •

    まだ、JEPにはなっていない ゴールはネイティブイメージの標準化 • ネイティブイメージ生成RIの作成 • ネイティブイメージの互換テスト作成 GrralVMとの違い • GrralVMはOracle Lab のプロジェクト • GrralVMはOpenJDKのプロジェクトではなく、標準ではない 20
  21. アジェンダ © 2022 Fujitsu Limited コンテナ認識 ネイティブ化 サマリ CRIU・CRaC 21

  22. Container Restore In Userspace (CRIU) © 2022 Fujitsu Limited Linuxのプロジェクト

    • Java特有の話ではない • WindowsやMacでは使えない チェックポイントで、状態を保存 • チェックポイント時にプロセスをいったん終了 • チェックポイント時のデータはデイスクへ保存 • 保存したデータは何回でもリストア可能 目的は15個くらい(https://criu.org/Usage_scenarios) • 主に、 コンテナのライブマイグレーションと、 起動性能向上が目的 22
  23. プロセスとスレッド CRIUでの保存対象 © 2022 Fujitsu Limited など メモリ ファイル、パイプ ソケット

    タイマー、シグナル 23
  24. CRIU使用方法 © 2022 Fujitsu Limited criu restore –D {dir} リストア時

    criu dump –D {dir} –t {pid} チェックポイント 24
  25. CRIU – Docker サポート © 2022 Fujitsu Limited https://criu.org/Docker experimentalの位置づけ

    カスタムデータが未サポートに 任意の場所へのデータ保存ができない(ドキュメントが古い?) コンテナ内のデータをコピー または チェックポイント時に、`docker commit`する 25
  26. CRIU Docker 使用方法 © 2022 Fujitsu Limited docker start --checkpoint

    {checkpoint} {container} リストア時 docker checkpoint create {container} {checkpoint} チェックポイント 26
  27. OpenJDKのプロジェクト • openjdk.org/project/crac Java起動性能改善が目的 checkpoint/restore時に、Javaプログラムとやりとり可能にする • CRIU + JDK •

    JVMのsafepointを利用 • JDBCの再接続などが可能に jcmdと連携 CRaC (Coordinated Restore At Checkpoint) © 2022 Fujitsu Limited 27
  28. CRaC使用方法 © 2022 Fujitsu Limited java –XX:CRaCCheckpointTo=PATH –jar app.jar java

    –XX:CRaCRestoreFrom=PATH 起動時 リストア時 jcmd app.jar JDK.checkpoint チェックポイント 28
  29. CRaC API © 2022 Fujitsu Limited アプリケーションコードは、Resourceインターフェスを implementしておく checkpoint/restore時に、アプリケーションコードに、 callbackとして通知される

    callback内で、jdbc接続などを行う 29
  30. jdk.crac.Resource © 2022 Fujitsu Limited https://crac.github.io/openjdk-builds/javadoc/api/java.base/jdk/crac/Resource.html 30

  31. アジェンダ © 2022 Fujitsu Limited コンテナ認識 ネイティブ化 サマリ CRIU・CRaC 31

  32. サマリ © 2022 Fujitsu Limited Javaのコンテナ対応は進んでいる アプリケーション作成時の注意は必要 コンテナ利用時には起動性能がひとつのポイント Javaのネイティブ化技術はまだ標準化されていない ネイティブ化以外の起動性能技術も注目しよう

    32
  33. © 2022 Fujitsu Limited 33

  34. Thank you © 2022 Fujitsu Limited