Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

コンテナ対応修正一覧(抜粋)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

Slide 10

Slide 10 text

コンテナ対応修正一覧(抜粋)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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

リネーム問題 © 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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

Javaネイティブ化技術 © 2022 Fujitsu Limited gcj 2016年9月で終了 Dalvik Android 5.0より、Android Runtimeに Avian 2020年くらいに終息 Excelsior JET 2019年5月EOL GraalVM Oracle Labのプロジェクト 19

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

OpenJDKのプロジェクト • openjdk.org/project/crac Java起動性能改善が目的 checkpoint/restore時に、Javaプログラムとやりとり可能にする • CRIU + JDK • JVMのsafepointを利用 • JDBCの再接続などが可能に jcmdと連携 CRaC (Coordinated Restore At Checkpoint) © 2022 Fujitsu Limited 27

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

© 2022 Fujitsu Limited 33

Slide 34

Slide 34 text

Thank you © 2022 Fujitsu Limited