轉自https://blog.51cto.com/12814931/2130733git
所謂熱遷移,就是在用戶無感知的狀況下,把虛機由遠端遷移到目的端。github
1、原理理解dom
KVM的熱遷移分爲共享存儲和非共享存儲兩種,其最終目的都是爲了將內存和磁盤中的數據轉移到目的端。總共要進行5個階段函數
源端:測試
一、set_params階段:此階段根據熱遷命令與參數,遍歷savevm_handlers鏈表,初始化各個模塊的遷移特徵參數,完成後向目的端發送qemu_put_be_32(f, QEMU_VM_FILE_MAGIC),由此進入setup階段ui
二、setup階段:這個階段會遍歷savevm_handlers,將全部須要熱遷設備的section_id,idstr,instance_id,version_id信息傳遞到目的端,並調用各個設備的setup函數spa
三、iterate階段:此階段會反覆遍歷savevm_handlers鏈表上的全部設備,調用iterate函數進行數據傳遞,傳輸完成後,調用vm_stop,暫停源端,進入complete階段。線程
四、complete階段:用來傳遞最後的髒頁與遷移信息的清理。blog
目的端:內存
一、load階段
接收源端須要遷移的設備列表,從savevm_handlers列表中找到對應設備的處理函數,並以此初始化loadvm_handlers鏈表。而後,根據源端傳遞來的數據,從loadvm_handlers中拿到對應的load函數,並加載數據。
2、熱遷經常使用技巧
(1)三種場景速度差異
目前熱遷有三種場景,千兆場景(速度大概是75MB),萬兆場景(速度大概是300MB),屬於萬兆場景但遷移速度上不來(約100MB左右)。第三種狀況多是因爲內存降速引發。
(2)評估遷移時間
watch -n 1 "virsh domjobinfo uuid"
能夠經過上面命令,看下遷移速度再評估最後中斷時間
能夠查看/usr/local/var/log/libvirt/qemu/uuid.log,裏面有個remaining值,這個值就是遷不動的page數(乘以4後是kb)。看這個值就能夠看出還剩多少內存沒有遷走
3、內存降速問題
有時母機會出現內存降速問題,致使系統讀取磁盤到內存速度下降。這時能夠在發起遷移前,使用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用完後恢復系統參數
(2) numactl- - hardware,查看降速numa對應的cpu。
(3) virsh vcpuinfo uuid,獲取子機的cpu分佈。或着 /usr/sbin/tools/cvminfo也能夠看到。【這裏的cvm是騰訊雲嗎?】
(4) taskset –pc 6-11,18-23 pid,把子機的qemu主線程綁定到另一個numa上。這裏用vcpu命令綁核沒有做用。
(5) 發起遷移,就能解決內存降速致使的遷移速度慢問題。這個操做能提升點遷移速度