【研究任務】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)。看這個值就可以看出還剩多少內存沒有遷走
三、內存降速問題
有時母機會出現內存降速問題,導致系統讀取磁盤到內存速度降低。這時可以在發起遷移前,使用taskset綁定子機的qemu主線程到未降速的numa上,能提升遷移速度。
(1) 確認降速的numa節點。有兩個方法。
a) 通過母機上/tmp/test_mem/test_mem.sh
b) 通過上傳pcm-memory.x這個腳本,查看numa實時使用的速度,確認內存變化(這裏要根據子機所在的numa,看numa的寫內存。因為遷移是把已有的內存置為臟頁,只能讀,不能寫。然後子機需要寫內存的時候,就新申請內存。所以內存變化主要看寫內存速度),決定中斷時長。這個腳本需要:
echo 0 > /proc/sys/kernel/nmi_watchdog設置系統參數
./pcm-memory.x 執行腳本,查看實時速度
echo 1> /proc/sys/kernel/nmi_watchdog用完後恢復系統參數
(2) numactl- - hardware,查看降速numa對應的cpu。
(3) virsh vcpuinfo uuid,獲取子機的cpu分布。或著 /usr/sbin/tools/cvminfo也可以看到。
(4) taskset –pc 6-11,18-23 pid,把子機的qemu主線程綁定到另外一個numa上。這裏用vcpu命令綁核沒有作用。
(5) 發起遷移,就能解決內存降速導致的遷移速度慢問題。這個操作能提高點遷移速度
【研究任務】KVM熱遷移