在開源的所有 patch 里,比較引人注目的是,騰訊云率先采用快速寫保護、共享臟頁位圖、優(yōu)化熱遷移塊大小等一系列方式,優(yōu)化熱遷移效率以及提升熱遷移成功率。那么,它的虛擬機熱遷移過程和具體方法是什么?騰訊云又如何看待 KVM 技術開源?KVM 現(xiàn)在面臨著哪些新的挑戰(zhàn)?帶著這些問題,InfoQ 采訪了騰訊云高級工程師肖光榮,就騰訊云的 KVM 開源技術與開源思路做了簡單交流。
InfoQ:簡單闡述一下 KVM 虛擬化技術以及 KVM 和云計算的關系?
肖光榮: KVM 是 Kernel-based Virtual Machine 的簡稱,KVM 要求 CPU 支持硬件虛擬化技術(如 intel VT 或 AMD-V),是 Linux 下的全虛擬化解決方案。KVM 由處于內(nèi)核態(tài)的 KVM 模塊和用戶態(tài)的 QEMU 兩部分構(gòu)成。內(nèi)核模塊實現(xiàn)了 CPU 和內(nèi)存虛擬化等決定關鍵性能和核心安全的功能并向用戶空間提供了使用這些功能的接口,QEMU 利用 KVM 模塊提供的接口來實現(xiàn)設備模擬、 IO 虛擬化和網(wǎng)絡虛擬化等。單個虛擬機是宿主機上的一個普通 QEMU 進程,虛擬機中的 CPU 核(vCPU)是 QEMU 的一個線程,VM 的物理地址空間是 QEMU 的虛擬地址空間(圖 1)。
vCPU 線程經(jīng)過 KVM 模塊提供的系統(tǒng)調(diào)用進入到宿主機內(nèi)核態(tài),在內(nèi)核態(tài)切換到 CPU 的非根模式,即 guest 模式,此時虛擬機內(nèi)的 CPU 獲得宿主機 CPU 資源,得以執(zhí)行。在 guest 模式中,遇到敏感指令無法直接執(zhí)行,或者有特定的內(nèi)部異常和外部中斷產(chǎn)生,vCPU 會退出到根模式由 KVM 內(nèi)核或 QEMU 來模擬執(zhí)行(圖 2)。
KVM 虛擬化技術是當前云計算中計算虛擬化的主流技術,是云計算的核心底層能力,使用 KVM 把多臺物理機虛擬化后,組成一個大的虛擬資源池,方便用戶從資源池中按需分配計算能力,提升資源的使用效率,同時保證多用戶資源之間的隔離性、安全性。
InfoQ:騰訊云此次向 KVM 社區(qū)貢獻的 46 個 patch 主要解決了哪些問題?
肖光榮:這 46 個 patch 是我們在實戰(zhàn)過程中的經(jīng)驗總結(jié),用于改善和解決 KVM 虛擬機在實際運營過程中遇到的一些問題,這些 Patch 主要應用在以下三個方面:
時鐘方面重構(gòu) KVM 的 RTC 計時框架。讓 windows 虛擬機的時鐘系統(tǒng)在時鐘頻率頻繁調(diào)整的情況下保持精準。重構(gòu) KVM LAPIC Timer 的模式切換和頻率調(diào)整的模擬,使其完全與硬件行為保持一致。優(yōu)化 KVM LAPIC Timer 時鐘中斷注入的延遲。發(fā)現(xiàn)并解決了使用硬件輔助的 VMX Preemption Timer 模擬的 KVM LAPIC Timer 時的各種搶占問題。
嵌套虛擬化方面重構(gòu)異常注入的邏輯。解決了嵌套虛擬化下異常丟失的問題。添加異步缺頁異常 (Async Page Fault) 在嵌套虛擬化下的支持。這些問題的解決,使得嵌套虛擬化更加穩(wěn)定和高效,可以讓更多的用戶在不導鏡像的情況下,將業(yè)務遷移上云。
修復 KVM 將宿主機信息外泄的問題。修復 KVM 在模擬 CPUID 指令和處理虛擬機設備訪問時,意外地將宿主機上的內(nèi)存泄露到虛擬機。
InfoQ:騰訊云在虛擬機熱遷移技術上有比較明顯的突破,能否講解一下虛擬機的遷移過程以及騰訊云如何提升熱遷移性能?
肖光榮:虛擬機熱遷移是一項非常重要的技術,熱遷移可以在用戶幾乎無感知的情況下將虛擬機從當前宿主機遷到另外的宿主機,熱遷移主要用于解決一些軟硬件不可逆場景下的虛擬機可用性問題,如:宿主機硬件批次性隱患、宿主機內(nèi)核內(nèi)存泄漏等。騰訊云內(nèi)部大量地使用熱遷移來提升虛擬機的可用性,從近一年的統(tǒng)計數(shù)據(jù)來看,已經(jīng)做到虛擬機的可用性大于物理機。
虛擬機的熱遷移主要有下面幾步:
- 在目標宿主機上準備虛擬機運行環(huán)境,如掛載共享存儲,創(chuàng)建虛擬網(wǎng)絡等;
- 從源宿主機建立到目標宿主機的連接,用于傳輸虛擬機的狀態(tài),比如內(nèi)存;
- 源端需要捕捉內(nèi)存的更改并記錄在內(nèi)存?zhèn)鬏斶^程中有哪些頁面被改動,這些臟頁需要在下一輪迭代中繼續(xù)傳輸;
- 傳輸全量內(nèi)存;
- 本輪內(nèi)存?zhèn)鬏斖戤吅,如果剩下的臟頁數(shù)量能在設定的停機時間內(nèi)傳輸完畢,那么將虛擬機停機,否則繼續(xù)傳輸臟內(nèi)存,直到臟內(nèi)存的量收斂到可以在預定時間內(nèi)傳輸完成為止;
- 傳輸余下的臟內(nèi)存,以及停機時 CPU 寄存器和各個子系統(tǒng)的狀態(tài);
- 此時源端和目標端的虛擬機狀態(tài)完全一致,在目標端讓虛擬機恢復運行,遷移完畢。
如上所述,源端需要去捕獲內(nèi)存的更改,在當前的環(huán)境下是采用寫保護和臟頁位圖的方法,即先把內(nèi)存全部變?yōu)橹蛔x,在虛擬機寫內(nèi)存時就會產(chǎn)生異常被 KVM 內(nèi)核模塊捕獲并且記錄到臟頁位圖,該臟頁位圖最后被復制到 QEMU,據(jù)此 QEMU 能知道哪些內(nèi)存被更改。
對于臟頁內(nèi)存的捕獲,我們主要通過兩大方式提升熱遷移效率:1)采用快速寫保護算法,該算法是無鎖的并且算法復雜度為 O(1),這就意味著它的性能與虛擬機的內(nèi)存大小和工作負載無關。2)采用 KVM 內(nèi)核模塊和 QEMU 共享臟頁位圖的方法,實現(xiàn)零拷貝以及減少用戶態(tài)和內(nèi)核態(tài)的上下文切換。
另外在遷移臟塊的時候,針對子機內(nèi)部 IO 性能下降的問題,優(yōu)化熱遷移塊大小,避免傳輸無用數(shù)據(jù),提升熱遷移成功率。當然,騰訊云還有很多其他提升熱遷移性能和穩(wěn)定性的優(yōu)化方法,在此就不一一列舉了。
InfoQ:騰訊云如何看待云廠商們對 KVM 開源的貢獻和支持問題?
肖光榮:騰訊云一直秉承開放,共享的心態(tài)參與開源,憑借龐大的用戶群和 KVM 集群規(guī)模,騰訊云在 KVM 虛擬化上做了深入的研究和豐富的實踐。騰訊云自 2017 年 5 月加入 Linux 基金會以來,更加大了回饋社區(qū)的力度。在 KVM 內(nèi)核領域,已經(jīng)是貢獻度最高的公有云廠商。
過去,大型開源項目一直鮮見中國大型企業(yè)的身影,所以開源界一直詬病中國企業(yè)只索取不貢獻,作為公有云的一線廠商,我們希望通過實際行動轉(zhuǎn)變開源界的看法。
當前 KVM 虛擬化技術是各家云廠商使用的主流虛擬化技術,騰訊云有一個專門負責做開源的團隊,該團隊一方面將持續(xù)創(chuàng)新以來解決騰訊云線上遇到的各種挑戰(zhàn)并且將產(chǎn)出反饋給社區(qū),另一方面探索云計算領域的新技術,做好前沿技術的預演和積累。同時我們也希望各大云廠商加大對 KVM 項目的投入,積極參與到社區(qū),共同應對新硬件,新架構(gòu)給 KVM 帶來的挑戰(zhàn)。
InfoQ:KVM 技術現(xiàn)在面臨著哪些新的挑戰(zhàn)?
肖光榮:一方面,Intel 不斷推出新 CPU 架構(gòu):haswell、broadwell、skylake 到 cascadelake,網(wǎng)絡帶寬從 10G 到 25G 再到 100G,更新的硬件架構(gòu),更高的網(wǎng)絡帶寬需要更高效的虛擬化才能將硬件的性能充分發(fā)揮。另一方面,GPU、FPGA 在 KVM 上的虛擬化、池化有待突破,否則 GPU、FPGA 的整體利用率無法提升。虛擬機網(wǎng)絡性能一直是虛擬化的短板,利用智能網(wǎng)卡等技術可以將網(wǎng)絡性能做到和物理機旗鼓相當,但同時也讓熱遷移變得困難。
嘉賓介紹
肖光榮,騰訊云開源團隊負責人,操作系統(tǒng)專家。肖光榮在 Linux 內(nèi)核、KVM 社區(qū)工作近十年,是 Ftrace, MM, Networking 等子系統(tǒng)的活躍貢獻者。近幾年主要工作在虛擬化領域,是 KVM 的核心開發(fā)者,Virtual NVDIMM 子系統(tǒng)的維護者。肖光榮向社區(qū)提交了大量 Patch,在華人內(nèi)核貢獻者中排名 Top 15,在內(nèi)核和 KVM 社區(qū)擁有巨大影響力。