天天看點

Checkpoint:CRIU的使用實驗環境安裝實驗準備實驗1:簡單的dump和restore指令實驗2:追蹤記憶體更改

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 參數所需要的檔案

繼續閱讀