什么是CRaC
aboullaite.me/what-the-crac/
出自Azul system,也是基于CRIU技術的一個java 進程保存,恢復的技術
azul.com/products/components/crac/
目前open jdk 17 集成了CRaC
其他更高版本沒有,需要使用Azul版本的OPEN JDK版本才行
使用spring boot 3.2 + jdk 17進行CRaC 驗證:
my.oschina.net/klblog/blog/10946547
總結
CRaC 當前只是初步支持,有些場景:比如內存里維護了復雜狀態的應用,可能會遇到問題,啟用前請謹慎做好全場景的測試。
遇到的問題
1、JDK 依賴問題
CRaC 特性依賴 JDK 特性支持,目前 openjdk 發行版只支持到 JDK17。如果在不支持的 JDK 下啟用 CRaCCheckpointTo,則會輸出:
Unrecognized VM option 'CRaCCheckpointTo'
Error: Could not create the Java Virtual Machine.Error: A fatal exception has occurred. Program will exit.
CRaC 最早是 Azul 發起的一個項目,可以用 Azul 的社區發行版來驗證 CRaC 特性,如:
-
docker image:azul/zulu-openjdk:21-jdk-crac
2、GC 算法問題
ZGC 算法下,不支持 CRaC,在 ZGC 啟用時,會輸出:
Error: Could not create the Java Virtual Machine.Error: A fatal exception has occurred. Program will exit.
-XX:+UseZGC is currently unsupported for -XX:CRaCCheckpointTo.
為了驗證 CRaC 功能,只好先移除 -XX:+UseZGC
3、打開的 FD & Socket 問題
CRaC 要求應用程序關閉所有打開的文件、網絡連接等。在 Linux 上,這些內容表示為文件描述符。但是,可能很難更改應用程序以與檢查點正確協調,例如,由于無法修改庫中的代碼。在這些情況下,CRaC 通過配置提供有限的處理。
理論上所有的資源都需要向 JVM 注冊資源的 Checkpoint 前后的資源狀態,Spring 內置的依賴都處理好了這一步,但是三方依賴就會有一些異常
-
Openjdk 發行版并未全部覆蓋支持,目前支持的最高版本是 JDK17。更高版本的支持只能用 Azul 的 JDK
-
當前還有非常多的集成問題,且大量第三方包并沒有做適配,Azul 官方給的 resource-policies 解決方案還屬于初步階段
-
Spring Boot 3.2 也是初步支持,Issue 區有大量集成的問題