一種減少檢查點(diǎn)文件大小的方法
【專利摘要】本發(fā)明涉及容錯(cuò)技術(shù)中檢查點(diǎn)技術(shù)領(lǐng)域,提出了一種減少檢查點(diǎn)文件大小的方法。該方法是根據(jù)檢查點(diǎn)文件中存儲(chǔ)內(nèi)容的冗余性,采取不同的策略來達(dá)到最大限度的減少檢查點(diǎn)文件大小的目的。本發(fā)明將設(shè)置檢查點(diǎn)的程序分為兩類:單節(jié)點(diǎn)程序和分布式程序。圖一顯示了本發(fā)明在分布式程序中的原理示意圖。在進(jìn)行設(shè)置檢查點(diǎn)的時(shí)對(duì)于單節(jié)點(diǎn)程序和分布式程序采取如下方法:對(duì)單節(jié)點(diǎn)程序中的棧段采取Gzip壓縮+重復(fù)數(shù)據(jù)刪除的方法;在分布式程序中,堆棧段采取Gzip壓縮+重復(fù)數(shù)據(jù)刪除的方法,代碼段、動(dòng)態(tài)鏈接庫以及同一節(jié)點(diǎn)上的共享內(nèi)存采取只存儲(chǔ)一份內(nèi)容到其中一個(gè)節(jié)點(diǎn)的檢查點(diǎn)中,而其余的檢查點(diǎn)文件只存儲(chǔ)該內(nèi)容索引的方法。
【專利說明】
一種減少檢查點(diǎn)文件大小的方法
技術(shù)領(lǐng)域
[0001]本發(fā)明涉及容錯(cuò)技術(shù)中檢查點(diǎn)技術(shù)領(lǐng)域,特別是涉及減少檢查點(diǎn)文件的大小。具體涉及通過對(duì)檢查點(diǎn)文件中具體內(nèi)容的冗余性來制定不同的策略,最終通過消除檢查點(diǎn)文件中的冗余數(shù)據(jù)來達(dá)到減少檢查點(diǎn)文件大小的方法。
【背景技術(shù)】
[0002]隨著計(jì)算機(jī)硬件水平的不斷提高,促進(jìn)了高性能計(jì)算不斷的向前發(fā)展。而隨著機(jī)群系統(tǒng)的規(guī)模越來越大,機(jī)群系統(tǒng)發(fā)生故障的概率也不斷的上升。對(duì)于分布式系統(tǒng)和高性能計(jì)算來說,一個(gè)節(jié)點(diǎn)發(fā)生了故障將導(dǎo)致整個(gè)任務(wù)運(yùn)行失敗。這將帶來巨大的資源浪費(fèi),因此容錯(cuò)技術(shù)已經(jīng)成為避免造成資源的巨大浪費(fèi)的不可或缺的需求。
[0003]在分布式系統(tǒng)和高性能計(jì)算中,檢查點(diǎn)技術(shù)是提供錯(cuò)誤容忍的一個(gè)很重要的方式。檢查點(diǎn)技術(shù)是指在程序正常運(yùn)行時(shí),通過每隔一段時(shí)間進(jìn)行設(shè)置檢查點(diǎn),將程序正常運(yùn)行的狀態(tài)信息保存到穩(wěn)定的存儲(chǔ)設(shè)備中,如果此程序在接下來的運(yùn)行過程中發(fā)生了故障,那么可以從存儲(chǔ)設(shè)備中讀取前一個(gè)檢查點(diǎn)保存的檢查點(diǎn)文件中的狀態(tài)信息,使其卷回恢復(fù)繼續(xù)正確執(zhí)行。然而隨著計(jì)算規(guī)模的增大,檢查點(diǎn)的文件大小也會(huì)變大,同時(shí)也會(huì)頻繁的進(jìn)行設(shè)置檢查點(diǎn)。例如在1000個(gè)節(jié)點(diǎn)中,每個(gè)節(jié)點(diǎn)需要存儲(chǔ)IGB的內(nèi)存空間,那么每次設(shè)置檢查點(diǎn)將消耗ITB的存儲(chǔ)空間,這將會(huì)給存儲(chǔ)的可擴(kuò)展性帶來嚴(yán)峻的挑戰(zhàn)。
[0004]目前減少檢查點(diǎn)文件的大小主要有四個(gè)方法:增量檢查點(diǎn),內(nèi)存排除,檢查點(diǎn)壓縮,重復(fù)數(shù)據(jù)刪除。增量檢查點(diǎn)通過僅僅保存內(nèi)存中改變過的內(nèi)容來達(dá)到減少檢查點(diǎn)文件的目的。在恢復(fù)階段,程序狀態(tài)的信息通過獲取增量檢查點(diǎn)文件和最近一次保存的完全檢查點(diǎn)文件來進(jìn)行恢復(fù)。內(nèi)存排除是指通過跳過臨時(shí)或者未使用的緩存區(qū)來減少檢查點(diǎn)文件的大小。而檢查點(diǎn)壓縮則是最普遍使用的方法,它是先將程序的狀態(tài)信息進(jìn)行壓縮之后在保存到檢查點(diǎn)文件中。重復(fù)數(shù)據(jù)刪除技術(shù)是目前主流的存儲(chǔ)技術(shù),它通過刪除數(shù)據(jù)集中重復(fù)的數(shù)據(jù),只保留其中一份,從而消除冗余數(shù)據(jù)。在重復(fù)數(shù)據(jù)刪除技術(shù)中,首先是將數(shù)據(jù)文件分割為一組數(shù)據(jù)塊,為每個(gè)數(shù)據(jù)塊計(jì)算指紋,然后以指紋為關(guān)鍵字進(jìn)行Hash查找,匹配則表示該數(shù)據(jù)塊為重復(fù)數(shù)據(jù)塊,僅存儲(chǔ)數(shù)據(jù)塊索引號(hào),否則則表示該數(shù)據(jù)塊是一個(gè)新的唯一塊,對(duì)數(shù)據(jù)塊進(jìn)行存儲(chǔ)并創(chuàng)建相關(guān)的元信息。這樣,當(dāng)進(jìn)行讀取文件時(shí),首先讀取所有塊的元信息,根據(jù)元信息找到對(duì)應(yīng)塊的內(nèi)容,最后還原數(shù)據(jù)文件。這種技術(shù)可以很大程度上減少對(duì)物理存儲(chǔ)空間的需求,從而滿足日益增長的數(shù)據(jù)存儲(chǔ)需求。
[0005]在進(jìn)程地址空間中一般會(huì)涉及到5個(gè)不同的數(shù)據(jù)段,這5個(gè)數(shù)據(jù)段分別是:代碼段、數(shù)據(jù)段、BSS段、堆、棧。有研究對(duì)進(jìn)程的地址空間內(nèi)容進(jìn)程了實(shí)驗(yàn)分析[I],結(jié)果顯示了棧段中具有較高的冗余數(shù)據(jù),而代碼段、數(shù)據(jù)段、BSS段、堆則具有較高的壓縮率。這就給減少檢查點(diǎn)文件的大小提供了一個(gè)有效的方法。
【發(fā)明內(nèi)容】
[0006]本發(fā)明針對(duì)檢查點(diǎn)文件中不同數(shù)據(jù)內(nèi)容的冗余性來采取不同的處理方法,最終能夠最大程度的減少檢查點(diǎn)文件的大小。
[0007]本發(fā)明將應(yīng)用程序分為兩類:單節(jié)點(diǎn)程序和分布式程序。圖一顯示了本發(fā)明在分布式程序中的原理示意圖。本發(fā)明在單節(jié)點(diǎn)程序和分布式程序在使用檢查點(diǎn)技術(shù)時(shí)所采取的策略如下:
[0008]I)在單節(jié)點(diǎn)程序中,對(duì)進(jìn)程地址空間中的棧段采取重復(fù)數(shù)據(jù)刪除和Gzip壓縮的方法,對(duì)于其他需要存儲(chǔ)的部分均采用Gzip壓縮的方法。
[0009]2)在分布式程序中,由于不同進(jìn)程間的堆、棧段之間的冗余率比較大,對(duì)于堆、棧段采取重復(fù)數(shù)據(jù)刪除和Gzip壓縮的方法,而對(duì)于代碼段、動(dòng)態(tài)鏈接庫以及同一個(gè)節(jié)點(diǎn)上的共享內(nèi)存由于不同的進(jìn)程間的內(nèi)容都是相同的,故在所有的檢查點(diǎn)文件中只需要存儲(chǔ)一份內(nèi)容,其余的檢查點(diǎn)文件存儲(chǔ)該內(nèi)容的索引,最后進(jìn)行Gzip壓縮即可。
[0010]在設(shè)置檢查點(diǎn)時(shí),會(huì)將進(jìn)程的狀態(tài)信息保存到檢查點(diǎn)文件中。而在保存進(jìn)程地址空間中的內(nèi)容時(shí),將采用本發(fā)明的方法對(duì)進(jìn)程地址空間中的內(nèi)容進(jìn)行處理,最后保存至檢查點(diǎn)文件中。通過使用本發(fā)明的方法,可以很大程度的減少檢查點(diǎn)文件的大小。
【附圖說明】
[0011 ]圖1:本發(fā)明針對(duì)于分布式程序的原理示意圖.
[0012]圖2:應(yīng)用級(jí)檢查點(diǎn)系統(tǒng)構(gòu)架圖.
[0013]圖3:proc文件系統(tǒng)中的maps文件示意圖.
[0014]圖4:堆棧在檢查點(diǎn)文件中存儲(chǔ)的示意圖
【具體實(shí)施方式】
[0015]DMTCP是一個(gè)成熟的應(yīng)用級(jí)檢查點(diǎn)工具。其構(gòu)架圖如圖2所示。安裝好DMTCP之后,DMTCP會(huì)將檢查點(diǎn)功能編譯為一個(gè)鏈接庫。在使用檢查點(diǎn)時(shí),DMTCP會(huì)將該庫鏈接到應(yīng)用程序中。然后會(huì)在應(yīng)用的進(jìn)程中創(chuàng)建檢查點(diǎn)線程,并創(chuàng)建一個(gè)協(xié)調(diào)器進(jìn)程。協(xié)調(diào)器進(jìn)程用來保持各個(gè)進(jìn)程的狀態(tài)一致性。當(dāng)開始設(shè)置檢查點(diǎn)時(shí),協(xié)調(diào)器進(jìn)程會(huì)向每一個(gè)檢查點(diǎn)線程發(fā)送消息,檢查點(diǎn)線程接收到消息后,通過信號(hào)聯(lián)系用戶線程來暫停當(dāng)前的運(yùn)行。當(dāng)所有的用戶線程暫停運(yùn)行之后,檢查點(diǎn)線程開始保存用戶進(jìn)程的狀態(tài)信息到檢查點(diǎn)文件中。所有進(jìn)程的狀態(tài)信息保存到檢查點(diǎn)文件中之后,協(xié)調(diào)器通知各個(gè)檢查點(diǎn)線程,檢查點(diǎn)線程通過信號(hào)聯(lián)系用戶線程繼續(xù)運(yùn)行下去。
[0016]本發(fā)明在DMTCP中進(jìn)行了實(shí)現(xiàn)。實(shí)現(xiàn)中主要涉及的是對(duì)進(jìn)程地址空間中的內(nèi)容進(jìn)行處理。在DMTCP中,進(jìn)程地址空間中的內(nèi)容主要是從proc虛擬文件系統(tǒng)中的maps文件獲取。maps文件中的格式如圖3所示。在圖3中,從左到右是:該映射所在的地址空間、該映射的有關(guān)權(quán)限、偏移量、該映射文件所在的設(shè)備、文件的inode號(hào)、文件名。本發(fā)明在DMTCP中的實(shí)現(xiàn)主要由2部分構(gòu)成:I)檢查點(diǎn)設(shè)置階段,堆、棧段的處理模塊和代碼段、動(dòng)態(tài)庫以及共享內(nèi)存的處理模塊。2)檢查點(diǎn)恢復(fù)階段,對(duì)于堆、棧段、動(dòng)態(tài)庫以及共享內(nèi)存的恢復(fù)模塊。
[0017]下面是本發(fā)明在DMTCP中實(shí)現(xiàn)的幾個(gè)模塊描述:
[0018]1.檢查點(diǎn)設(shè)置階段堆、棧段的處理模塊
[0019]輸入:Memorydata
[°02°]說明:Memorydata是從內(nèi)存中讀取的堆或者桟的相關(guān)信息,即proc文件系統(tǒng)maps中每行的信息。圖4顯示了堆、棧在檢查點(diǎn)文件中存儲(chǔ)的示意圖。
[0021]步驟:
[0022]I)向協(xié)調(diào)器發(fā)送請(qǐng)求查詢?cè)搼?yīng)用是不是分布式程序。在使用檢查點(diǎn)時(shí),協(xié)調(diào)器會(huì)接收到各個(gè)進(jìn)程發(fā)送過來的連接信息,協(xié)調(diào)器收集到每個(gè)進(jìn)程運(yùn)行的程序名,當(dāng)相同程序名的數(shù)量大于2時(shí),則表明當(dāng)前運(yùn)行程序是分布式程序。
[0023]2)如果該應(yīng)用不是分布式程序,則使用普通的數(shù)據(jù)去冗余算法,算法結(jié)束。
[0024]3)如果該應(yīng)用是分布式程序,按照4KB大小將Memorydata內(nèi)存地址進(jìn)行分塊,并計(jì)算每一塊內(nèi)容的哈希值,繼續(xù)下面的步驟。當(dāng)數(shù)據(jù)塊不能被劃分時(shí),存儲(chǔ)該內(nèi)存數(shù)據(jù)的元數(shù)據(jù)信息,以便以后進(jìn)行恢復(fù),算法結(jié)束。
[0025]4)如果該哈希值存在于本地哈希庫,表明該塊不是唯一塊,不需要進(jìn)行存儲(chǔ),接著從本地哈希庫中獲取該塊所對(duì)應(yīng)的唯一塊的塊號(hào)并記錄起來。跳至步驟3。
[0026]5)如果該哈希值在本地哈希庫中不存在,那么發(fā)送信息到協(xié)調(diào)器,查詢?cè)搲K是否存在于其他的節(jié)點(diǎn)上。
[0027]6)如果該塊存在于其他的節(jié)點(diǎn)上,那么從協(xié)調(diào)器獲取該塊的索引信息。跳至步驟8。
[0028]7)如果該塊不存在于其他節(jié)點(diǎn)上,那么表示該塊是唯一塊,直接存儲(chǔ)該塊的內(nèi)容至IJ檢查點(diǎn)文件中,并生成該塊的索引信息,將塊的索引信息上傳到協(xié)調(diào)器。塊的索引信息包括該塊所在的檢查點(diǎn)文件名和唯一塊的塊號(hào)。跳至步驟8。
[0029]8)將索引信息添加到本地的哈希庫并將塊的數(shù)目加I,最后將該塊的哈希值添加到本地哈希庫中。跳至步驟3。
[0030]2.檢查點(diǎn)設(shè)置階段動(dòng)態(tài)鏈接庫、代碼段以及同一個(gè)節(jié)點(diǎn)上的共享內(nèi)存處理模塊
[0031]輸入:Memorydata
[0032]說明=Memorydata是從內(nèi)存中讀取的動(dòng)態(tài)鏈接庫、代碼段以及共享內(nèi)存的相關(guān)信息,即proc文件系統(tǒng)maps中每行的信息。
[0033]步驟:
[0034]I)向協(xié)調(diào)器發(fā)送請(qǐng)求查詢?cè)撛搼?yīng)用是不是分布式程序。
[0035]2)如果該應(yīng)用不是分布式程序,那么算法結(jié)束,轉(zhuǎn)向正常的處理流程。
[0036]3)如果該應(yīng)用是分布式程序,那么向協(xié)調(diào)器發(fā)送信息,查詢?cè)摂?shù)據(jù)名是否存在于協(xié)調(diào)器上。
[0037]4 )如果該數(shù)據(jù)名不存在于協(xié)調(diào)器上,那么直接存儲(chǔ)該數(shù)據(jù)信息并將Memorydata.flag標(biāo)記為I,表示該塊信息內(nèi)容存儲(chǔ)的是內(nèi)容而不是索引。然后上傳索引信息至協(xié)調(diào)器,用于其他節(jié)點(diǎn)的查詢。如果該數(shù)據(jù)名存在于協(xié)調(diào)器上,那么需要從協(xié)調(diào)器下載該數(shù)據(jù)的索引信息,然后將索引信息保存到檢查點(diǎn)文件中。
[0038]3.對(duì)于堆、棧段、代碼段、動(dòng)態(tài)庫以及共享內(nèi)存的恢復(fù)模塊
[0039]輸入:Fd
[0040]說明:Fd是打開的檢查點(diǎn)文件描述符。在進(jìn)行檢查點(diǎn)恢復(fù)階段,會(huì)打開檢查點(diǎn)文件,從檢查點(diǎn)文件中讀取內(nèi)容然后重新映射到內(nèi)存中去,當(dāng)讀取的內(nèi)容是堆、棧、代碼段、動(dòng)態(tài)庫和共享內(nèi)存的頭信息時(shí),開始下面的算法。
[0041 ]步驟:
[0042]I)首先檢查該恢復(fù)程序是否是分布式程序,如果該不是分布式程序,那么算法結(jié)束,跳至正常的檢查點(diǎn)恢復(fù)處理。如果是分布式程序,那么自身進(jìn)程創(chuàng)建一個(gè)監(jiān)聽線程,該監(jiān)聽線程用來監(jiān)聽從其他節(jié)點(diǎn)發(fā)送過來的請(qǐng)求信息,并將監(jiān)聽線程的相關(guān)信息上傳到協(xié)調(diào)器,進(jìn)行注冊(cè)。
[0043]2)當(dāng)所有的進(jìn)程都在協(xié)調(diào)器注冊(cè)成功后,協(xié)調(diào)器會(huì)將所有的監(jiān)聽線程信息匯總發(fā)送回各個(gè)恢復(fù)進(jìn)程。
[0044]3)從檢查點(diǎn)文件中讀取頭文件信息。
[0045]4)如果讀取的頭文件信息中顯示該部分是共享內(nèi)存并且存儲(chǔ)內(nèi)容是索引信息,這就表示該共享內(nèi)存的內(nèi)容保存在索引信息中的檢查點(diǎn)文件中。那么只需要打開本地的索引信息中的檢查點(diǎn)文件,定位到指定的位置,然后讀取相應(yīng)的內(nèi)容。
[0046]5)如果讀取的頭文件信息中顯示該部分是堆、棧段,那么首先需要恢復(fù)堆、棧段的內(nèi)容。首先讀取堆、棧段的元信息,根據(jù)元信息讀取每一塊所對(duì)應(yīng)的唯一塊內(nèi)容,如果唯一塊中的內(nèi)容顯示該塊的內(nèi)容在其他檢查點(diǎn)文件上,那么就需要向該檢查點(diǎn)所在的進(jìn)程拿取相應(yīng)的內(nèi)容。需要向該進(jìn)程的監(jiān)聽線程發(fā)送請(qǐng)求,該進(jìn)程的監(jiān)聽線程收到請(qǐng)求信息后,根據(jù)索引信息找到相應(yīng)的內(nèi)容數(shù)據(jù),然后將這些內(nèi)容數(shù)據(jù)發(fā)送回請(qǐng)求進(jìn)程。
[0047]6)如果讀取頭文件信息中顯示的是代碼段和動(dòng)態(tài)庫,跟堆、棧段的恢復(fù)一樣,如果讀取到的內(nèi)容是索引信息,那么就需要向該內(nèi)容所在的進(jìn)程拿取相應(yīng)的內(nèi)容。
[0048]7)將讀取到的內(nèi)容映射到相應(yīng)內(nèi)存地址中。
[0049]參考文獻(xiàn)
[0050][I]Rai A,Ramjee R,Anand A,et al.MiG:Efficient Migrat1n of DesktopVMs Using Semantic Compress1n[C]//USENIX Annual Technical Conference.2013:25-36o
【主權(quán)項(xiàng)】
1.一種減少檢查點(diǎn)文件大小的方法,其特征是:針對(duì)檢查點(diǎn)文件中不同數(shù)據(jù)內(nèi)容的冗余性來采取不同的處理方法,最終達(dá)到最大限度的減少檢查點(diǎn)文件大小的目的。2.根據(jù)權(quán)利要求1所述的方法,其特征是:在單節(jié)點(diǎn)的應(yīng)用程序設(shè)置檢查點(diǎn)時(shí),為了減少檢查點(diǎn)文件的大小,進(jìn)程的棧段采取Gzip壓縮+重復(fù)數(shù)據(jù)刪除的方法,而其他的部分采用Gz ip壓縮的方法。3.根據(jù)權(quán)利要求1所述的方法,其特征是:在分布式程序設(shè)置檢查點(diǎn)時(shí),為了減少檢查點(diǎn)文件的大小,進(jìn)程的堆棧段采取Gzip壓縮+重復(fù)數(shù)據(jù)刪除的方法,代碼段、動(dòng)態(tài)鏈接庫、同一節(jié)點(diǎn)上的共享內(nèi)存采取只存儲(chǔ)一份內(nèi)容到一個(gè)檢查點(diǎn)文件中而其他的檢查點(diǎn)文件只存儲(chǔ)索引信息,其他的部分采用Gzip壓縮的方法。
【文檔編號(hào)】G06F11/07GK105930223SQ201610257288
【公開日】2016年9月7日
【申請(qǐng)日】2016年4月24日
【發(fā)明人】孫建華, 陳政宇, 劉俊
【申請(qǐng)人】湖南大學(xué)