陳雙喜,趙若琰,劉會,吳春明,阮偉
(1. 浙江大學(xué),浙江 杭州 310058;2. 嘉興職業(yè)技術(shù)學(xué)院,浙江 嘉興 314036; 3. 嘉興市工業(yè)互聯(lián)網(wǎng)安全重點實驗室,浙江 嘉興 314036)
云計算的思想源于20世紀(jì) 60 年代,真正進(jìn)入大眾視野是在 2006 年 8 月, 由 Amazon 子公司 Amazon Web Service(AWS)推出第一款云計算產(chǎn)品 Elastic Compute Cloud[1]。近年來,隨著云計算的蓬勃發(fā)展,網(wǎng)絡(luò)服務(wù)功能和占比總量快速增加,云計算技術(shù)受到了廣泛關(guān)注和應(yīng)用,其中最重要的是虛擬化技術(shù)。虛擬化技術(shù)是一種在計算機(jī)物理資源之上抽象并進(jìn)行有效管理的技術(shù)[2]。目前常見的虛擬化管理工具有 VMware[3]、KVM[4]、Xen[5]、Hyper-V[6],借助虛擬化技術(shù)能提供比原先多臺物理主機(jī)更有效的計算,同時還能節(jié)省硬件成本和降低能源損耗。虛擬機(jī)遷移大體可以分為兩種,分別為靜態(tài)遷移(non-live migration)和動態(tài)遷移 (live migration),本文著重討論虛擬機(jī)的動態(tài)遷移。目前,虛擬機(jī)動態(tài)遷移有兩種常用的算法:Pre-Copy(預(yù)拷貝)和Post-Copy(后拷貝)。不同算法有不同的特點,預(yù)拷貝遷移算法的停機(jī)時間較短,但是其迭代復(fù)制的操作,可能會導(dǎo)致遷移過程無法收斂,總體遷移時間過長;后拷貝遷移算法的停機(jī)時間短,總體遷移時間穩(wěn)定,但虛擬機(jī)在遷移過程中會出現(xiàn)缺頁錯誤導(dǎo)致虛擬機(jī)性能下降,并且整個遷移過程缺乏穩(wěn)定性[7]。 綜上所述,虛擬機(jī)的動態(tài)遷移在云計算領(lǐng)域有特殊的地位,各種動態(tài)遷移算法還存在許多亟待解決的問題,因此研究優(yōu)化動態(tài)遷移算法,對解決現(xiàn)有算法存在的問題具有十分重要的意義。
主流動態(tài)遷移算法中,預(yù)拷貝遷移算法被研究得相對較多。預(yù)拷貝遷移算法由Clark等[8]在 2005 年首次提出,如今大多數(shù)虛擬機(jī)管理程序,例如 Xen、 KVM 和 VMware,都將預(yù)拷貝作為默認(rèn)的虛擬機(jī)遷移算法。預(yù)拷貝遷移算法的問題在于,面對寫密集型程序,內(nèi)存不斷被寫入形成大量臟頁,遷移過程中會將同樣一個頁面?zhèn)鬏敹啻?,且有可能整個過程無法收斂,因此大部分的研究著重解決這個問題。后拷貝遷移算法由于其實現(xiàn)相對復(fù)雜,算法中存在的問題比較突出,可優(yōu)化的點較多,近年來成為了國內(nèi)外研究的重點。針對后拷貝遷移算法存在的問題, 研究主要分為兩個方向:減少缺頁錯誤和容錯機(jī)制。為了減少后拷貝遷移中缺頁錯誤產(chǎn)生的次數(shù),Chashoo等[9]研究了將預(yù)拷貝的思想引入后拷貝中,提出了一種使用內(nèi)存膨脹技術(shù),內(nèi)存膨脹技術(shù)可以在需要時減少空閑頁面和未使用頁面從而減少虛擬機(jī)內(nèi)存頁面的數(shù)量,使得源端虛擬機(jī)需要傳輸?shù)侥繕?biāo)端虛擬機(jī)的頁面數(shù)減少,降低內(nèi)存利用率。Shan等[10]在 Xen 上設(shè)計并實現(xiàn)了遠(yuǎn)程頁表助手(remote page table assistant)的功能,當(dāng)發(fā)生缺頁錯誤時,Xen通過該功能直接獲取當(dāng)前虛擬機(jī)是否正在遷移的信息,當(dāng)虛擬機(jī)正常運行時,Xen忽略虛擬機(jī)監(jiān)視程序的判斷過程,并快速調(diào)用預(yù)設(shè)的缺頁處理函數(shù)處理缺頁錯誤。Su等[11]提出了一種遠(yuǎn)程缺頁錯誤過濾器(RPFF),在后拷貝遷移過程中,通過將客戶程序的內(nèi)存頁面重寫操作請求重定向到一塊新分配的本地內(nèi)存中,從而消除了不必要的缺頁錯誤,避免從源端虛擬機(jī)獲取頁面,減少因為重寫造成缺頁錯誤所帶來的額外消耗,特別強(qiáng)調(diào)針對內(nèi)存寫入密集型的工作負(fù)載,其整體性能會有極大提高。Jalaei 等[12]通過降低后拷貝遷移算法中虛擬 CPU 的執(zhí)行速度,將目標(biāo)端虛擬機(jī)中的頁面處理速度與源端虛擬機(jī)的頁面?zhèn)鬏斔俣绕胶?,從而降低缺頁錯誤產(chǎn)生的次數(shù)。孫淑嫻[13]提出通過預(yù)先執(zhí)行虛擬機(jī)程序預(yù)測目標(biāo)端虛擬機(jī)將要訪問的內(nèi)存頁面,提前傳輸?shù)侥繕?biāo)端虛擬機(jī)從而降低缺頁錯誤率,并利用局部性原理動態(tài)調(diào)整所需傳輸?shù)捻撁鏀?shù)量。對于后拷貝遷移的容錯機(jī)制,現(xiàn)有的研究還比較少,目前的研究方向主要基于檢查點,檢查點簡單來說是一種備份記錄的方法,通過檢查點記錄虛擬機(jī)歷史的狀態(tài)。Fernando 等[14]提出了一種反向連續(xù)檢查點技術(shù),通過設(shè)置檢查點定期記錄虛擬機(jī)的增量狀態(tài)變化信息,當(dāng)虛擬機(jī)出現(xiàn)故障時可以由保存的最新檢查點狀態(tài)進(jìn)行虛擬機(jī)狀態(tài)的恢復(fù)。Chou等[15]提出一種基于檢查點和FAM(fabric- attached memory)的后拷貝遷移算法,F(xiàn)AM是一種特殊的可以使內(nèi)存進(jìn)行光纖級通信的機(jī)制,通過將整個遷移過程的內(nèi)存空間映射到FAM,將數(shù)據(jù)通信簡化成內(nèi)存語義,極大地減少了缺頁錯誤的處理時間,并使用Linux 開源檢查點工具 CRIU 實現(xiàn)了檢查點的功能。
可以看出,目前針對后拷貝遷移優(yōu)化研究相對較少,雖然取得了一定的成果,但是仍然有許多地方值得挖掘,無論解決缺頁錯誤問題還是容錯機(jī)制都存在很大的提升空間,因此針對該領(lǐng)域的研究是很有挑戰(zhàn)且充滿意義的工作。本文通過分析后拷貝遷移算法中存在的穩(wěn)定性問題進(jìn)行深入研究和分析,提出了基于事件同步的故障容錯方法,結(jié)合檢查點與事件同步技術(shù)實現(xiàn)了故障場景檢測以及對應(yīng)場景的故障恢復(fù)。
后拷貝遷移算法的基本流程如圖1所示。在整個遷移過程中,源端虛擬機(jī)和目標(biāo)端虛擬機(jī)主要在兩個階段進(jìn)行數(shù)據(jù)交互。
圖1 后拷貝遷移算法的基本流程
? 第一階段:在遷移之初,通過暫停源端虛擬機(jī),將必要的CPU狀態(tài)和設(shè)備信息傳輸?shù)侥繕?biāo)端虛擬機(jī),由目標(biāo)端虛擬機(jī)繼承并恢復(fù)運行被暫停的虛擬機(jī)狀態(tài)。
? 第二階段:在遷移過程中,由暫停的源端虛擬機(jī)主動傳輸剩余的內(nèi)存頁面到目標(biāo)端虛擬機(jī)。當(dāng)目標(biāo)端虛擬機(jī)正常運行的過程中出現(xiàn)缺頁錯誤時,將發(fā)送請求到源端虛擬機(jī),請求提前獲取缺失的內(nèi)存頁面。
遷移機(jī)制本身的穩(wěn)定性是虛擬機(jī)動態(tài)遷移算法優(yōu)劣評價標(biāo)準(zhǔn)中一項重要的考慮因素。遷移過程中虛擬機(jī)的狀態(tài)分別分布在兩臺虛擬機(jī)上,源端虛擬機(jī)擁有內(nèi)存頁面,而目標(biāo)端虛擬機(jī)擁有正在運行的虛擬機(jī)上下文信息,總體呈現(xiàn)一種割裂的狀態(tài),因此保證兩臺虛擬機(jī)之間數(shù)據(jù)交互渠道的穩(wěn)定性至關(guān)重要。但是在虛擬機(jī)實際運行過程中,很可能頻繁受到攻擊,特別在遷移過程中受到攻擊的影響更大。虛擬機(jī)遷移可能持續(xù)幾秒到幾分鐘不等,導(dǎo)致漏洞被攻擊的窗口可能性很大[14]。因此原始的后拷貝遷移算法中兩臺虛擬機(jī)的交互渠道不能保證絕對的可靠。
后拷貝遷移過程中虛擬機(jī)的最新狀態(tài)分布如圖2所示。虛擬機(jī)的最新狀態(tài)分別存在于源端虛擬機(jī)和目標(biāo)端虛擬機(jī)之上,目標(biāo)端虛擬機(jī)具有最新的虛擬機(jī) CPU 運行狀態(tài)、設(shè)備信息和內(nèi)存頁面的部分子集,而源端虛擬機(jī)具有尚未發(fā)送到目標(biāo)端主機(jī)的剩余內(nèi)存面。如果目標(biāo)端虛擬機(jī)出現(xiàn)故障,此時虛擬機(jī)的CPU 狀態(tài)、設(shè)備狀態(tài)和已經(jīng)傳輸?shù)侥繕?biāo)端虛擬機(jī)的內(nèi)存頁面將丟失,并且由于源端虛擬機(jī)上并沒有可以支持虛擬機(jī)重新運行的相關(guān)數(shù)據(jù),不僅會導(dǎo)致后拷貝遷移失敗,還會造成虛擬機(jī)和使用虛擬機(jī)服務(wù)的用戶程序丟失。而如果源端虛擬機(jī)出現(xiàn)故障,目標(biāo)端虛擬機(jī)也會因為當(dāng)發(fā)生缺頁錯誤時無法請求源端虛擬機(jī)對應(yīng)的內(nèi)存頁面,一直處于暫停等待的狀態(tài),導(dǎo)致整個遷移過程陷入停滯,最終導(dǎo)致遷移失敗。
圖2 虛擬機(jī)最新狀態(tài)分布
對于穩(wěn)定性問題,通過分析發(fā)現(xiàn)無論是源端虛 擬機(jī)的故障還是目標(biāo)端虛擬機(jī)的故障,都會導(dǎo)致后拷貝遷移的失敗,因此本文對兩種虛擬機(jī)故障場景提出對應(yīng)的容錯解決策略,具體采用檢查點與幀同步相結(jié)合的方式,通過記錄檢查點確定故障恢復(fù)的起始狀態(tài),利用幀同步對可能發(fā)生的不確定性事件進(jìn)行同步重播。并且為使用更少的虛擬機(jī)資源減少額外開銷,選擇在不增加額外的備份虛擬機(jī)基礎(chǔ)上進(jìn)行故障容錯。優(yōu)化方案設(shè)計如圖3所示。
圖3 優(yōu)化方案設(shè)計
針對后拷貝遷移算法中存在的穩(wěn)定性問題,提出了基于事件同步的故障容錯方法,首先介紹了基本的故障容錯架構(gòu),其次針對技術(shù)細(xì)節(jié)的實現(xiàn)進(jìn)行闡述,最后對典型的故障場景進(jìn)行分析并提出了對應(yīng)的故障恢復(fù)方案。
基于事件同步的故障容錯方法,在QEMU-KVM平臺基礎(chǔ)上進(jìn)行修改實驗,主要目的是為后拷貝遷移提供故障容錯機(jī)制,保證當(dāng)源端虛擬機(jī)或目標(biāo)端虛擬機(jī)出現(xiàn)故障時,對應(yīng)的虛擬機(jī)狀態(tài)不會丟失。本文方法實現(xiàn)的關(guān)鍵點主要可以分為不確定事件的記錄和同步、增量式檢查點的記錄、數(shù)據(jù)的傳輸與存儲、故障檢測及修復(fù)。
首先需要知道如何正確記錄所有的不確定性事件。就整個 QEMU-KVM 平臺而言,不確定性事件等同于記錄不確定性敏感指令,即會對當(dāng)前宿主機(jī)行為造成影響的指令。當(dāng)虛擬機(jī)需要執(zhí)行指令時,會觸發(fā) VM exit,由非根模式進(jìn)入根模式進(jìn)行對應(yīng)的處理操作。在后拷貝遷移過程中,可能會造成行為發(fā)生變化的不確定性敏感指令可分為4種類型:中斷、PIO(programmed I/O)、MMIO(memory mapped I/O)和缺頁錯誤訪存指令。除了需要記錄不確定性事件具體的操作指令和相關(guān)數(shù)據(jù),還需要正確記錄指令發(fā)生的時間點。記錄指令發(fā)生的時間點等同于記錄一段時間內(nèi) CPU 總共執(zhí)行的指令次數(shù),但是由于指令次數(shù)沒有特定的 CPU 寄存器保存,無法直接從基本的寄存器中取到,因此需要額外的操作獲取執(zhí)行的指令次數(shù)。
當(dāng)遷移過程發(fā)生故障時,如果從虛擬機(jī)的最初狀態(tài)開始進(jìn)行恢復(fù),除了需要保存大量的事件信息,還會導(dǎo)致恢復(fù)所花費的時間過長。因此本文在目標(biāo)端虛擬機(jī)運行過程中引入檢查點機(jī)制,檢查點與檢查點之間定義為一個回合,將整個運行過程劃分為多個獨立的回合。記錄每個回合開始的檢查點以及當(dāng)前回合內(nèi)發(fā)生不確定性事件的相對時間點,當(dāng)出現(xiàn)故障需要進(jìn)行恢復(fù)時,可以從距離當(dāng)前錯誤時間點最近的上一個檢查點開始進(jìn)行具體的恢復(fù)流程。
事實上,在虛擬機(jī)實際運行過程中,大多數(shù)的內(nèi)存頁面是保持不變的,如果只記錄產(chǎn)生變化的內(nèi)存頁面,就能有效降低總體的快照消耗。對于內(nèi)存 1 GB 的虛擬機(jī),CPU 狀態(tài)和設(shè)備狀態(tài)只占約 600 KB,因此對于占比較少的CPU 狀態(tài)和設(shè)備狀態(tài)選擇直接進(jìn)行記錄,不做增量的計算,只對內(nèi)存狀態(tài)的增量變化進(jìn)行記錄。內(nèi)存狀態(tài)的增量變化情況如圖4所示。
圖4 內(nèi)存狀態(tài)的增量變化情況
記錄內(nèi)存狀態(tài)的增量變化,需要獲取當(dāng)前檢查點相對于上一個檢查點時的內(nèi)存頁面寫臟情況,利用 KVM 內(nèi)核提供的寫保護(hù)機(jī)制可以完成對臟頁情況的追蹤。增量式檢查點記錄的起點位于后拷貝遷移開始前,由源端虛擬機(jī)記錄完整的內(nèi)存狀態(tài)保存到共享磁盤。當(dāng)遷移開始后,目標(biāo)端虛擬機(jī)接管虛擬機(jī)狀態(tài)并開啟臟頁同步,通過內(nèi)核定時器定時記錄 CPU、設(shè)備狀態(tài)和內(nèi)存增量變化,構(gòu)建相應(yīng)的檢查點數(shù)據(jù)并進(jìn)行傳輸和保存。當(dāng)故障發(fā)生時會從最初的完整內(nèi)存數(shù)據(jù)開始,按順序?qū)γ總€增量式檢查點進(jìn)行同步,直到同步到最后一個檢查點為止。但是順序同步檢查點數(shù)據(jù)可能帶來重復(fù)的頁面讀寫,因為內(nèi)存頁面很可能在多個檢查點被記錄。因此,針對這一問題使用哈希圖的方式,保存每一個頁面被記錄最新的檢查點編號。在進(jìn)行故障恢復(fù)時,可以通過哈希圖對每個頁面只同步一次,從而減少冗余的內(nèi)存數(shù)據(jù)讀取,減少故障恢復(fù)時間。
對于記錄的不確定性事件信息與檢查點信息,需要使用合理的數(shù)據(jù)格式保存到合適的數(shù)據(jù)存儲工具中,以便在故障恢復(fù)時能夠及時獲取需要的數(shù)據(jù)。檢查點與不確定性事件的傳輸流程如圖5所示。具體而言,由 QEMU 通過kvm_ vm_ioctl(KVM_GET_DIRTY_LOG)系統(tǒng)調(diào)用設(shè)置內(nèi)核定時器,定時觸發(fā)VM exit 使客戶程序退出非根模式開始記錄檢查點數(shù)據(jù),QEMU 獲取內(nèi)核數(shù)據(jù)通過內(nèi)存映射的方式實現(xiàn)。
圖5 檢查點與不確定事件數(shù)據(jù)傳輸流程
相鄰檢查點之間作為一個回合。每個回合之初,記錄 CPU、設(shè)備狀態(tài)以及內(nèi)存頁面增量變化,構(gòu)建檢查點數(shù)據(jù),傳輸檢查點數(shù)據(jù)到Redis服務(wù)器,并重新設(shè)置內(nèi)核定時器以便進(jìn)行下一次檢查點的記錄。每個回合中,當(dāng)客戶程序產(chǎn)生不確定性事件時,記錄不確定性事件的信息和發(fā)生的時間點,構(gòu)建不確定性事件數(shù)據(jù)。為了避免每次發(fā)生不確定性事件都進(jìn)行一次數(shù)據(jù)傳輸,通過創(chuàng)建內(nèi)核事件緩沖區(qū)緩存不確定性事件,當(dāng)事件緩沖區(qū)已滿或者當(dāng)前為輸出事件時,將緩存的所有事件一并傳輸?shù)?Redis 服務(wù)器。每個回合結(jié)束即觸發(fā)定時器開始下一個檢查點回合時,會將事件緩沖區(qū)清空。每個回合重復(fù)上述流程對檢查點數(shù)據(jù)與不確定性事件數(shù)據(jù)進(jìn)行存儲,直到遷移過程結(jié)束或者遷移出現(xiàn)故障開始對應(yīng)的恢復(fù)流程。
后拷貝遷移過程中可能出現(xiàn)的故障錯誤包括源端虛擬機(jī)故障、目標(biāo)端虛擬機(jī)故障和網(wǎng)絡(luò)故障。對于源端虛擬機(jī)故障恢復(fù),此時目標(biāo)端虛擬機(jī)仍處于運行狀態(tài)但后拷貝遷移過程被中斷,導(dǎo)致部分內(nèi)存頁面仍未傳輸?shù)侥繕?biāo)端虛擬機(jī),當(dāng)目標(biāo)端虛擬機(jī)再次出現(xiàn)缺頁錯誤時無法請求對應(yīng)的頁面。因此目標(biāo)端虛擬機(jī)需要在產(chǎn)生缺頁錯誤時檢測源端虛擬機(jī)是否正常,如果檢測源端虛擬機(jī)故障,那么不再記錄不確定性事件和檢查點信息,直接從共享磁盤中,讀取后拷貝遷移開始時由源端虛擬機(jī)保存的最初的內(nèi)存頁面狀態(tài),并將仍未傳輸?shù)侥繕?biāo)端虛擬機(jī)上的內(nèi)存頁面進(jìn)行同步。整個過程完成后代表源端虛擬機(jī)故障的情況成功恢復(fù),同時也代表后拷貝遷移完成。
對于目標(biāo)端虛擬機(jī)的故障。此時需要由源端虛擬機(jī)接管虛擬機(jī)的運行狀態(tài),相較源端虛擬機(jī)故障恢復(fù)過程會更復(fù)雜?;静襟E是,源端虛擬機(jī)讀取歷史增量式檢查點信息,載入檢查點中保存的 CPU 狀態(tài)、設(shè)備狀態(tài)和內(nèi)存狀態(tài)到虛擬機(jī)之中,載入完畢后開始進(jìn)行不確定性事件的同步。要進(jìn)行不確定性事件的同步重播,意味著在正確的指令執(zhí)行時間點暫??蛻魴C(jī)程序插入對應(yīng)的事件指令,其重點在于如何正確進(jìn)行事件指令的插入。
對于網(wǎng)絡(luò)故障的檢測與恢復(fù),無論上述兩種虛擬機(jī)故障還是網(wǎng)絡(luò)故障的檢測,采用的方法都是一致的。對于源端虛擬機(jī)和目標(biāo)端虛擬機(jī),互相使用心跳機(jī)制發(fā)送 UDP 報文檢測對方是否出現(xiàn)故障。
本文的實驗環(huán)境為兩臺物理主機(jī)配合一臺交換機(jī)所連接的虛擬化平臺,其中一臺作為源端主機(jī),另一臺作為目標(biāo)端主機(jī),分別于對應(yīng)主機(jī)上創(chuàng)建虛擬機(jī)進(jìn)行遷移實驗。此外源端主機(jī)還作為 NFS 服務(wù)器和 Redis 服務(wù)器,提供虛擬機(jī)的共享存儲服務(wù)與故障容錯數(shù)據(jù)的緩存服務(wù),實驗網(wǎng)絡(luò)架構(gòu)如圖 6 所示。
圖6 實驗網(wǎng)絡(luò)架構(gòu)
兩臺實體主機(jī)的配置完全一致,分別配備了 Intel(R) Core(TM) i5-10400F 2.90 GHz 處理器, 8 GB 內(nèi)存,RTL8125吉比特以太網(wǎng)卡,250 GB M2 固態(tài)硬盤,以及 Ubuntu-16.04-desktop-amd64 操作系統(tǒng)。兩臺主機(jī)均通過 Bios 開啟 Intel-VT 硬 件虛擬化服務(wù),并通過吉比特交換機(jī)進(jìn)行數(shù)據(jù)傳輸。其中,源端主機(jī)作為 NFS 系統(tǒng)服務(wù)器,存放修改后的 QEMU-KVM 虛擬機(jī)代碼與磁盤鏡像,并將對應(yīng)的 NFS 文件夾掛載到另一臺主機(jī)實現(xiàn)共享存儲。宿主機(jī)上創(chuàng)建的虛擬機(jī),使用相同的 IMG 磁盤鏡像,均配置一個虛擬CPU。
虛擬機(jī)通過橋接網(wǎng)絡(luò)的形式,獲取獨立的 IP 地址與外界進(jìn)行網(wǎng)絡(luò)通信。測試基于事件同步的故障容錯方法。故障容錯方法通過定時任務(wù)的方式,每間隔一段時間記錄檢查點和不確定性事件數(shù)據(jù)。引入故障容錯方法必然會對正在運行的客戶程序性能造成一定的影響,因此需要通過實驗測試并選擇合適的數(shù)據(jù)記錄間隔時間,盡可能降低對性能的影響。具體測試的內(nèi)容有平均每回合記錄數(shù)據(jù)的時間消耗、整個遷移過程中記錄數(shù)據(jù)的時間消耗、平均故障恢復(fù)時間以及故障容錯方法對客戶程序性能的影響。
實驗負(fù)載分別為SPECjbb2005、kernel-build、netperf和sysbench-oltp,具體的實驗負(fù)載說明如下。
(1)SPECjbb2005:用于測試工業(yè)級 Java 應(yīng)用性能的基準(zhǔn)測試工具,通過修改 SPECCjbb. props 文件設(shè)置測試線程的并發(fā)數(shù)量,通過生成高并發(fā)業(yè)務(wù)操作測試 Java 應(yīng)用的處理能力。屬于CPU 密集型程序,同時伴隨有少量的 I/O 操作。
(2)kernel-build:使用單線程編譯 Linux-3.1.0 版本的內(nèi)核代碼,內(nèi)核編譯屬于可以測試綜合性能的平衡型程序。
(3)netperf:netperf 基于服務(wù)器/客戶端模式,通過 TCP 和 UDP 傳輸,對不同網(wǎng)絡(luò)傳輸方式的性能進(jìn)行測試。其中,以 netserver 作為服務(wù)端監(jiān)聽客戶端請求,netperf 本身作為客戶端向服務(wù)端發(fā)起網(wǎng)絡(luò)測試。通過配置建立連接,使用不同的網(wǎng)絡(luò)傳輸方式傳遞數(shù)據(jù)測試網(wǎng)絡(luò)性能。實驗中通過每次連接都重新創(chuàng)建 TCP 連接模擬 HTTP 的訪問模式,模擬大量的網(wǎng)絡(luò) I/O 操作,屬于網(wǎng)絡(luò) I/O 密集型程序。
(4)sysbench-oltp:sysbench 是一種多功能的基準(zhǔn)測試工具,可以用于測試模擬不同系統(tǒng)參數(shù)下的數(shù)據(jù)庫負(fù)載情況。實驗中使用 OLTP 基準(zhǔn)測試,測試 MySQL數(shù)據(jù)庫的聯(lián)機(jī)事物處理性能,模擬大量訪問數(shù)據(jù)庫的磁盤 I/O 操作,屬于磁盤 I/O 密集型程序。
不同負(fù)載下平均每回合數(shù)據(jù)記錄時間消耗如圖7所示。平均每回合數(shù)據(jù)記錄所需的時間與數(shù)據(jù)記錄的間隔時間長度成正比。主要原因是,數(shù)據(jù)記錄的時間取決于記錄間隔時間內(nèi)產(chǎn)生的臟頁和不確定性事件數(shù)量,因此數(shù)據(jù)量越多,記錄所需要花費的時間越長。但是間隔時間短反而會導(dǎo)致記錄的回合數(shù)更多,單從平均每回合的數(shù)據(jù)記錄時間來看,并不能決定最合適的數(shù)據(jù)記錄間隔時間,因此還需要對比整個遷移過程中記錄數(shù)據(jù)的時間消耗。
圖7 不同負(fù)載下平均每回合數(shù)據(jù)記錄時間消耗
不同負(fù)載下整個遷移過程中記錄數(shù)據(jù)的時間消耗如圖8所示。由圖8中可以看出,隨著數(shù)據(jù)記錄間隔時間的增長,數(shù)據(jù)記錄所消耗的總時間呈下降趨勢。這是因為,數(shù)據(jù)記錄間隔的時間越短,同步臟頁位圖與不確定性事件的頻率越高,導(dǎo)致整個遷移過程中需要記錄的數(shù)據(jù)量越多, 從而增加了數(shù)據(jù)記錄所消耗的總時間。因此可以認(rèn)為,數(shù)據(jù)記錄間隔時間為 1 000 ms時,所帶來的數(shù)據(jù)記錄消耗最小。但是選擇合適的數(shù)據(jù)記錄間隔時間,除了需要考慮數(shù)據(jù)記錄的時間消耗性能指標(biāo)之外,還需要考慮平均故障恢復(fù)時間這一重要性能指標(biāo)。
圖8 不同負(fù)載下整個遷移過程中記錄數(shù)據(jù)的時間消耗
不同負(fù)載下的平均故障恢復(fù)時間如圖9所示。由圖9可以看出,不同的數(shù)據(jù)記錄間隔時間平均故障恢復(fù)時間相差不大。故障恢復(fù)時間代表當(dāng)遷移過程中虛擬機(jī)出現(xiàn)故障時,需要停止虛擬機(jī)服務(wù)重新恢復(fù)虛擬機(jī)運行的這段時間。故障恢復(fù)時間的長短取決于需要讀取的頁面和不確定性事件數(shù)據(jù)的數(shù)量,數(shù)據(jù)量越多導(dǎo)致故障恢復(fù)的時間越長。對于相同的負(fù)載,在整個遷移過程中單位時間內(nèi)的頁面修改量大致相同,并且根據(jù)哈希圖方法,統(tǒng)計負(fù)載運行過程被修改過頁面的數(shù)量后發(fā)現(xiàn),在負(fù)載運行一段時間后被修改過的內(nèi)存頁面數(shù)量將達(dá)到一定的極值并保持穩(wěn)定。因此,從圖9的結(jié)果中呈現(xiàn)出平均恢復(fù)時間大致相同的現(xiàn)象。
圖9 不同負(fù)載下的平均故障恢復(fù)時間
不同負(fù)載下的客戶程序性能影響情況如圖10所示。由圖10可以看出,數(shù)據(jù)記錄間隔時間為 1 000 ms 時,對客戶程序的影響程度最低。顯然當(dāng)需要記錄的數(shù)據(jù)量越大時,數(shù)據(jù)記錄所消耗的時間也就越多,從而導(dǎo)致退出客戶程序的時間越長,降低客戶程序的執(zhí)行性能。
圖10 不同負(fù)載下的客戶程序性能影響情況
可以得出,引入故障容錯方法必然會對現(xiàn)有的程序帶來一定程度的性能損耗,考慮數(shù)據(jù)記錄的時間消耗、平均故障恢復(fù)時間以及對客戶程序性能造成影響的實驗結(jié)果,可以認(rèn)為當(dāng)故障容錯方法的數(shù)據(jù)記錄間隔時間設(shè)置為 1 000 ms時,所造成的性能損耗最低。因此,最終選擇1 000 ms作為故障容錯方法的數(shù)據(jù)記錄間隔時間。
傳統(tǒng)的后拷貝遷移算法在遷移過程中缺乏穩(wěn)定性,源端虛擬機(jī)故障或目標(biāo)端虛擬機(jī)故障都會造成虛擬機(jī)狀態(tài)的丟失,從而導(dǎo)致遷移失敗。因此本文提出了基于事件同步的故障容錯方法,通過學(xué)習(xí)現(xiàn)有的虛擬機(jī)故障容錯機(jī)制,包括檢查點和幀同步。結(jié)合兩者的優(yōu)點,以檢查點為故障恢復(fù)起點,并使用幀同步的方式對檢查點間產(chǎn)生的事件進(jìn)行同步,保障了故障恢復(fù)完整性的同時,減少了相關(guān)的數(shù)據(jù)傳輸消耗。最終實現(xiàn)了后拷貝遷移過程中可能發(fā)生故障場景的正確恢復(fù)。
后拷貝遷移算法是虛擬機(jī)動態(tài)遷移調(diào)度的重要支撐之一,但是目前相關(guān)的研究工作還比較少,因此研究如何優(yōu)化后拷貝遷移算法有重要的實際意義。本文深入研究QEMU-KVM 源代碼,對后拷貝遷移算法展開了研究。分析提煉后拷貝遷移算法存在的穩(wěn)定性問題,并結(jié)合現(xiàn)有文獻(xiàn)資料以及相關(guān)領(lǐng)域的研究方法,對其優(yōu)化思想進(jìn)行了詳細(xì)的闡述,最終針對穩(wěn)定性問題提出了基于事件同步的故障容錯方法。傳統(tǒng)的后拷貝遷移算法在遷移過程中缺乏穩(wěn)定性,無論源端虛擬機(jī)故障還是目標(biāo)端虛擬機(jī)的故障都會造成虛擬機(jī)狀態(tài)的丟失,從而導(dǎo)致遷移失敗。因此本文提出了基于事件同步的故障容錯方法,通過學(xué)習(xí)現(xiàn)有的虛擬機(jī)故障容錯機(jī)制,包括檢查點和幀同步。結(jié)合兩者的優(yōu)點,以檢查點為故障恢復(fù)起點,并使用幀同步的方式對檢查點間產(chǎn)生的事件進(jìn)行同步,保障了故障恢復(fù)完整性的同時,減少了相關(guān)的數(shù)據(jù)傳輸消耗。最終實現(xiàn)了后拷貝遷移過程中可能發(fā)生故障場景的正確恢復(fù)。