休眠是操作系统常见的电源选项,可以保持应用程序的状态,并允许断掉电源再开机后恢复休眠前的状态。其原理是休眠时把计算机运行内存的数据全部转储到磁盘,唤醒时再读取磁盘中的内存镜像。
criu 工具可以让单个进程休眠,不依赖于操作系统的内核,完全在用户空间实现,它是 Checkpoint and Restore in Userspace 的缩写。它适用于以下场景:1)有些程序在运行过程中无法保存数据,必须一次性运行出最终结果,比如 lammps 和依赖它的 openfoam 求解器,为了防止计算过程意外终止,可以人为使用 criu 建立 checkpoint,已备不时之需;2)有些超算限制作业的最长运行时间,到达限制后必须终止,如有需要可以重新提交作业,这时可以使用 criu 建立 checkpoint,方便下次提交;3)云服务器的竞价实例,成本低廉,却有可能被随时终止,服务器收到终止指令后很快就会关机,留给用户处理的时间很短,这时也可以配置 criu 脚本,在计算资源被收回时保存计算状态,在计算资源恢复时,自动恢复计算。
criu 的简单用法如下。
criu 的安装过程很简单,在 ubuntu 系统上可以用 apt 安装
sudo apt install criu
criu 的基本用法就是对一个进程 dump/restore
sudo criu dump -t <pid>
Code language: HTML, XML (xml)
比如,我运行了 interFoam,用 ps 查询 pid
interFoam > log.interFoam 2>&1 &
ps -C interFoam
Code language: CSS (css)
输出如下
$ interFoam > log.interFoam 2>&1 &
[1] 2571
$ ps -C interFoam
PID TTY TIME CMD
2571 pts/0 00:00:00 interFoam
在后台运行命令时,会返回进程号 2571,使用 ps 命令查询,得到一致的结果。
用 criu 为这个进程创建 checkpoint
sudo criu dump -vvvv -o log.dump --shell-job --tree 2571
Code language: CSS (css)
运行 criu dump 命令,进程会被 kill 掉,恢复时使用 criu restore 命令
sudo criu restore -vvvv -o log.dump --shell-job
Code language: CSS (css)
参数 -vvvv 表示 log 文件的详细程度,会记录尽可能多的信息,-o 指定 log 文件名。
详尽用法和源代码参见 GitHub github.com/checkpoint-restore/criu