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