【轉】KVM熱遷移大致流程和內存降速問題

轉自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)    發起遷移,就能解決內存降速致使的遷移速度慢問題。這個操做能提升點遷移速度

相關文章
相關標籤/搜索