SlideShare a Scribd company logo
© 2025 NTT DATA Japan Corporation
© 2025 NTT DATA Japan Corporation
実はアナタの身近にある!?
Linuxのチェックポイント/レストア機能
NTT Tech Conference 2025
2025年3月5日
NTTデータグループ 末永 恭正
© 2025 NTT DATA Japan Corporation 2
おことわり
本資料記載の検証結果は、すべて以下の環境で検証したものであり、具体的な数値は環境により異なることがあります。
また、各技術への言及は2025/02現在の情報に基づいています。
仮想マシン Hyper-V 4vCPU、8GBメモリ
OS ディストリビューション Fedora 41 x86_64
カーネル 6.12.11-200.fc41.x86_64
glibc glibc-2.40-21.fc41.x86_64
CRIU criu-4.0-2.fc41.x86_64
Cコンパイラ gcc-14.2.1-7.fc41.x86_64
Java JDK 8 Temurin 8u442 b06 x64
JDK 21 Temurin 21.0.6+7 x64
コンテナエンジン podman-5.3.2-1.fc41.x86_64
コンテナビルドツール buildah-1.38.1-1.fc41.x86_64
Kubernetes v1.32.1 ※kubeadm
コンテナランタイム cri-o-1.32.1-150500.1.1.x86_64
ホスト環境 Windows 11 24H2(自作PC:Ryzen 3 3300X、16GBメモリ)
© 2025 NTT DATA Japan Corporation 3
2022年秋 某クラウドプロバイダの “再発明” イベントにて…
うちのFunction as a Serviceで
Javaのスタートアップパフォーマンスを
爆上げする仕組みを入れたよ!
© 2025 NTT DATA Japan Corporation 4
なぜJavaのスタートアップパフォーマンスが注目されるのか?
#include <stdio.h>
int main(){
printf("Hello Worldn");
}
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello World");
}
}
real 0m0.001s
user 0m0.000s
sys 0m0.001s
real 0m0.030s
user 0m0.013s
sys 0m0.020s
ケタ違いの遅さ…
© 2025 NTT DATA Japan Corporation 5
なぜJavaのスタートアップパフォーマンスが注目されるのか?
起動するJVMの決定
JVMのロード
引数のパース
各メモリ領域の初期化
一部Javaクラスの初期化
各種スレッドの起動
Mainクラスのロード
main()呼び出し
ざっくり Javaでmain()が動くまで ※正確には様々な条件を見つつ、もっといろいろな処理があります
仮想マシン方式だからこその様々な “事前作業” がある
• “塵積も” 的に遅くなりがち
• AppCDSやGraalVM Native Imageもあるが…
サーバレスコンピューティングなど
起動停止が頻繁に発生する状況では
Javaの起動の遅さは致命的!
© 2025 NTT DATA Japan Corporation 6
某クラウドプロバイダはどうやってスタートアップパフォーマンスを ”爆上げ” したか?
※公式ブログより
ウチのFaaSとJava 11の組み合わせで
スナップショットを活用するんだよね
CRaCも使えるんだよね
© 2025 NTT DATA Japan Corporation 7
それ、そのクラウドのマネージドサービスじゃないとダメですよね?
OSSで実現できます!
© 2025 NTT DATA Japan Corporation 8
© 2025 NTT DATA Japan Corporation
CONTENTS
1. チェックポイント/レストアを実現するライブラリ:CRIU
2.コンテナとCRIU
3. JavaとCRIUの連携
4.まとめ
© 2025 NTT DATA Japan Corporation 9
© 2025 NTT DATA Japan Corporation
CONTENTS
1. チェックポイント/レストアを実現するライブラリ:CRIU
2.コンテナとCRIU
3. JavaとCRIUの連携
4.まとめ
© 2025 NTT DATA Japan Corporation 10
Checkpoint/Restore In Userspace
• Linux上のプロセス(コンテナ含む)を
任意のタイミングでフリーズさせてチェックポイントを取得し
あとでレストアして処理を再開させるためのソフトウェア
• メジャーなLinuxディストリビューションの多くで
公式パッケージとして配布されている
• Ubuntu、openSUSE、Arch、RHEL、Fedoraなど
• GPGPU(AMD・NVIDIA)上のワークロードの
チェックポイントにも対応
• AArch64でも動きます!
• 今日ご紹介するものすべてラズパイ4で動きます!
© 2025 NTT DATA Japan Corporation 11
最大のメリット:起動時間短縮
@Override
public void run(ApplicationArguments args) throws Exception {
if(args.containsOption("checkpoint")){
System.out.println("Ready to obtain checkpoint...");
// Wait restoring...
cpCoordinator.await();
}
System.out.println("from Spring Boot App");
}
real 0m0.993s
user 0m2.498s
sys 0m0.193s
real 0m0.332s
user 0m0.026s
sys 0m0.115s
レストア待ち合わせポイント
素の実行 チェックポイントからの復帰
速いっ!! Springにパッチ当ててます
[CRaC] Fix hangup after restoring
© 2025 NTT DATA Japan Corporation 12
CRIUのユースケース
• スタートアップ処理のスキップ
• 時間のかかるアプリ初期化を完了してからスナップショットをとり、実行時にレストアする
• JavaのようにJITがかかるものは “暖機運転” 終了後のスナップショットをとり、実行時にレストアする
※ただし、レストア直後に脱最適化(Deopt)条件にかかったら意味ないので注意…
• ライブマイグレーション
• 動いているプロセス・コンテナをそのまま別環境へ移動!
• 移行先環境が移行元と大きく異ならないか、ネットワーク再接続時の問題が発生しないかは注意が必要
• 事後解析
• トラブル発生時のスナップショットをとり、本番環境は即時復旧しつつデバッグ環境でレストアしてじっくり解析
• 実行状態をそのままフリーズして持ち運べるので、フォレンジクスでも活用可能
© 2025 NTT DATA Japan Corporation 13
CRIU – Quick Start
チェックポイント取得
チェックポイントからのレストア
sudo criu dump -t <PID> -D /path/to/checkpoint -j
sudo criu restore -D /path/to/checkpoint -j
© 2025 NTT DATA Japan Corporation 14
CRIU – 注意点
• チェックポイント/レストア実行時に権限がなければならない
• CAP_CHECKPOINT_RESTOREかCAP_SYS_ADMIN
• そもそも特権ユーザーで動かしてしまう
• レストア時にチェックポイント取得時のTID(LWPID)が利用可能でなければいけない
• 基本はIDがオリジナルのまま復元されるので、1つでもアサイン済みの状態でレストアするとエラーになる
• 動的に最適化するアプリではチェックポイント元とレストア先の環境が似ていなければならない
• エルゴノミクスの自動調整(メモリサイズ、GCやJITのスレッド数等)はJVM起動直後の環境で決定する
• JavaのJITコード生成はCPU拡張命令に依存するため、レストア後に最悪クラッシュする可能性がある
• チェックポイント時にオープンしていたファイルはすべて同じ場所に同じものを配置する必要あり
• チェックポイント時に存在したFDはすべてレストア時に復元される
© 2025 NTT DATA Japan Corporation 15
© 2025 NTT DATA Japan Corporation
CONTENTS
1. チェックポイント/レストアを実現するライブラリ:CRIU
2.コンテナとCRIU
3. JavaとCRIUの連携
4.まとめ
© 2025 NTT DATA Japan Corporation 16
Podman × CRIU
チェックポイント取得
チェックポイントからのレストア
sudo podman container checkpoint [コンテナ名 or ID] -c gzip -e /path/to/tgz
sudo podman container restore -i /path/to/tgz
© 2025 NTT DATA Japan Corporation 17
Podman × CRIU – 注意点
• rootlessコンテナではチェックポイント/レストアできない
• Podman v5.4.0ではrootlessコンテナでは機能しないようにハードコードされている
• チェックポイント元となったコンテナイメージはレストア時に参照できなければならない
• チェックポイントで取得するのは実行時イメージだけ
• 使用していたバイナリやオープン中のファイルはチェックポイント元イメージを参照する
© 2025 NTT DATA Japan Corporation 18
K8s × CRIU
Forensic container checkpointing in Kubernetes |
Kubernetes
• v1.30からチェックポイントがベータ機能として
導入済み
• ただしkube-apiではなくKubeletのほう
• 事後解析を題材とした具体的な方法が
Kubernetes公式ブログで紹介されている
• コンテナランタイムでも対応が進んでいる
• CRI-O:対応済み
• containerd:対応中
• 2025/03現在、checkpointのKubernetes
API登録に向けて議論中!
State of Checkpoint/Restore in Kubernetes
FOSDEM 2025でも
発表がありました
© 2025 NTT DATA Japan Corporation 19
K8s × CRIU – 事前準備
/etc/crio/crio.conf.d/10-crio.conf
[crio.runtime]
#default_runtime = "crun"
default_runtime = "runc"
• 高レベルコンテナランタイムはCRI-Oを使う
• containerdではレストアがまだ実装されていない
• 低レベルコンテナランタイムをruncに変更する
• CRI-Oバンドルのcrunではチェックポイントが動作しない
• 直しておきました
• Fedoraバンドルのcrunを使ってもレストアができない
• Issue複数あり
• runc v1.2.0以降を使用すること!
• cgroups v2で動かないバグあり
• (少なくとも)CRI-O v1.31以降にバンドルされたものなら大丈夫
runcに変えましょう
© 2025 NTT DATA Japan Corporation 20
K8s × CRIU –チェックポイント対象の起動
apiVersion: v1
kind: Pod
metadata:
name: cp-creator
labels:
app: springboot-k8s
spec:
containers:
- name: springboot-k8s
image: localhost/springboot-k8s:latest
imagePullPolicy: Never
ports:
- containerPort: 8080
startupProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
failureThreshold: 10
periodSeconds: 30
①普通にPodを上げる
チェックポイント取得用なので
ready状態で上がってくるだけでOK
© 2025 NTT DATA Japan Corporation 21
K8s × CRIU – コンテナのチェックポイント
$ sudo curl -sS -XPOST --insecure 
--cert /etc/kubernetes/pki/apiserver-kubelet-client.crt 
--key /etc/kubernetes/pki/apiserver-kubelet-client.key 
"https://fc41k8s:10250/checkpoint/default/cp-creator/springboot-k8s" 
| jq
{
"items": [
"/var/lib/kubelet/checkpoints/checkpoint-cp-creator_default-springboot-k8s-2025-02-12T11:21:27+09:00.tar"
]
}
②Kubeletにチェックポイント取得を指示する
• 現状Kubeletに直接指示するしかないため、証明書と鍵を指定しなければならない
• パーミッションの関係で特権が必要なため、sudoしてcurlする
• チェックポイント保存場所はレスポンスボディ内のJSONで返される
• このファイルも特権ユーザーでなければアクセスできない
名前空間 Pod コンテナ
© 2025 NTT DATA Japan Corporation 22
K8s × CRIU – レストアコンテナの作成
buildah from scratch
buildah add working-container <チェックポイントのアーカイブ> /
buildah config --annotation=io.kubernetes.cri-o.annotations.checkpoint.name=springboot-k8s working-container
buildah commit working-container springboot-k8s-restored:latest
buildah rm working-container
③取得したチェックポイントを利用してレストア用コンテナイメージをスクラッチから作る
コンテナ
© 2025 NTT DATA Japan Corporation 23
K8s × CRIU – レストアコンテナのデプロイ
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-k8s
spec:
selector:
matchLabels:
app: springboot-k8s
replicas: 1
template:
metadata:
labels:
app: springboot-k8s
spec:
containers:
- name: springboot-k8s-restored
image: localhost/springboot-k8s-restored
imagePullPolicy: Never
ports:
- containerPort: 8080
name: http
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
failureThreshold: 10
periodSeconds: 30
④普通にデプロイする
名前空間やPod名が違ってもOK
© 2025 NTT DATA Japan Corporation 24
• チェックポイントがKubernetes APIではない
• kubectlに機能追加する話はKEP化が議論中
• チェックポイントのコンテナイメージ仕様がまだ固まっていない
• OCIスペック化について議論中
• レストアについて仕様が十分議論されていない
• Podのライブマイグレーションにおけるユースケースは示されているが…
K8s × CRIU – 課題
© 2025 NTT DATA Japan Corporation 25
© 2025 NTT DATA Japan Corporation
CONTENTS
1. チェックポイント/レストアを実現するライブラリ:CRIU
2.コンテナとCRIU
3. JavaとCRIUの連携
4.まとめ
© 2025 NTT DATA Japan Corporation 26
思い出してください
© 2025 NTT DATA Japan Corporation 27
Javaスタートアップパフォーマンスの救世主!CRaC
OpenJDK Wiki CRaC • チェックポイント/レストア機能を
Javaに統合するOpenJDK公式プロジェクト
• jcmdで
チェックポイントの取得とレストアが可能
• CRIUを活用
• チェックポイント/レストアを
イベントとしてフック可能
• まだまだ開発中のプロジェクト
• 一部JDKベンダは商用プロダクトを提供中
(JDK 17と21など)
© 2025 NTT DATA Japan Corporation 28
CRaCの動き Anatomy of CRaC Processes
• チェックポイント
1. アプリを普通に起動する
2. ユーザーがjcmdでチェックポイント取得を要求する
3. criuengineなるプロセスがJVMプロセスツリーから
抜け出し、チェックポイントを取得する
• レストア
1. ユーザーが –XX:CRaCRestoreFrom で
チェックポイントを指定して java を実行する
2. criuengineがプロセスをレストアする
独自に拡張したCRIUを利用している!
© 2025 NTT DATA Japan Corporation 29
CRaCのイベントフック
Resource (crac 1.5.0 API)
• CRaCのJavaライブラリを使用することで
チェックポイント直前/レストア直後の
イベントハンドラを記述することが可能
• 外部システムとの接続/切断など
任意の処理をチェックポイント前後で行える
• Spring BootやQuarkusなど
一部フレームワークはCRaCに標準対応
• チェックポイントと連動してLifeCycleが変化する
© 2025 NTT DATA Japan Corporation 30
CRaC使わないとチェックポイント/レストア使いにくくない?
© 2025 NTT DATA Japan Corporation 31
checkpointer – CRaCなしにチェックポイント/レストアイベントをフック!
YaSuenag/checkpointer: Primitive CRaC implementation
• CRaCイベントハンドラをコールする
WebAPIエンドポイントを提供する
JVMTI Javaエージェント
• CRIUを実行してjavaプロセスの
チェックポイント/レストアと
CRaCイベントハンドラの呼び出しを
ワンストップで行うためのシェルも提供
• Java固有の対処も自動で実施
某クラウドプロバイダよりも幅広く!
Java 8から対応!!
© 2025 NTT DATA Japan Corporation 32
checkpointer × 素のJava
チェックポイント取得
チェックポイントからのレストア
sudo checkpointer.sh checkpoint [PID] /path/to/checkpoint/dir
sudo checkpointer.sh restore /path/to/checkpoint/dir
仕込み
$JAVA_HOME/bin/java -javaagent:checkpointer-0.2.0.jar …
© 2025 NTT DATA Japan Corporation 33
checkpointerがやる、Javaだからこその “気配り”
• beforeCheckpoint()、afterRestore()の呼び出し
• criuの--action-script内でJVMTI Javaエージェントに向けてHTTPリクエストを発行
• hsperfdataの保存/復元
• /tmp/hsperfdata_<ユーザー名>/<PID>
• Javaのパフォーマンス情報が記録されているファイル
• jcmdやjpsなどのツール類はこのファイルからプロセスをリストしている
• 全beforeCheckpoint()実行後のGC実行
• JVMTI Javaエージェントにgc=trueを与えたとき、beforeCheckpoint()後にSystem.gc()を実行する
• スナップショット取得時のJavaヒープをできるだけクリーンな状態にできる
© 2025 NTT DATA Japan Corporation 34
checkpointer × Spring Boot × Kubernetes
• コンテナの起動を早められる
• サーバレスなどPodの立ち上がりが頻繁に発生しうる環境でJavaが使いやすくなる
• “暖まった” 状態から始められる
• マスタデータの読み込みなどの初期動作完了後でスナップショットを取得してもOK
• 定型的な重い処理があるのならJITコンパイル後のスナップショット取得もアリ
• SpringのLifeCycleが適切に変化する
• アプリの考慮事項を最小限にできる
メリット
© 2025 NTT DATA Japan Corporation 35
checkpointer × Spring Boot × Kubernetes - チェックポイント対象の起動
apiVersion: v1
kind: Pod
metadata:
name: cp-creator
labels:
app: springboot-k8s
spec:
containers:
- name: springboot-k8s
image: localhost/springboot-k8s:latest
imagePullPolicy: Never
ports:
- containerPort: 8080
- containerPort: 10095
name: checkpointer
startupProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
failureThreshold: 10
periodSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
name: checkpointer
spec:
selector:
app: springboot-k8s
ports:
- name: checkpointer
port: 10095
targetPort: checkpointer
①普通にPodを上げる
• チェックポイント取得用なので
ready状態で上がってくるだけでOK
• checkpointerのリクエスト受信用Service
(ポート:10095)を開けておく
© 2025 NTT DATA Japan Corporation 36
checkpointer × Spring Boot × Kubernetes - beforeCheckpoint発動
②checkpointerの /before-checkpoint にPOSTリクエストを発行する
kubectl run curl-checkpoint --image=curlimages/curl -it --rm --restart=Never -- 
-XPOST http://checkpointer.default.svc.cluster.local:10095/before-checkpoint
© 2025 NTT DATA Japan Corporation 37
checkpointer × Spring Boot × Kubernetes - チェックポイント~レストア
Kubeletへのチェックポイント要求からレストアコンテナイメージの作成までは先の例と同じ
© 2025 NTT DATA Japan Corporation 38
checkpointer × Spring Boot × Kubernetes - レストアコンテナのデプロイ
apiVersion: apps/v1
kind: Deployment
metadata:
name: springboot-k8s
spec:
selector:
matchLabels:
app: springboot-k8s
replicas: 1
template:
metadata:
labels:
app: springboot-k8s
spec:
containers:
- name: springboot-k8s-restored
image: localhost/springboot-k8s-restored
imagePullPolicy: Never
ports:
- containerPort: 8080
name: http
- containerPort: 10095
startupProbe:
exec:
command:
- curl
- -XPOST
- -s
- http://localhost:10095/after-restore
failureThreshold: 10
periodSeconds: 1
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
failureThreshold: 10
periodSeconds: 30
④普通にデプロイする
ただしレストアイベントを呼ばないと
LifeCycleがリスタートしない
• 外部から呼ぶ or startupProbeを使う
© 2025 NTT DATA Japan Corporation 39
© 2025 NTT DATA Japan Corporation
CONTENTS
1. チェックポイント/レストアを実現するライブラリ:CRIU
2.コンテナとCRIU
3. JavaとCRIUの連携
4.まとめ
© 2025 NTT DATA Japan Corporation 40
まとめ
• スタートアップスピードの向上が見込めるチェックポイント/レストア
• コンテナランタイムはだいたいサポートしはじめているが、Kubernetesではまだまだこれから
• JavaもCRaCがあるが、まだまだこれから
プロプラ製品やサービスを持ってこなくても…
フルOSSで
Javaでチェックポイント/レストアはできます!
実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)

More Related Content

PDF
20191120 beyondstudy#21 kitaoka
PDF
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
PDF
Prometheus超基礎公開用.pdf
PDF
Docker事始めと最新動向 2015年6月
PDF
HSM用ミドルウェア Conduit Toolkitの概要と使い方
PDF
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
PDF
Kubernetes Operator for vSphere VM
PPTX
JAWS目黒 EC2チューニングTips #jawsmeguro #jawsug
20191120 beyondstudy#21 kitaoka
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
Prometheus超基礎公開用.pdf
Docker事始めと最新動向 2015年6月
HSM用ミドルウェア Conduit Toolkitの概要と使い方
人気ブロックチェーン基盤「Hyperledger Fabric」最新版を動かしてみた!
Kubernetes Operator for vSphere VM
JAWS目黒 EC2チューニングTips #jawsmeguro #jawsug

Similar to 実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料) (20)

PDF
Tech Dojo 02/09 IBM Japan CSM
PDF
Kubernetes1.9でWindowsコンテナーをクラスタ化
PPTX
Introduction to Magnum (JP)
PDF
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
PDF
Singularity Containers for Enterprise Use
ODP
130329 04
ODP
20130329 rtm4
PDF
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
PDF
System Center Operations Managerによる仮想環境の高度な管理
PDF
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
PPTX
エンプラに Kubernetes を 導入してみて分かった 4つの Lessons Learned
PDF
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
PDF
Share pointを支えるsql server2014最新情報 tokyo_公開用
PDF
Soft layer network概要_jslug向け
PDF
もしCloudStackのKVMホストでPCIパススルーできるようになったら
PDF
.NET アプリを改善して実践する継続的インテグレーション
PDF
コンテナ型仮想化とはなんだったのか
PPTX
Cisco Modeling Labs (CML)を使ってネットワークを学ぼう!(応用編)
PDF
Machine configoperatorのちょっとイイかもしれない話
PPTX
Cisco Modeling Labs (CML)を使ってネットワークを学ぼう!(DevNet編)
Tech Dojo 02/09 IBM Japan CSM
Kubernetes1.9でWindowsコンテナーをクラスタ化
Introduction to Magnum (JP)
PGOを用いたPostgreSQL on Kubernetes入門(PostgreSQL Conference Japan 2022 発表資料)
Singularity Containers for Enterprise Use
130329 04
20130329 rtm4
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
System Center Operations Managerによる仮想環境の高度な管理
ZynqMPのブートとパワーマネージメント : (ZynqMP Boot and Power Management)
エンプラに Kubernetes を 導入してみて分かった 4つの Lessons Learned
独断と偏見で選んだ Kubernetes 1.24 の注目機能と今後! / Kubernetes Meetup Tokyo 50
Share pointを支えるsql server2014最新情報 tokyo_公開用
Soft layer network概要_jslug向け
もしCloudStackのKVMホストでPCIパススルーできるようになったら
.NET アプリを改善して実践する継続的インテグレーション
コンテナ型仮想化とはなんだったのか
Cisco Modeling Labs (CML)を使ってネットワークを学ぼう!(応用編)
Machine configoperatorのちょっとイイかもしれない話
Cisco Modeling Labs (CML)を使ってネットワークを学ぼう!(DevNet編)
Ad

More from NTT DATA Technology & Innovation (20)

PDF
開発中の新機能 Spark Declarative Pipeline に飛びついてみたが難しかった(JEDAI DAIS Recap#2 講演資料)
PDF
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
PDF
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
PDF
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
PDF
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
PDF
2025年現在のNewSQL (最強DB講義 #36 発表資料)
PDF
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
PDF
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
PDF
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
PDF
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
PDF
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
PDF
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
PDF
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
PDF
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
PDF
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
PDF
Gartnerも注目するグリーンソフトウェアの実現に向けて (Green Software Foundation Global Summit 2024 T...
PDF
パーティションのATTACH時の注意ポイント (第49回PostgreSQLアンカンファレンス@東京 発表資料)
開発中の新機能 Spark Declarative Pipeline に飛びついてみたが難しかった(JEDAI DAIS Recap#2 講演資料)
PostgreSQL18新機能紹介(db tech showcase 2025 発表資料)
PGConf.dev 2025 参加レポート (JPUG総会併設セミナー2025 発表資料)
Can We Use Rust to Develop Extensions for PostgreSQL? (POSETTE: An Event for ...
つくって壊して直して学ぶ Database on Kubernetes (CloudNative Days Summer 2025 発表資料)
2025年現在のNewSQL (最強DB講義 #36 発表資料)
Java in Japan: A Journey of Community, Culture, and Global Integration (JavaO...
Unveiling the Hidden Layers of Java Class Files: Beyond Bytecode (Devnexus 2025)
論理レプリケーションのアーキテクチャ (第52回 PostgreSQLアンカンファレンス@オンライン 発表資料)
Apache Sparkに対するKubernetesのNUMAノードを意識したリソース割り当ての性能効果 (Open Source Conference ...
PostgreSQL最新動向 ~カラムナストアから生成AI連携まで~ (Open Source Conference 2025 Tokyo/Spring ...
pgbenchのスレッドとクライアント (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
PostgreSQLのgitレポジトリから見える2024年の開発状況 (第51回 PostgreSQLアンカンファレンス@オンライン 発表資料)
ストリーム処理はデータを失うから怖い?それ、何とかできますよ! 〜Apahe Kafkaを用いたストリーム処理における送達保証〜 (Open Source...
生成AI時代のPostgreSQLハイブリッド検索 (第50回PostgreSQLアンカンファレンス@オンライン 発表資料)
DAIS2024参加報告 ~Spark中心にしらべてみた~ (JEDAI DAIS Recap 講演資料)
PostgreSQLのHTAP適応について考える (PostgreSQL Conference Japan 2024 講演資料)
静かに変わってきたクラスファイルを詳細に調べて楽しむ(JJUG CCC 2024 Fall講演資料)
Gartnerも注目するグリーンソフトウェアの実現に向けて (Green Software Foundation Global Summit 2024 T...
パーティションのATTACH時の注意ポイント (第49回PostgreSQLアンカンファレンス@東京 発表資料)
Ad

実はアナタの身近にある!? Linux のチェックポイント/レストア機能 (NTT Tech Conference 2025 発表資料)

  • 1. © 2025 NTT DATA Japan Corporation © 2025 NTT DATA Japan Corporation 実はアナタの身近にある!? Linuxのチェックポイント/レストア機能 NTT Tech Conference 2025 2025年3月5日 NTTデータグループ 末永 恭正
  • 2. © 2025 NTT DATA Japan Corporation 2 おことわり 本資料記載の検証結果は、すべて以下の環境で検証したものであり、具体的な数値は環境により異なることがあります。 また、各技術への言及は2025/02現在の情報に基づいています。 仮想マシン Hyper-V 4vCPU、8GBメモリ OS ディストリビューション Fedora 41 x86_64 カーネル 6.12.11-200.fc41.x86_64 glibc glibc-2.40-21.fc41.x86_64 CRIU criu-4.0-2.fc41.x86_64 Cコンパイラ gcc-14.2.1-7.fc41.x86_64 Java JDK 8 Temurin 8u442 b06 x64 JDK 21 Temurin 21.0.6+7 x64 コンテナエンジン podman-5.3.2-1.fc41.x86_64 コンテナビルドツール buildah-1.38.1-1.fc41.x86_64 Kubernetes v1.32.1 ※kubeadm コンテナランタイム cri-o-1.32.1-150500.1.1.x86_64 ホスト環境 Windows 11 24H2(自作PC:Ryzen 3 3300X、16GBメモリ)
  • 3. © 2025 NTT DATA Japan Corporation 3 2022年秋 某クラウドプロバイダの “再発明” イベントにて… うちのFunction as a Serviceで Javaのスタートアップパフォーマンスを 爆上げする仕組みを入れたよ!
  • 4. © 2025 NTT DATA Japan Corporation 4 なぜJavaのスタートアップパフォーマンスが注目されるのか? #include <stdio.h> int main(){ printf("Hello Worldn"); } public class HelloWorld{ public static void main(String[] args){ System.out.println("Hello World"); } } real 0m0.001s user 0m0.000s sys 0m0.001s real 0m0.030s user 0m0.013s sys 0m0.020s ケタ違いの遅さ…
  • 5. © 2025 NTT DATA Japan Corporation 5 なぜJavaのスタートアップパフォーマンスが注目されるのか? 起動するJVMの決定 JVMのロード 引数のパース 各メモリ領域の初期化 一部Javaクラスの初期化 各種スレッドの起動 Mainクラスのロード main()呼び出し ざっくり Javaでmain()が動くまで ※正確には様々な条件を見つつ、もっといろいろな処理があります 仮想マシン方式だからこその様々な “事前作業” がある • “塵積も” 的に遅くなりがち • AppCDSやGraalVM Native Imageもあるが… サーバレスコンピューティングなど 起動停止が頻繁に発生する状況では Javaの起動の遅さは致命的!
  • 6. © 2025 NTT DATA Japan Corporation 6 某クラウドプロバイダはどうやってスタートアップパフォーマンスを ”爆上げ” したか? ※公式ブログより ウチのFaaSとJava 11の組み合わせで スナップショットを活用するんだよね CRaCも使えるんだよね
  • 7. © 2025 NTT DATA Japan Corporation 7 それ、そのクラウドのマネージドサービスじゃないとダメですよね? OSSで実現できます!
  • 8. © 2025 NTT DATA Japan Corporation 8 © 2025 NTT DATA Japan Corporation CONTENTS 1. チェックポイント/レストアを実現するライブラリ:CRIU 2.コンテナとCRIU 3. JavaとCRIUの連携 4.まとめ
  • 9. © 2025 NTT DATA Japan Corporation 9 © 2025 NTT DATA Japan Corporation CONTENTS 1. チェックポイント/レストアを実現するライブラリ:CRIU 2.コンテナとCRIU 3. JavaとCRIUの連携 4.まとめ
  • 10. © 2025 NTT DATA Japan Corporation 10 Checkpoint/Restore In Userspace • Linux上のプロセス(コンテナ含む)を 任意のタイミングでフリーズさせてチェックポイントを取得し あとでレストアして処理を再開させるためのソフトウェア • メジャーなLinuxディストリビューションの多くで 公式パッケージとして配布されている • Ubuntu、openSUSE、Arch、RHEL、Fedoraなど • GPGPU(AMD・NVIDIA)上のワークロードの チェックポイントにも対応 • AArch64でも動きます! • 今日ご紹介するものすべてラズパイ4で動きます!
  • 11. © 2025 NTT DATA Japan Corporation 11 最大のメリット:起動時間短縮 @Override public void run(ApplicationArguments args) throws Exception { if(args.containsOption("checkpoint")){ System.out.println("Ready to obtain checkpoint..."); // Wait restoring... cpCoordinator.await(); } System.out.println("from Spring Boot App"); } real 0m0.993s user 0m2.498s sys 0m0.193s real 0m0.332s user 0m0.026s sys 0m0.115s レストア待ち合わせポイント 素の実行 チェックポイントからの復帰 速いっ!! Springにパッチ当ててます [CRaC] Fix hangup after restoring
  • 12. © 2025 NTT DATA Japan Corporation 12 CRIUのユースケース • スタートアップ処理のスキップ • 時間のかかるアプリ初期化を完了してからスナップショットをとり、実行時にレストアする • JavaのようにJITがかかるものは “暖機運転” 終了後のスナップショットをとり、実行時にレストアする ※ただし、レストア直後に脱最適化(Deopt)条件にかかったら意味ないので注意… • ライブマイグレーション • 動いているプロセス・コンテナをそのまま別環境へ移動! • 移行先環境が移行元と大きく異ならないか、ネットワーク再接続時の問題が発生しないかは注意が必要 • 事後解析 • トラブル発生時のスナップショットをとり、本番環境は即時復旧しつつデバッグ環境でレストアしてじっくり解析 • 実行状態をそのままフリーズして持ち運べるので、フォレンジクスでも活用可能
  • 13. © 2025 NTT DATA Japan Corporation 13 CRIU – Quick Start チェックポイント取得 チェックポイントからのレストア sudo criu dump -t <PID> -D /path/to/checkpoint -j sudo criu restore -D /path/to/checkpoint -j
  • 14. © 2025 NTT DATA Japan Corporation 14 CRIU – 注意点 • チェックポイント/レストア実行時に権限がなければならない • CAP_CHECKPOINT_RESTOREかCAP_SYS_ADMIN • そもそも特権ユーザーで動かしてしまう • レストア時にチェックポイント取得時のTID(LWPID)が利用可能でなければいけない • 基本はIDがオリジナルのまま復元されるので、1つでもアサイン済みの状態でレストアするとエラーになる • 動的に最適化するアプリではチェックポイント元とレストア先の環境が似ていなければならない • エルゴノミクスの自動調整(メモリサイズ、GCやJITのスレッド数等)はJVM起動直後の環境で決定する • JavaのJITコード生成はCPU拡張命令に依存するため、レストア後に最悪クラッシュする可能性がある • チェックポイント時にオープンしていたファイルはすべて同じ場所に同じものを配置する必要あり • チェックポイント時に存在したFDはすべてレストア時に復元される
  • 15. © 2025 NTT DATA Japan Corporation 15 © 2025 NTT DATA Japan Corporation CONTENTS 1. チェックポイント/レストアを実現するライブラリ:CRIU 2.コンテナとCRIU 3. JavaとCRIUの連携 4.まとめ
  • 16. © 2025 NTT DATA Japan Corporation 16 Podman × CRIU チェックポイント取得 チェックポイントからのレストア sudo podman container checkpoint [コンテナ名 or ID] -c gzip -e /path/to/tgz sudo podman container restore -i /path/to/tgz
  • 17. © 2025 NTT DATA Japan Corporation 17 Podman × CRIU – 注意点 • rootlessコンテナではチェックポイント/レストアできない • Podman v5.4.0ではrootlessコンテナでは機能しないようにハードコードされている • チェックポイント元となったコンテナイメージはレストア時に参照できなければならない • チェックポイントで取得するのは実行時イメージだけ • 使用していたバイナリやオープン中のファイルはチェックポイント元イメージを参照する
  • 18. © 2025 NTT DATA Japan Corporation 18 K8s × CRIU Forensic container checkpointing in Kubernetes | Kubernetes • v1.30からチェックポイントがベータ機能として 導入済み • ただしkube-apiではなくKubeletのほう • 事後解析を題材とした具体的な方法が Kubernetes公式ブログで紹介されている • コンテナランタイムでも対応が進んでいる • CRI-O:対応済み • containerd:対応中 • 2025/03現在、checkpointのKubernetes API登録に向けて議論中! State of Checkpoint/Restore in Kubernetes FOSDEM 2025でも 発表がありました
  • 19. © 2025 NTT DATA Japan Corporation 19 K8s × CRIU – 事前準備 /etc/crio/crio.conf.d/10-crio.conf [crio.runtime] #default_runtime = "crun" default_runtime = "runc" • 高レベルコンテナランタイムはCRI-Oを使う • containerdではレストアがまだ実装されていない • 低レベルコンテナランタイムをruncに変更する • CRI-Oバンドルのcrunではチェックポイントが動作しない • 直しておきました • Fedoraバンドルのcrunを使ってもレストアができない • Issue複数あり • runc v1.2.0以降を使用すること! • cgroups v2で動かないバグあり • (少なくとも)CRI-O v1.31以降にバンドルされたものなら大丈夫 runcに変えましょう
  • 20. © 2025 NTT DATA Japan Corporation 20 K8s × CRIU –チェックポイント対象の起動 apiVersion: v1 kind: Pod metadata: name: cp-creator labels: app: springboot-k8s spec: containers: - name: springboot-k8s image: localhost/springboot-k8s:latest imagePullPolicy: Never ports: - containerPort: 8080 startupProbe: httpGet: path: /actuator/health/readiness port: 8080 failureThreshold: 10 periodSeconds: 30 ①普通にPodを上げる チェックポイント取得用なので ready状態で上がってくるだけでOK
  • 21. © 2025 NTT DATA Japan Corporation 21 K8s × CRIU – コンテナのチェックポイント $ sudo curl -sS -XPOST --insecure --cert /etc/kubernetes/pki/apiserver-kubelet-client.crt --key /etc/kubernetes/pki/apiserver-kubelet-client.key "https://fc41k8s:10250/checkpoint/default/cp-creator/springboot-k8s" | jq { "items": [ "/var/lib/kubelet/checkpoints/checkpoint-cp-creator_default-springboot-k8s-2025-02-12T11:21:27+09:00.tar" ] } ②Kubeletにチェックポイント取得を指示する • 現状Kubeletに直接指示するしかないため、証明書と鍵を指定しなければならない • パーミッションの関係で特権が必要なため、sudoしてcurlする • チェックポイント保存場所はレスポンスボディ内のJSONで返される • このファイルも特権ユーザーでなければアクセスできない 名前空間 Pod コンテナ
  • 22. © 2025 NTT DATA Japan Corporation 22 K8s × CRIU – レストアコンテナの作成 buildah from scratch buildah add working-container <チェックポイントのアーカイブ> / buildah config --annotation=io.kubernetes.cri-o.annotations.checkpoint.name=springboot-k8s working-container buildah commit working-container springboot-k8s-restored:latest buildah rm working-container ③取得したチェックポイントを利用してレストア用コンテナイメージをスクラッチから作る コンテナ
  • 23. © 2025 NTT DATA Japan Corporation 23 K8s × CRIU – レストアコンテナのデプロイ apiVersion: apps/v1 kind: Deployment metadata: name: springboot-k8s spec: selector: matchLabels: app: springboot-k8s replicas: 1 template: metadata: labels: app: springboot-k8s spec: containers: - name: springboot-k8s-restored image: localhost/springboot-k8s-restored imagePullPolicy: Never ports: - containerPort: 8080 name: http readinessProbe: httpGet: path: /actuator/health/readiness port: 8080 failureThreshold: 10 periodSeconds: 30 ④普通にデプロイする 名前空間やPod名が違ってもOK
  • 24. © 2025 NTT DATA Japan Corporation 24 • チェックポイントがKubernetes APIではない • kubectlに機能追加する話はKEP化が議論中 • チェックポイントのコンテナイメージ仕様がまだ固まっていない • OCIスペック化について議論中 • レストアについて仕様が十分議論されていない • Podのライブマイグレーションにおけるユースケースは示されているが… K8s × CRIU – 課題
  • 25. © 2025 NTT DATA Japan Corporation 25 © 2025 NTT DATA Japan Corporation CONTENTS 1. チェックポイント/レストアを実現するライブラリ:CRIU 2.コンテナとCRIU 3. JavaとCRIUの連携 4.まとめ
  • 26. © 2025 NTT DATA Japan Corporation 26 思い出してください
  • 27. © 2025 NTT DATA Japan Corporation 27 Javaスタートアップパフォーマンスの救世主!CRaC OpenJDK Wiki CRaC • チェックポイント/レストア機能を Javaに統合するOpenJDK公式プロジェクト • jcmdで チェックポイントの取得とレストアが可能 • CRIUを活用 • チェックポイント/レストアを イベントとしてフック可能 • まだまだ開発中のプロジェクト • 一部JDKベンダは商用プロダクトを提供中 (JDK 17と21など)
  • 28. © 2025 NTT DATA Japan Corporation 28 CRaCの動き Anatomy of CRaC Processes • チェックポイント 1. アプリを普通に起動する 2. ユーザーがjcmdでチェックポイント取得を要求する 3. criuengineなるプロセスがJVMプロセスツリーから 抜け出し、チェックポイントを取得する • レストア 1. ユーザーが –XX:CRaCRestoreFrom で チェックポイントを指定して java を実行する 2. criuengineがプロセスをレストアする 独自に拡張したCRIUを利用している!
  • 29. © 2025 NTT DATA Japan Corporation 29 CRaCのイベントフック Resource (crac 1.5.0 API) • CRaCのJavaライブラリを使用することで チェックポイント直前/レストア直後の イベントハンドラを記述することが可能 • 外部システムとの接続/切断など 任意の処理をチェックポイント前後で行える • Spring BootやQuarkusなど 一部フレームワークはCRaCに標準対応 • チェックポイントと連動してLifeCycleが変化する
  • 30. © 2025 NTT DATA Japan Corporation 30 CRaC使わないとチェックポイント/レストア使いにくくない?
  • 31. © 2025 NTT DATA Japan Corporation 31 checkpointer – CRaCなしにチェックポイント/レストアイベントをフック! YaSuenag/checkpointer: Primitive CRaC implementation • CRaCイベントハンドラをコールする WebAPIエンドポイントを提供する JVMTI Javaエージェント • CRIUを実行してjavaプロセスの チェックポイント/レストアと CRaCイベントハンドラの呼び出しを ワンストップで行うためのシェルも提供 • Java固有の対処も自動で実施 某クラウドプロバイダよりも幅広く! Java 8から対応!!
  • 32. © 2025 NTT DATA Japan Corporation 32 checkpointer × 素のJava チェックポイント取得 チェックポイントからのレストア sudo checkpointer.sh checkpoint [PID] /path/to/checkpoint/dir sudo checkpointer.sh restore /path/to/checkpoint/dir 仕込み $JAVA_HOME/bin/java -javaagent:checkpointer-0.2.0.jar …
  • 33. © 2025 NTT DATA Japan Corporation 33 checkpointerがやる、Javaだからこその “気配り” • beforeCheckpoint()、afterRestore()の呼び出し • criuの--action-script内でJVMTI Javaエージェントに向けてHTTPリクエストを発行 • hsperfdataの保存/復元 • /tmp/hsperfdata_<ユーザー名>/<PID> • Javaのパフォーマンス情報が記録されているファイル • jcmdやjpsなどのツール類はこのファイルからプロセスをリストしている • 全beforeCheckpoint()実行後のGC実行 • JVMTI Javaエージェントにgc=trueを与えたとき、beforeCheckpoint()後にSystem.gc()を実行する • スナップショット取得時のJavaヒープをできるだけクリーンな状態にできる
  • 34. © 2025 NTT DATA Japan Corporation 34 checkpointer × Spring Boot × Kubernetes • コンテナの起動を早められる • サーバレスなどPodの立ち上がりが頻繁に発生しうる環境でJavaが使いやすくなる • “暖まった” 状態から始められる • マスタデータの読み込みなどの初期動作完了後でスナップショットを取得してもOK • 定型的な重い処理があるのならJITコンパイル後のスナップショット取得もアリ • SpringのLifeCycleが適切に変化する • アプリの考慮事項を最小限にできる メリット
  • 35. © 2025 NTT DATA Japan Corporation 35 checkpointer × Spring Boot × Kubernetes - チェックポイント対象の起動 apiVersion: v1 kind: Pod metadata: name: cp-creator labels: app: springboot-k8s spec: containers: - name: springboot-k8s image: localhost/springboot-k8s:latest imagePullPolicy: Never ports: - containerPort: 8080 - containerPort: 10095 name: checkpointer startupProbe: httpGet: path: /actuator/health/readiness port: 8080 failureThreshold: 10 periodSeconds: 30 --- apiVersion: v1 kind: Service metadata: name: checkpointer spec: selector: app: springboot-k8s ports: - name: checkpointer port: 10095 targetPort: checkpointer ①普通にPodを上げる • チェックポイント取得用なので ready状態で上がってくるだけでOK • checkpointerのリクエスト受信用Service (ポート:10095)を開けておく
  • 36. © 2025 NTT DATA Japan Corporation 36 checkpointer × Spring Boot × Kubernetes - beforeCheckpoint発動 ②checkpointerの /before-checkpoint にPOSTリクエストを発行する kubectl run curl-checkpoint --image=curlimages/curl -it --rm --restart=Never -- -XPOST http://checkpointer.default.svc.cluster.local:10095/before-checkpoint
  • 37. © 2025 NTT DATA Japan Corporation 37 checkpointer × Spring Boot × Kubernetes - チェックポイント~レストア Kubeletへのチェックポイント要求からレストアコンテナイメージの作成までは先の例と同じ
  • 38. © 2025 NTT DATA Japan Corporation 38 checkpointer × Spring Boot × Kubernetes - レストアコンテナのデプロイ apiVersion: apps/v1 kind: Deployment metadata: name: springboot-k8s spec: selector: matchLabels: app: springboot-k8s replicas: 1 template: metadata: labels: app: springboot-k8s spec: containers: - name: springboot-k8s-restored image: localhost/springboot-k8s-restored imagePullPolicy: Never ports: - containerPort: 8080 name: http - containerPort: 10095 startupProbe: exec: command: - curl - -XPOST - -s - http://localhost:10095/after-restore failureThreshold: 10 periodSeconds: 1 readinessProbe: httpGet: path: /actuator/health/readiness port: 8080 failureThreshold: 10 periodSeconds: 30 ④普通にデプロイする ただしレストアイベントを呼ばないと LifeCycleがリスタートしない • 外部から呼ぶ or startupProbeを使う
  • 39. © 2025 NTT DATA Japan Corporation 39 © 2025 NTT DATA Japan Corporation CONTENTS 1. チェックポイント/レストアを実現するライブラリ:CRIU 2.コンテナとCRIU 3. JavaとCRIUの連携 4.まとめ
  • 40. © 2025 NTT DATA Japan Corporation 40 まとめ • スタートアップスピードの向上が見込めるチェックポイント/レストア • コンテナランタイムはだいたいサポートしはじめているが、Kubernetesではまだまだこれから • JavaもCRaCがあるが、まだまだこれから プロプラ製品やサービスを持ってこなくても… フルOSSで Javaでチェックポイント/レストアはできます!