使用CRaC机制为Java应用创建checkpoint

加瓦儿 / 2024-06-06 / 原文

CRaC

Coordinated Restore at Checkpoint,翻译为中文:从检查点原样恢复重启。
大致的原理是将JVM的当前运行状态进行持久化存储起来,相当于存储某一刻运行时的快照,给那一刻的JVM运行状态进行拍照即为检查点。再启动服务时直接通过该快照文件恢复至运行状态。通过检查点恢复启动的速度比原始启动要快不少,从而实现缩短应用启动速度。

https://github.com/CRaC

条件

  • 操作系统:得有CRIU功能,CRIU(Checkpoint/Restore In Userspace),目前只有Linux系列的OS有该功能。
  • JDK版本: 17及以上,建议17或21
  • OpenJDK发行版,目前支持CRaC的JDK有两家:
    • Zulu JDK: 发行商为Azul,下载地址:https://www.azul.com/downloads/?version=java-17-lts&os=centos&architecture=x86-64-bit&package=jdk-crac#zulu
    • Liberica JDK: 发行商为Bellsoft,下载地址:https://bell-sw.com/pages/downloads/?version=java-17&os=linux&bitness=64&package=jdk-crac&release=17.0.11%2B13
  • Spring Boot: 3.2.x及以上

引依赖

        <dependency>
            <groupId>org.crac</groupId>
            <artifactId>crac</artifactId>
            <version>1.4.0</version>
        </dependency>

开启CRaC参数

/app/jdk-21.0.3-crac/bin/java -jar -Dspring.context.checkpoint=onRefresh -Djdk.crac.resource-policies=crac.yml -XX:CRaCCheckpointTo=checkpoint myapp.jar &
  • /app/jdk-21.0.3-crac/bin/java这里使用的是JDK绝对路径,以方便一机多个JDK共存并在运行app时指定CRaC功能的JDK进行运行。
  • -Dspring.context.checkpoint=onRefresh是spring触发检查点的时机。
  • -Djdk.crac.resource-policies=crac.yml指定检查点触发时不进行转存储的状态的配置文件,主要有三类(文件、socket、pipe)
  • -XX:CRaCCheckpointTo=checkpoint是指定把检查点触发的快照文件存储的目录

crac.yml

type: socket
localAddress: *
remoteAddress: *
localPort: *
remotePort: *
family: ip
action: ignore
---
type: file
path: /opt
action: ignore
---
type: file
path: /tmp
action: ignore
---
type: pipe
action: ignore

关于crac.yml配置文件格式及值的说明,详见:

https://docs.azul.com/core/crac/fd-policies