Checkpoint/Restore In Userspace(CRIU)使用细节

上篇:Checkpoint/Restore in Userspace(CRIU)安装和使用

本篇参考: CRIU官网

在上一篇的介绍中,我们简单的安装和使用了CRIU,本篇将介绍CRIU稍微高级那么一点点的用法。

 1.CRIU工作原理(流程图,图片来自官网)

  

了解大概的流程有助于理解工作原理

2.功能命令以及选项参数含义

  在上一篇我们已经了解到了dumprestore 等基础功能命令,这里我们再重新认识一下它们,知道它们新的含义,同时还有一些新的有意思的命令

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步的基础上恢复程序运行
  1. 创建测试程序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
  2. 创建保存快照的文件夹(多创建几个)
    mkdir  chkp01
    mkdir  chkp02
    mkdir  chkp03
    mkdir  chkp04
    mkdir  chkp05
  3. 在终端A中启动程序  (使用gcc编译之后,编译命令:  gcc test.c -o test
    ./test
  4. 在终端B中查找程序pid
    ps -ef | grep test

    假设查到的id是1447

  5. 完成目标第一步(为程序创建一个pre-dump存储于chkp01
    criu pre-dump --shell-job --images-dir /usr/temp/chkp01 -t 1447    #创建一个内存快照存储于chkp01,打开内存更改追踪,并保持程序执行

    --shell-job       表明是命令行程序等价于上篇-j

    --images-dir    指明快照文件存储的文件夹路径
     
  6. 完成目标第二步(在上次快照的基础上再创建一个pre-dume存储于chkp02
    criu pre-dump --shell-job --images-dir /usr/temp/chkp02 -t 1447 --prev-images-dir /usr/temp/chkp01

    在第一步的基础上创建第二步的快照,可以减少系统开销,减少程序执行时间,减少存储占用空间(这是目的)

  7. 完成目标第三步(在上次快照的基础上再创建一个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 两个选项

  8. 完成目标第四步(在上次快照的基础上再创建一个dump存储于chkp04,终止程序
    criu dump --shell-job --images-dir /usr/temp/chkp04 -t 1447 --prev-images-dir /usr/temp/chkp03
  9. 完成目标第五步(在第3步的基础上恢复程序运行
    criu restore --shell-job --images-dir /usr/temp/chkp03
  10. 完成目标第六步(在第4步的基础上恢复程序运行一定要杀掉上步恢复的程序再执行这一步否则会出错,因为进程号被占用:kill -9 1447
    criu restore --shell-job --images-dir /usr/temp/chkp04

5.小结(解疑)

  1. 可能有的读者在这里还是很迷惑,明明有很简单的方法为什么还要这么复杂呢?
  • 是这样的,我们在做检查点的时候,可能测试程序很大,检查点很多,这样就会产生一种结果,需要大量的存储空间,以及大量的时间,为了节约资源,可以仅仅存储某些改变了的内存页,这样就能节约大量的时间和空间。--stack-mem就能完成这个功能,它可以使后面执行的语句在使用--prev-images-dir的时候有机会发现没有改变的内存页,从而跳过这些页的存储。

   2.为什么我们仅仅恢复了第三步和第四步的快照呢?

  • 这是因为pre-dump 是不完整的快照,无法恢复,仅仅dump才可以恢复。它仅仅为了生成 --prev-images-dir  参数所需要的文件

最后,肯定还有一大批小伙伴云里雾里,请期待下篇Memory changes tracking

原文地址:https://www.cnblogs.com/PPWEI/p/9591660.html