熱遷移(Live Migration)在云計算中是如同黑魔法一般的存在,它可以使用戶在無感知的情況下將虛擬機從一臺物理服務(wù)器遷移到另一臺物理服務(wù)器上,且整個遷移過程中應用程序幾乎不會發(fā)生中斷,是保障 SLA 的利器。本期智匯華云將從熱遷移的原理出發(fā),為大家揭曉 ArStack 團隊為持續(xù)優(yōu)化熱遷移能力進行的探索與實踐。
熱遷移的原理
當一個運行中的虛擬機在不同計算節(jié)點中進行移動的時候,對于用戶的應用程序來說主要涉及到 CPU 和內(nèi)存的運行狀態(tài),CPU 狀態(tài)的拷貝幾乎是可以瞬時完成的,而由于內(nèi)存的特性,其在遷移過程中已經(jīng)拷貝的內(nèi)存也會面臨被重寫的情況,所以在整個虛擬機遷移過程中,內(nèi)存遷移需要消耗較長的時間。
在這篇文章中,我們主要介紹一種最常見的內(nèi)存拷貝策略:預拷貝策略(Pre-Copy)。
簡單來說,預拷貝策略主要分為三個階段:
Init Copy:將所有內(nèi)存頁標記為 Dirty Page(臟內(nèi)存),并將其拷貝到目標主機上,此時虛擬機管理器繼續(xù)監(jiān)視虛擬機的內(nèi)存變化情況
Iterative Pre-Copy:重新計算新產(chǎn)生的臟內(nèi)存,并進行迭代,將被修改的內(nèi)存頁拷貝到目標主機上,直到滿足條件退出
Stop-and-Copy:停止運行源主機的 GuestOS,將剩余的臟內(nèi)存以及設(shè)備狀態(tài)信息遷移到目標主機上,并啟動虛擬機
ArStack 的探索與實踐
根據(jù)第一性原理(First Principle),我們不難發(fā)現(xiàn)在虛擬機進行熱遷移的過程中, Iterative Pre-Copy 是最重要的階段,所以 ArStack 幾乎所有的優(yōu)化工作都是圍繞這一階段展開的。
超時參數(shù)的調(diào)整
在過去的一些反饋中,大規(guī)格的虛擬機(如128G內(nèi)存)在承受中高強度的負載時往往會在遷移中產(chǎn)生瓶頸,經(jīng)過研究相關(guān)案例后我們發(fā)現(xiàn)該問題主要是由于遷移時間超時導致的,由于網(wǎng)絡(luò)帶寬、內(nèi)存量等因素的限制,這類虛機往往需要更長的遷移時間,所以針對這類情況我們按需調(diào)整了遷移超時的參數(shù),以提升該場景下的遷移成功率。
最大停機時間的調(diào)整
還記得上面我們講到的在 Iterative Pre-Copy 階段中“直到滿足條件退出”么,最大停機時間(Max Downtime)就是 Nova 選擇退出的條件之一,在每次迭代中 Libvirt 都會重新計算虛擬機新產(chǎn)生的臟內(nèi)存以及每次迭代需要耗費的時間,再根據(jù)當前帶寬和臟頁數(shù)計算出傳輸剩余數(shù)據(jù)的時間,即Downtime。
如果 Downtime 在管理員配置的 Live Migration Max Downtime 范圍之內(nèi),則退出,進入到 Stop-and-Copy 階段。
在與業(yè)務(wù)團隊溝通后,我們進行了大量的實驗與驗證,最終提供了一套更為合理的參數(shù)配置,該參數(shù)的調(diào)整明顯提升了熱遷移的成功率。
VM 級的內(nèi)存收斂
需要注意的是,最大停機時間并不是如同殺手锏的存在,如果虛擬機持續(xù)處于高負載狀態(tài),即不斷產(chǎn)生大量的臟內(nèi)存,Downtime 有可能一直無法進入我們預設(shè)的范圍,此時的 Iterative Pre-Copy 就如同《開端》里的李詩情一樣,不斷在進行循環(huán)。
現(xiàn)在,內(nèi)存自動收斂(Auto Converge)就要作為“銀色子彈”登場了。
開啟 Auto Converge 后,當進行熱遷移時,Qemu 會降低虛擬機的運行速度,從而減少內(nèi)存寫入的操作,這樣使得 Dirty Page 生成的速度降低,同時 Auto Converage 有一套自身的算法,會不斷增加對 vCPU 的限制(上限為99%),直到遷移成功。
OpenStack 自身提供了平臺級的內(nèi)存收斂能力,ArStack 修改了社區(qū)代碼的相關(guān)邏輯,為用戶提供了顆粒度為虛擬機級的內(nèi)存收斂能力,用戶可以針對單臺虛機進行相應的設(shè)置,從而獲得更加靈活、高效的遷移體驗。
VM 級的 Qos 設(shè)置
對于一些業(yè)務(wù)敏感型用戶來說,他們希望在獲得高效遷移能力的同時又能盡可能降低因為熱遷移對業(yè)務(wù)系統(tǒng)產(chǎn)生的影響。
能夠限制熱遷移的遷移速度便顯得至關(guān)重要,Live Migration Bandwidth 是遷移期間要使用的最大帶寬,默認值為0,意味著不限制遷移帶寬。
ArStack 同樣為用戶提供了顆粒度為虛擬機級的 Qos 配置,以便于用戶能夠自主評估并控制遷移的速度。
多線程遷移
在獲得了國產(chǎn)化團隊的支持后,ArStack 整合并提供了全局范圍內(nèi)的多線程遷移能力,在默認狀態(tài)下,ArStack 會為所有參與遷移任務(wù)的 VM 開啟多線程遷移的選項,當 Libvirt 接收到來自 ArStack 傳遞的信號后,會通過多個網(wǎng)絡(luò)連接將內(nèi)存頁發(fā)送至目標主機,以提升遷移性能。
總結(jié)
作為虛擬機生命周期管理的重要組成部分,ArStack 經(jīng)過數(shù)個版本的迭代,持續(xù)對熱遷移進行了大量的優(yōu)化工作,以提升用戶的基礎(chǔ)體驗。
不僅如此,ArStack 還完善豐富了多種復雜場景下的熱遷移能力,相信在不久的將來會與用戶見面。