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