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\n",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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM