天天看點

這波無感更新有點秀——天翼雲QEMU元件熱更新方案來了

作者:中國電信天翼雲

虛拟化技術作為雲計算時代的核心技術,近年來應用越來越廣泛。目前,大多數雲廠商提供的雲主機都是基于KVM/QEMU虛拟化技術實作的。而随着虛拟化技術的發展,QEMU元件也在不斷引入新功能并進行功能優化和問題修複。

在公有雲場景中,如何在不影響存量虛拟機業務的情況下快速解決資源池中QEMU元件的BUG或更新QEMU版本,是雲廠商不得不面對的問題。

這波無感更新有點秀——天翼雲QEMU元件熱更新方案來了

目前,業界通常采用的解決方式有兩種:

▍通過熱更新檔方式線上修複QEMU BUG;

▍使用熱遷移技術将虛拟機遷移到安裝了新版本QEMU的主控端上。

這兩種方式都因底層技術特點導緻實施起來難度很大,且對運維團隊和雲管系統要求更高。

為解決上述問題,天翼雲彈性計算虛拟化團隊在深入研究了現有虛拟化技術和實際業務場景後,打造了QEMU熱更新方案,可以快速地線上更新QEMU元件,實作線上修複BUG和更新業務版本。基于該方案雲管系統或管理工具可以非常友善地實作一鍵更新雲主機功能,極大提高整個主控端上雲主機的更新效率。

技術路線

熱更新檔技術

熱更新檔技術通常用來線上修複使用者态程式中和安全相關的嚴重BUG。對于QEMU元件,一般使用libcare工具制作熱更新檔,然後再将熱更新檔應用在虛拟機的QEMU程序中,以達到線上修複BUG的目的。

但是,熱更新檔技術隻對特别簡單的BUG有效,對于涉及代碼改動較多的BUG,可能無法通過libcare制作出熱更新檔,即便制作出熱更新檔後也可能無法成功打上。此外,不同BUG的熱更新檔及其針對不同QEMU版本的維護,将随着資源池規模的變大以及BUG數量的增多,變得越來越困難,維護成本也越來越高。

熱遷移技術

對于需要更新QEMU版本的場景,通常可以使用虛拟機熱遷移技術将所有虛拟機從原來的主控端線上遷移到更新後的主控端上。由于虛拟機在遷移過程中仍然正常運作,使用這種方式更新QEMU對于一般使用者來說基本上沒影響,實作使用者業務無感覺,是以被很多雲廠商采納使用。

不過,由于是跨主機遷移虛拟機,如果虛拟機記憶體規格比較大或涉及記憶體密集型業務,那麼遷移一個虛拟機的時間也會比較長。而更新資源池中的QEMU版本需要遷移所有虛拟機,可想而知,整個更新周期将持續很長時間,甚至以月為機關。

不僅如此,虛拟機遷移過程将占用大量的網絡資源,遷移期間可能對主控端和虛拟機的網絡業務造成較大影響。最後遷移資源池所有虛拟機需要進行資源的統一排程和管理,這對資源排程系統提出了更高要求。

QEMU熱更新方案

在介紹QEMU熱更新方案之前,一起先了解一下虛拟機熱遷移技術背後的原理。

遷移虛拟機時,首先需要使用與源虛拟機相同配置的指令行參數,在目的主控端上啟動一個目的虛拟機程序。然後,再通過多次疊代的形式,将源虛拟機的記憶體資料通過網絡遷移到目的虛拟機的記憶體中。當剩餘記憶體髒頁總量足夠小時,立即暫停虛拟機,并将剩餘記憶體以及裝置狀态資料一次性遷移到目的虛拟機中。最後運作目的虛拟機,同時删除源虛拟機。

從熱遷移技術原理可以看出,隻要将源虛拟機的記憶體和裝置狀态資料遷移到目的虛拟機中,就能保證目的虛拟機和源虛拟機狀态一緻,而目的虛拟機程序運作在哪個主控端上并不重要了。

基于熱遷移技術原理,QEMU熱更新方案通過在相同主控端上建立一個使用新版QEMU二進制檔案啟動的目的虛拟機來替換源虛拟機,達到更新QEMU版本的目的。和熱遷移不一樣的是,新建立的目的虛拟機共享源虛拟機的記憶體,不再需要遷移,隻需在替換前将源虛拟機的裝置狀态遷移到目的虛拟機中即可。QEMU熱更新整體方案流程如圖所示。

這波無感更新有點秀——天翼雲QEMU元件熱更新方案來了

虛拟機記憶體共享

在QEMU熱更新方案中,如何讓同一個主控端上的兩個虛拟機程序間共享同一份虛拟機記憶體成為關鍵。在此過程中,天翼雲基于memfd機制實作了虛拟機記憶體的配置設定。memfd機制在Linux 3.17版引入,其提供的memfd_create()接口可以建立一個匿名的檔案描述符,且其引用的檔案儲存在記憶體中,然後通過ftruncate()系統調用可以配置設定指定大小的匿名記憶體。

該方案修改了QEMU程序啟動時為虛拟機配置設定記憶體的方式,使用memfd機制為虛拟機配置設定記憶體,并儲存對應的memfd,然後在熱更新時将其共享給目的虛拟機程序。

除此之外,為了友善将memfd共享給目的程序以及減少代碼的修改,該方案通過源虛拟機程序來建立目的虛拟機程序。基于父子程序共享資源的方式,memfd很自然地就共享給了目的虛拟機程序。目的虛拟機程序啟動時不再給虛拟機重新建立記憶體,而是直接共享使用memfd對應的源虛拟機記憶體。

裝置狀态遷移

和共享記憶體一樣,建立目的虛拟機程序前,天翼雲将源虛拟機的裝置狀态儲存在另一個memfd關聯的記憶體中,并将對應的memfd共享給目的虛拟機程序。目的虛拟機初始化後,通過讀取對應記憶體中資料即可恢複裝置狀态。

QEMU熱更新方案的優勢

更新時間短,占用網絡資源少,業務無感覺

新建立的目的虛拟機共享源虛拟機的記憶體,不再需要遷移,隻需要在替換前将源虛拟機的裝置狀态遷移到目的虛拟機中即可。由于裝置狀态對應的資料量很小,遷移很快,是以虛拟機在熱更新過程中的虛拟機暫停時間很短。

天翼雲對比測試了同樣場景下熱更新和熱遷移過程中整體耗時以及虛拟機網絡中斷時間。從測試結果看,熱更新虛拟機的整個過程耗時1s左右,網絡中斷時間大約為100ms;而熱遷移的整個過程耗時100s~400s,網絡中斷時間為300ms。測試結果表明,相比熱遷移,熱更新的整體耗時減少了99%,網絡中斷時間減少了67%左右。

支援失敗復原功能,不影響虛拟機業務

QEMU熱更新方案支援失敗復原,當更新失敗後,可以立即恢複源虛拟機運作,不會影響虛拟機内部業務。由于該方案建立了一個目的虛拟機程序用來替換源虛拟機程序,在更新成功前,源虛拟機隻是暫停執行,其所有狀态仍然保持原樣,是以即便熱更新失敗後,源虛拟機也可以立即恢複運作。

虛拟機對外接口保持一緻,對管理系統透明

虛拟機熱更新對上層管理系統(如OpenStack)透明,更新前後虛拟機對外提供的接口不變, 如vnc端口、console等。天翼雲在QEMU代碼層面做了修改,支援服務端口号、fd等資源的共享,更新後目的虛拟機直接共享源虛拟機擁有的資源,繼續對外提供服務。

網卡裝置後端資源共享,無需重新配置網絡端口

通常虛拟機在遷移到另外一個主控端後都需要網絡控制器重新配置網絡開端口和下發對應的流表,保證網絡正常工作。而QEMU熱更新方案卻不需要網絡控制器的介入,對其透明,這得益于天翼雲對QEMU virtio網卡裝置的工作機制及代碼架構的深入的研究。天翼雲在QEMU網卡裝置代碼層面進行了優化,實作了virtio 網卡裝置後端資源共享以及恢複機制,使得目的虛拟機可以共享源虛拟機virtio網卡裝置的後端資源。

安全保護機制,讓熱更新更加安全可靠

針對某些場景下(比如裝置配置的socket使用了TLS或websocket選項)QEMU虛拟機無法執行熱更新操作的情況,天翼雲建構了安全保護機制,通過禁止執行熱更新操作,使方案更加安全可靠。在QEMU代碼中,天翼雲相應地增加了熱更新blocker機制,在虛拟機程序啟動時,一旦檢查到不支援熱更新的場景,将設定一個blocker,以告知QEMU熱更新接口禁止執行該操作。由于blocker的存在,熱更新接口直接報錯退出。

一鍵熱更新QEMU 虛拟機,維護簡單

在該方案中,QEMU隻提供了熱更新方案所需的所有原子操作接口,通過封裝這些接口,libvirt可以實作一鍵熱更新QEMU虛拟機的功能。

持續優化,共建開源生态

天翼雲雲主機熱更新方案是基于QEMU開源社群版本上的優化和增強,接下來天翼雲也将積極推進該方案開源到社群,共建開源生态。同時,天翼雲彈性計算虛拟化團隊還将持續優化方案,下一步将支援直通裝置的熱更新。

未來,天翼雲将繼續堅持科技創新,加大關鍵核心技術自主攻關,推進國産軟硬體産品更新,以安全可信、自主可控的新一代雲計算基礎設施底座,助推中國數字經濟高品質發展。

繼續閱讀