Checkpoint/Restore是分布式系統容錯領域的重要技術,本篇介紹了一個實作CR的工具的使用。
CRIU:Checkpoint/Restore in Userspace
是Linux平台在使用者空間實作checkpoint/restore功能的工具軟體。通過該工具,可以當機正在運作的應用程式或者其中的一部分,并将應用程式的執行狀态以檔案形式儲存在磁盤上,然後通過這些快照檔案,可以将應用程式從當機的時間點恢複回來繼續運作。
另外還有個核心級的CR工具–BLCR,這裡先挖個坑,以後填。
- 實驗環境
- 安裝
- 實驗準備
- 實驗1:簡單的dump和restore指令
- 實驗2:追蹤記憶體更改
實驗環境
- centos 7
安裝
yum -y install criu
criu check
>>> Looks good.
實驗準備
編寫一個用于測試的C程式:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char const *argv[]) {
int i = ;
while(true) {
sleep();
printf("%d\n", i);
i++;
}
return ;
}
編譯生成可執行檔案:
gcc test_criu.c -o test_criu
實驗1:簡單的dump和restore指令
1)執行測試程式
./test_criu
0
1
2
3
killed
2)另一個終端檢視測試程式pid:
ps -ef | grep test_criu
>>> root : pts/ :: ./test_criu
3)dump:設定檢查點并中斷程式
mkdir checkpoint_file
criu dump -D checkpoint_file -j -t
>>> Warn (compel/arch/x86/src/lib/infect.c:): Will restore with interrupted system call
4)恢複程式:
criu restore -D checkpoint_file -j
...
5)檢查程序是否使用原來的程序号繼續運作:
指令說明:
-
dump指令:由實驗中可以看到,當設定程序1597的checkpoint後,再查找該程序,發現程序不存在,即程序已經退出。檢視快照檔案目錄,生成很多img檔案,這些檔案主要用于恢複應用。
-D(等價于–images-dir):選項指定應用的快照檔案儲存目錄
-j(等價于–shell-job):表示該應用是一個通過shell啟動的作業
-t:指定需要checkpoint的應用pid
當對應用設定checkpoint後,應用會自動退出,如果希望應用繼續執行,需指定-R或–leave-running選項(見實驗2)。
- restore指令:由實驗中可以看到,恢複後的程式從設定checkpoint的時間點繼續運作,程式在輸出3時被kill掉,恢複後繼續輸出4,恢複後查找程序1597,發現程序使用原來的程序号繼續運作。
實驗2:追蹤記憶體更改
實驗步驟概述:
為程式建立一個pre-dump存儲于chkp01
在上次快照的基礎上再建立一個pre-dume存儲于chkp02
在上次快照的基礎上再建立一個dump存儲于chkp03,并保持程式執行
在上次快照的基礎上再建立一個dump存儲于chkp04,終止程式
在第步的基礎上恢複程式運作
在第步的基礎上恢複程式運作
準備工作:
1)啟動測試程式:
./test_criu
2)另一個終端:建立儲存快照的檔案夾,檢視程序pid
mkdir chkp01
mkdir chkp02
mkdir chkp03
mkdir chkp04
mkdir chkp05
ps -ef | grep test_criu
開始實驗:
1)建立一個記憶體快照存儲于chkp01,打開記憶體更改追蹤,并保持程式執行
2)在步驟1快照的基礎上再建立一個pre-dume存儲于chkp02(在目标1的基礎上建立目标2的快照,可以減少系統開銷,減少程式執行時間,減少存儲占用空間)
criu pre-dump -j -D chkp02 -t --prev-images-dir chkp01
3)在步驟2快照的基礎上再建立一個dump存儲于chkp03,并保持程式執行
–track-mem:追蹤記憶體更改
–leave-running:不終止程式
4)在步驟3快照的基礎上再建立一個dump存儲于chkp04,終止程式
criu dump -j -D chkp04 -t --prev-images-dir chkp03
5)在步驟3的基礎上恢複程式運作
criu restore -j -D chkp03
6)在步驟4的基礎上恢複程式運作
kill -
criu restore -j -D chkp04
指令及參數說明:
dump:沒有别的參數的情況下,轉儲所有程序資訊并殺死程序
pre-dump:僅僅轉儲記憶體檔案,打開記憶體更改跟蹤,并保留程式運作
–track-mem:打開記憶體更改跟蹤
–prev-images-dir:指明上次檢查點的檔案路徑
–leave-running:讓程序繼續存活
小結:
1.追蹤記憶體更改的作用何在?
在做檢查點的時候,可能測試程式很大,檢查點很多,這樣就會産生一種結果,需要大量的存儲空間,以及大量的時間,為了節約資源,可以僅僅存儲某些改變了的記憶體頁(增量存儲),這樣就能節約大量的時間和空間。–stack-mem就能完成這個功能,它可以使後面執行的語句在使用–prev-images-dir的時候有機會發現沒有改變的記憶體頁,進而跳過這些頁的存儲。
【更專業的說明:https://criu.org/Memory_changes_tracking】
2.為什麼我們僅僅恢複了第三步和第四步的快照呢?
這是因為pre-dump 是不完整的快照,無法恢複,僅僅dump才可以恢複。它僅僅為了生成 –prev-images-dir 參數所需要的檔案