天天看點

xen快照機制

    虛拟機快照技術是指,在虛拟機運作過程中将虛拟機的完整運作狀态,包括記憶體、磁盤、 CPU、網絡等,儲存到持久化的外部裝置中,進而當虛拟機發生故障時可以通過備份的資料恢複虛拟機的運作。快照裡面記憶體的快照又是非常重要非常關鍵的一部分。

    記憶體快照主要實作機制主要有三種:停機拷貝機制(stop-and-copy),預拷貝機制(pre-copy),後拷貝機制(post-copy)。

    停機拷貝機制(stop-and-copy)

    在進行虛拟機快照的時刻要先将虛拟機挂起,然後在儲存完虛拟機的完整狀态後再恢複虛拟機的運作。

    這種方式簡單,但使得整個快照過程的虛拟機停機時間完全取決于虛拟機的記憶體大小,而且該時間可以達到幾十秒,嚴重影響虛拟機的性能。

    主流kvm、xen、vmware等都是基于停機拷貝方式實作快照功能。

    預拷貝機制(pre-copy)

    通過多輪疊代的方式對記憶體頁面進行儲存。每一輪儲存自上一輪以來變髒的記憶體頁面,當需要儲存的内 存頁面數量收斂到可以在一個較短的停機時間内完成儲存的時刻,虛拟機停機。

    寫密集時,收斂時間較長,多輪拷貝影響性能。“狀态漂移”現象。

    Vnsnap等基于預拷貝機制實作快照。

    後拷貝機制(post-copy) 

    首先停機,将cpu、裝置等狀态資訊以及少量記憶體頁面儲存,然後開機,并在發生缺頁中斷時将相應記憶體頁面儲存。

    個人認為在分布式快照時優勢比較明顯。

    研究了一下xen快照部分的代碼,其實xen-4.1.2的記憶體快照實作函數是跟遷移共用的,遷移已經是采用預拷貝機制來實作記憶體的遷移,是以說記憶體快照部分的代碼其實是實作了預拷貝快照的。隻是有一個參數live進行控制,live為1那麼就是預拷貝,live為0就是停機拷貝。

    快照部分函數入口及調用關系如下:

xen快照機制

    注意,xen-4.4.1版本及以上使用xl指令,不再是之前版本的xm指令,也就是不再用xend,而是成了toolstack,是以上層入口有所變化,但是最底層的xc_domain_save()函數是不變的。

    預拷貝過程中關鍵資料

xen快照機制

    預拷貝主流程:

xen快照機制

    頁判定代碼:

xen快照機制

    代碼分析

    頁判定主要是判定該輪疊代要傳送哪些頁面。

    last_iter=1表示最後一輪疊代,置1後下一輪就進行停機拷貝。

    superpages=1表示全虛拟化,iter=1表示第一輪疊代,test_bit(n,xx)表示xx位圖第n位的值,為1或0。

    判定規則

    (1)to_send為1且to_skip為0的頁

    (2)全虛拟化形式下第一輪疊代to_send為1的頁面

    (3)最後一輪疊代to_send為1的頁面

    (4)最後一輪疊代to_fix為1的頁面

    以上四種頁面是本輪疊代需要傳送的頁面。

    to_send、to_skip、to_fix置位時機

xen快照機制

    to_fix是每一輪疊代頁判斷,當該頁還沒有被映射時就置為1。

    頁判定規則原理

    to_send在第i-1輪疊代結束時候擷取,收集的是第i-1輪疊代過程中變髒的頁面,即第i輪可能拷貝頁面的全集。    to_skip是第i輪疊代開始時擷取,收集的是第i-1輪疊代結束到第i輪疊代開始這一短暫時間間隔内再次變髒的頁面。    當to_skip為1表示這很短時間内某頁面又再次被修改,也就可以認為該頁頻繁通路,為避免該頁被重複拷貝,可以暫緩拷貝。

    第一輪疊代時候,to_send被初始化為全1,to_skip實際上是沒有擷取的,是以可以不必考慮to_skip。

    最後一輪疊代時候,to_fix、to_skip都需要一并拷貝,以保證記憶體拷貝的完整。

    後處理代碼:

xen快照機制

    代碼分析

    後處理主要是判定是否進行最後一輪疊代,如果是最後一輪置标記并申請停機。

    判定規則:

    如果     疊代次數iter大于等于預設最大疊代次數max_iters

    或者     本輪拷貝頁面數與跳過頁面數之和小于50

    或者      整個疊代過程拷貝總頁面數大于疊代因子倍的P2M表對應頁面數量

    則          進入停機拷貝。

    裝置狀态的拷貝是在XendCheckpoint.py中的save()函數中實作的。

xen快照機制

繼續閱讀