上篇:Checkpoint/Restore in Userspace(CRIU)安装和使用
本篇参考: CRIU官网
在上一篇的介绍中,我们简单的安装和使用了CRIU,本篇将介绍CRIU稍微高级那么一点点的用法。
1.CRIU工作原理(流程图,图片来自官网)
了解大概的流程有助于理解工作原理
2.功能命令以及选项参数含义
在上一篇我们已经了解到了dump , restore 等基础功能命令,这里我们再重新认识一下它们,知道它们新的含义,同时还有一些新的有意思的命令
dump 功能 没有别的参数的情况下,转储所有进程信息并杀死进程 pre-dump 功能 仅仅转储内存文件,打开内存更改跟踪,并保留程序运行 --track-mem 选项 打开内存更改跟踪 --prev-images-dir 选项 指明上次检查点的文件路径 --leave-running 选项 让进程继续存活
3.命令和选项的搭配及其含义
- dump 转储所有并杀死进程
- dump --leave-running 转储所有并保留被转储进程继续执行
- dump --track-mem 转储所有杀死进程并打开内存更改追踪(这个通常被认为是没有用处的,因为dump会杀死进程,详细请了解下一篇)
- dump --track-mem --leave-running 转储所有,打开内存更改追踪,同时保留程序继续执行(这个应该是比较有用的)
- dump --track-mem --leave-running --prev-images-dir $path 同上,同时在转储文件的时候检查$path中的文件,跳过已经存在的部分(内存页没有更改的部分)
- pre-dump 仅转储内存,打开内存更改追踪,保留程序继续执行
- pre-dump --prev-images-dir $path 同上但是会检查$path中的文件,跳过已经存在的部分
4.命令的使用
- 测试例目标:
1 为程序创建一个pre-dump存储于chkp01 2 在上次快照的基础上再创建一个pre-dume存储于chkp02 3 在上次快照的基础上再创建一个dump存储于chkp03,并保持程序执行 4 在上次快照的基础上再创建一个dump存储于chkp04,终止程序 5 在第3步的基础上恢复程序运行 6 在第4步的基础上恢复程序运行
- 创建测试程序test.c
vim test.c
#include<stdio.h> #include<unistd.h> int main(){ int i = 0; for (i = 0; i < 1000 ; i++){//因为命令较多,让程序跑的久一点 sleep(1); printf("%d ",i); } return 0; }
:wq
- 创建保存快照的文件夹(多创建几个)
mkdir chkp01 mkdir chkp02 mkdir chkp03 mkdir chkp04 mkdir chkp05
- 在终端A中启动程序 (使用gcc编译之后,编译命令: gcc test.c -o test
./test
- 在终端B中查找程序pid
ps -ef | grep test
假设查到的id是1447
- 完成目标第一步(为程序创建一个pre-dump存储于chkp01)
criu pre-dump --shell-job --images-dir /usr/temp/chkp01 -t 1447 #创建一个内存快照存储于chkp01,打开内存更改追踪,并保持程序执行
--shell-job 表明是命令行程序等价于上篇-j
--images-dir 指明快照文件存储的文件夹路径 - 完成目标第二步(在上次快照的基础上再创建一个pre-dume存储于chkp02)
criu pre-dump --shell-job --images-dir /usr/temp/chkp02 -t 1447 --prev-images-dir /usr/temp/chkp01
在第一步的基础上创建第二步的快照,可以减少系统开销,减少程序执行时间,减少存储占用空间(这是目的)
- 完成目标第三步(在上次快照的基础上再创建一个dump存储于chkp03,并保持程序执行)
criu dump --track-mem --shell-job --images-dir /usr/temp/chkp03 -t 1447 --prev-images-dir /usr/temp/chkp02 --leave-running
dump会终止程序执行,同时没有追踪内存更改的功能,所以在这一步,我们加上了--track-mem--leave-running 两个选项
- 完成目标第四步(在上次快照的基础上再创建一个dump存储于chkp04,终止程序)
criu dump --shell-job --images-dir /usr/temp/chkp04 -t 1447 --prev-images-dir /usr/temp/chkp03
- 完成目标第五步(在第3步的基础上恢复程序运行)
criu restore --shell-job --images-dir /usr/temp/chkp03
- 完成目标第六步(在第4步的基础上恢复程序运行)一定要杀掉上步恢复的程序再执行这一步否则会出错,因为进程号被占用:kill -9 1447
criu restore --shell-job --images-dir /usr/temp/chkp04
5.小结(解疑)
- 可能有的读者在这里还是很迷惑,明明有很简单的方法为什么还要这么复杂呢?
- 是这样的,我们在做检查点的时候,可能测试程序很大,检查点很多,这样就会产生一种结果,需要大量的存储空间,以及大量的时间,为了节约资源,可以仅仅存储某些改变了的内存页,这样就能节约大量的时间和空间。--stack-mem就能完成这个功能,它可以使后面执行的语句在使用--prev-images-dir的时候有机会发现没有改变的内存页,从而跳过这些页的存储。
2.为什么我们仅仅恢复了第三步和第四步的快照呢?
- 这是因为pre-dump 是不完整的快照,无法恢复,仅仅dump才可以恢复。它仅仅为了生成 --prev-images-dir 参数所需要的文件
最后,肯定还有一大批小伙伴云里雾里,请期待下篇Memory changes tracking