一、术语
-
CRIU(Checkpoint/Restore In Userspace):一个在 Linux 用户空间 (userspace) 上实现了checkpoint/restore 功能的软件工具。
-
Checkpoint:CRIU通过ptrace机制把一段特殊的代码(主要实现收集进程的上下文信息)注入到待备份进程并运行,然后再把这些上下文信息存储为镜像文件。
-
Restore:解析Checkpoint镜像文件,以此恢复进程备份前的状态。
-
FastFreeze:基于CRIU的开源工具,提供了友好的CLI,且不需要提升特权(如,CAP_SYS_ADMIN)。
FastFreeze基本使用流程:
-
通过FastFreeze启动进程
fastfreeze run --image-url --image-url file:/tmp/ff-test -- app.sh [args...]
-
Checkpoint备份进程
fastfreeze checkpoint
-
Restore备份进程
fastfreeze run --image-url --image-url file:/tmp/ff-test
-
二、函数快照冷启动方案设计
2.1 Checkpoint准备
一、Checkpoint镜像
-
安装FastFreeze。
-
将当前函数启动命令替换为fastfreeze命令,并设置快照文件存储路径为
/var/snapshot-ff
:如,当前函数启动命令为:
java -jar app.jar
FastFreeze启动命令为:
fastfreeze run --image-url file:/var/snapshot-ff -- bash -c "java -jar app.jar"
二、运行镜像
-
需要指定
--cap-add=cap_sys_ptrace
以获得ptrace权限(checkpoint依赖该权限),如:docker run -it --cap-add=cap_sys_ptrace ...
2.2 Checkpoint
使用另一个终端进入“2.1”正在运行的容器,并执行:
-
通过用户实现的健康检查检查接口,或信号量接口来判断函数是否启动完成,当函数启动完成后执行下一步。
-
执行
fastfreeze checkpoint
进行Checkpoint。 -
收集以下文件:
-
快照文件。即fastfreeze命令
--image-url
参数指定的快照文件。 -
hsperfdata目录。由FastFreeze生成的临时文件:/tmp/hsperfdata_${user}。(user为当前系统用户名)
-
目标应用程序。如,app.jar以及依赖的第三方jar包等。
-
目标应用程序正在读写的文件(普通文件,非设备、网络对象等)。这些文件可以通过路径
/proc/${pid}/fd
获取。 -
其它目标应用程序依赖的文件。场景较多,无法一一遍历,可不断补充完善(前端界面提供用户配置入口?)。
-
-
上传第3步收集的文件到xxx(传输方式待定?)。
2.4 Restore
一、Restore镜像
-
安装FastFreeze。
-
下载、解压缩步骤“2.2”上传的文件
-
将当前函数启动命令替换为fastfreeze命令,指定快照文件存储路径与之前Checkpoint镜像设置的镜像地址保持一致(此时无需再指定原启动命令)。并设置
on-app-ready
参数,该参数可以指定命令,在Restore之后执行,可通过发送信号(或别的机制,如CURL指定接口),并在进程内实现接收到该信号后对进程做一些状态刷新(需要用户额外实现):fastfreeze run --on-app-ready "kill -USR2 1000" --image-url file:/var/snapshot-ff
二、运行镜像
正常运行。
三、使用约束
-
FastFreeze会使用pid=1000的进程号,需确保该进程号能被分配到。
-
CRIU Checkpoint需要对机器进行ptrace访问,在容器内运行需要指定
cap_sys_ptrace
参数。 -
不支持ARM。
-
Linux内核版本要求:>= 3.?
参考资料
CRIU解析-CSDN博客:blog.csdn.net/o0xgw0o/article/details/124497819
Docker热迁移工具CRIU原理系列:images_crit是啥工具-CSDN博客:blog.csdn.net/weixin_38669561/article/details/105723868
Checkpoint/Restore - CRIU:criu.org/Checkpoint/Restore
流程示图