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

    View Slide

  2. 自己紹介
    © 2022 Fujitsu Limited
    Jakarta EE 仕様策定委員
    MicroProfile ステコミ委員
    JCP Executive Committee メンバー
    Eclipse Foundation ボードディレクター
    JJUG CCC、EclipseCon、JakartaOneなどで登壇
    2

    View Slide

  3. Javaのコンテナ対応とは
    © 2022 Fujitsu Limited
    Java自身がコンテナで動作していることを認識できる
    認識しないと、いろいろ不都合あり
    コンテナの特徴を意識した、Java機能エンハンス
    起動時間、メモリフットプリント
    コンテナ(で有用な)機能を利用した、
    Java機能エンハンス
    K8S HealthCheck、CRIU・CRaC
    3

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  7. 影響ある Java API の例
    © 2022 Fujitsu Limited
    java.lang.Runtime#availableProcessors()
    com.sun.management.OperatingSystemMXBean
    #availableProcessors()
    com.sun.management.OperatingSystemMXBean
    #getTotalMemorySize()
    ForkJoinPool#getCommonPoolParallelism()
    ・・・
    7

    View Slide

  8. エルゴノミクス機能への影響
    © 2022 Fujitsu Limited
    Javaヒープサイズの自動設定
    初期値:物理メモリの1/64
    最大値:物理メモリの1/4
    ForkJoinPool並行度
    論理CPU数 - 1
    ざっくり言うと・・・
    8

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  12. コンテナサポートオプション
    © 2022 Fujitsu Limited
    -XX:+UseContainerSupport
    -Xlog:os+container=trace
    メインスイッチ
    ※ デフォルトはオン
    ログ統合オプション
    12

    View Slide

  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

    View Slide

  14. OverlayFSの特徴
    © 2022 Fujitsu Limited
    https://docs.docker.jp/v1.9/engine/userguide/storagedriver/overlayfs-driver.html
    rename(2)がEXDEVを返すのはLinuxの仕様通りだが・・
    14

    View Slide

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

    View Slide

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

    View Slide

  17. コンパイラの歴史
    © 2022 Fujitsu Limited
    C/C++ Java Go
    Python
    Ruby
    静的
    コンパイラ
    インタプリタ
    動的
    コンパイラ
    静的
    コンパイラ
    17

    View Slide

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

    View Slide

  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

    View Slide

  20. Project Leyden
    © 2022 Fujitsu Limited
    OpenJDKのプロジェクト
    • https://openjdk.org/projects/leyden/
    • まだ、JEPにはなっていない
    ゴールはネイティブイメージの標準化
    • ネイティブイメージ生成RIの作成
    • ネイティブイメージの互換テスト作成
    GrralVMとの違い
    • GrralVMはOracle Lab のプロジェクト
    • GrralVMはOpenJDKのプロジェクトではなく、標準ではない
    20

    View Slide

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

    View Slide

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

    View Slide

  23. プロセスとスレッド
    CRIUでの保存対象
    © 2022 Fujitsu Limited
    など
    メモリ
    ファイル、パイプ
    ソケット
    タイマー、シグナル
    23

    View Slide

  24. CRIU使用方法
    © 2022 Fujitsu Limited
    criu restore –D {dir}
    リストア時
    criu dump –D {dir} –t {pid}
    チェックポイント
    24

    View Slide

  25. CRIU – Docker サポート
    © 2022 Fujitsu Limited
    https://criu.org/Docker
    experimentalの位置づけ
    カスタムデータが未サポートに
    任意の場所へのデータ保存ができない(ドキュメントが古い?)
    コンテナ内のデータをコピー
    または
    チェックポイント時に、`docker commit`する
    25

    View Slide

  26. CRIU Docker 使用方法
    © 2022 Fujitsu Limited
    docker start --checkpoint {checkpoint} {container}
    リストア時
    docker checkpoint create {container} {checkpoint}
    チェックポイント
    26

    View Slide

  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

    View Slide

  28. CRaC使用方法
    © 2022 Fujitsu Limited
    java –XX:CRaCCheckpointTo=PATH –jar app.jar
    java –XX:CRaCRestoreFrom=PATH
    起動時
    リストア時
    jcmd app.jar JDK.checkpoint
    チェックポイント
    28

    View Slide

  29. CRaC API
    © 2022 Fujitsu Limited
    アプリケーションコードは、Resourceインターフェスを
    implementしておく
    checkpoint/restore時に、アプリケーションコードに、
    callbackとして通知される
    callback内で、jdbc接続などを行う
    29

    View Slide

  30. jdk.crac.Resource
    © 2022 Fujitsu Limited
    https://crac.github.io/openjdk-builds/javadoc/api/java.base/jdk/crac/Resource.html
    30

    View Slide

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

    View Slide

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

    View Slide

  33. © 2022 Fujitsu Limited
    33

    View Slide

  34. Thank you
    © 2022 Fujitsu Limited

    View Slide