【研究任務】KVM熱遷移

所謂熱遷移,就是在用戶無感知的情況下,把虛機由遠端遷移到目的端。


一、原理理解


KVM的熱遷移分爲共享存儲和非共享存儲兩種,其最終目的都是爲了將內存和磁盤中的數據轉移到目的端。總共要進行5個階段

源端:

1、set_params階段:此階段根據熱遷命令與參數,遍歷savevm_handlers鏈表,初始化各個模塊的遷移特徵參數,完成後向目的端發送qemu_put_be_32(f, QEMU_VM_FILE_MAGIC),由此進入setup階段

2、setup階段:這個階段會遍歷savevm_handlers,將所有需要熱遷設備的section_id,idstr,instance_id,version_id信息傳遞到目的端,並調用各個設備的setup函數

3、iterate階段:此階段會反覆遍歷savevm_handlers鏈表上的所有設備,調用iterate函數進行數據傳遞,傳輸完成後,調用vm_stop,暫停源端,進入complete階段。

4、complete階段:用來傳遞最後的髒頁與遷移信息的清理。


目的端:

1、load階段

接收源端需要遷移的設備列表,從savevm_handlers列表中找到對應設備的處理函數,並以此初始化loadvm_handlers鏈表。然後,根據源端傳遞來的數據,從loadvm_handlers中拿到對應的load函數,並加載數據。


二、熱遷常用技巧


(1)三種場景速度差別

目前熱遷有三種場景,千兆場景(速度大概是75MB),萬兆場景(速度大概是300MB),屬於萬兆場景但遷移速度上不來(約100MB左右)。第三種情況可能是由於內存降速引起。

(2)評估遷移時間

watch  -n  1  "virsh  domjobinfo  uuid"

可以通過上面命令,看下遷移速度再評估最後中斷時間

可以查看/usr/local/var/log/libvirt/qemu/uuid.log,裏面有個remaining值,這個值就是遷不動的page數(乘以4後是kb)。看這個值就可以看出還剩多少內存沒有遷走

圖片.png



三、內存降速問題


有時母機會出現內存降速問題,導致系統讀取磁盤到內存速度降低。這時可以在發起遷移前,使用taskset綁定子機的qemu主線程到未降速的numa上,能提升遷移速度。

(1)    確認降速的numa節點。有兩個方法。

a)     通過母機上/tmp/test_mem/test_mem.sh腳本測試當前numa空閒可用速度。結果在numa0.log,numa1.log,test_mem.log中。

b)     通過上傳pcm-memory.x這個腳本,查看numa實時使用的速度,確認內存變化(這裏要根據子機所在的numa,看numa的寫內存。因爲遷移是把已有的內存置爲髒頁,只能讀,不能寫。然後子機需要寫內存的時候,就新申請內存。所以內存變化主要看寫內存速度),決定中斷時長。這個腳本需要:

echo 0 > /proc/sys/kernel/nmi_watchdog設置系統參數

./pcm-memory.x                 執行腳本,查看實時速度

echo 1> /proc/sys/kernel/nmi_watchdog用完後恢復系統參數

圖片.png

(2)    numactl- - hardware,查看降速numa對應的cpu。

圖片.png

(3)     virsh vcpuinfo uuid,獲取子機的cpu分佈。或着 /usr/sbin/tools/cvminfo也可以看到。

(4)    taskset –pc 6-11,18-23 pid,把子機的qemu主線程綁定到另外一個numa上。這裏用vcpu命令綁核沒有作用

(5)    發起遷移,就能解決內存降速導致的遷移速度慢問題。這個操作能提高點遷移速度


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章