天天看點

T級記憶體,建立效率提升10倍以上,阿裡雲 KVM異構虛拟機啟動時間優化實踐1、發現問題:記憶體越大、啟動越慢, DMA map 執行是耗時大戶2、設計思路:異步 DMA map,完美解決虛拟機建立耗時問題3. 具體實踐:三個關鍵點優化,進一步優化啟動時間結語

T級記憶體,建立效率提升10倍以上,阿裡雲 KVM異構虛拟機啟動時間優化實踐1、發現問題:記憶體越大、啟動越慢, DMA map 執行是耗時大戶2、設計思路:異步 DMA map,完美解決虛拟機建立耗時問題3. 具體實踐:三個關鍵點優化,進一步優化啟動時間結語

對于雲計算使用者來說,過長的 KVM 虛拟機建立及啟動時間非常影響體驗,特别是超大規格的 KVM 異構虛拟機。以 350G 記憶體為例,建立時間需要 2 分鐘,當使用者此時建立虛拟機是用于快速恢複業務時,2 分鐘的建立等待時間完全超出使用者的可忍受值。另外,對于雲計算的背景管控系統而言,過長的阻塞時間極大地影響了系統排程效率。

一直以來,阿裡雲異構計算團隊在 KVM 性能優化方面都有大量的投入,積澱了大量實戰經驗。阿裡雲異構計算團隊創新性地提出了一種顯著優化帶有透傳(pass-through)裝置的 KVM 虛拟機建立及啟動時間的方法,虛拟機的啟動時間不再随着配置設定記憶體的大小而顯著增加,即使虛拟機被配置設定了幾百 G 甚至更多的記憶體,使用者感覺的啟動時間依然沒有明顯增加。

在這套技術優化方案下,對于 350G 記憶體的虛拟機,建立及啟動時間可從原來的 120 秒以上降低到 20 秒以内,效率整整提升了 6 倍以上;對于 T 級記憶體的虛拟機,預計建立效率可以提升 10 倍以上。

作為 KVM 社群最為重要和權威的大會,KVM Forum 2020 有 3 個議題是與 KVM 虛拟機建立及啟動速度的優化有關,分别來自阿裡巴巴、英特爾和滴滴,可見 KVM 社群及雲計算業界對此問題的重視程度。阿裡雲工程師李偉男和郭成在 KVM Forum 2020 上詳細介紹了阿裡雲 KVM 虛拟機建立及啟動時間優化的具體技術實作,本文根據其演講整理而成。

1、發現問題:記憶體越大、啟動越慢, DMA map 執行是耗時大戶

衆所周知,PCI 裝置透傳是 KVM 虛拟化應用中一個非常重要的場景,而 VFIO 是目前最為流行的 PCI 裝置透傳解決方案,為了能夠在應用層提供高效的 DMA 通路,在啟用 VFIO 裝置之前,需要将配置設定給虛拟機的所有記憶體都鎖定并進行 IOMMU 頁表的建立。

這麼做的原因在于,DMA 通路可能覆寫整個虛拟機的記憶體空間,并且 DMA 通路的記憶體不能被換出(swap)。是以,如果能夠在實體裝置 DMA 通路之前得知将要通路的位址空間,就可以在運作中進行記憶體鎖定(pin)及 IOMMU 頁表的建立。但目前并沒有一個簡單、高效的方法能夠完成這一操作。為了虛拟機及裝置的高效運作,目前開源社群采取的辦法是在虛拟機建立時将所有配置設定給它的記憶體進行鎖定并建立 IOMMU 頁表(DMA map)。

由于 DMA map 是一個相對比較耗時的操作,在虛拟機記憶體相對較小時,總體耗時是可以接受的。但随着虛拟化市場及技術的發展,越來越多的使用者開始使用超大規格的虛拟機,記憶體資源已從 4G 增長到 384G 甚至更高,随之帶來的 DMA map 時間消耗問題也日益突出。

T級記憶體,建立效率提升10倍以上,阿裡雲 KVM異構虛拟機啟動時間優化實踐1、發現問題:記憶體越大、啟動越慢, DMA map 執行是耗時大戶2、設計思路:異步 DMA map,完美解決虛拟機建立耗時問題3. 具體實踐:三個關鍵點優化,進一步優化啟動時間結語

圖 1: 虛拟機的建立及啟動時間與記憶體大小關系

如圖 1 所示,以開源社群的 KVM 虛拟化元件及 Ubuntu18.04 虛拟機為例,在虛拟機記憶體達到 350G 以上時,整個 KVM 系統的啟動時間将超過 2 分鐘,其中絕大部分時間都消耗在 DMA map 執行操作中。在這 2 分鐘裡,對于使用者來說虛拟機是一個黑盒,使用者能做的隻有靜靜等待,甚至不确定虛拟機是否仍然在正常建立中,完全處于未知的狀态。

2、設計思路:異步 DMA map,完美解決虛拟機建立耗時問題

為了解決這一個問題,阿裡雲異構計算團隊研究了現有的虛拟化技術和實際應用場景。雖然 DMA map 本身不能省去,但我們發現在系統啟動過程中 DMA 通路雖然是随機的、但并不會通路到全部,由此阿裡雲異構計算團隊提出了一種異步 DMA map(async DMA map)的方法,即在虛拟機建立過程中僅 map 有限的記憶體空間,剩餘的大部分記憶體空間可以在虛拟機啟動過程中于背景異步 map 完成,進而保證使用者可以快速地擷取通路虛拟機的權限。

這時,如何保證虛拟機在啟動過程中不會有裝置通過 DMA 通路到需要異步 map 的記憶體就成為了關鍵。這個過程中,我們用到了大家比較熟悉的 Virtio-balloon,因為 Virtio-balloon 設計之初即被用來占用虛拟機記憶體使用,是以我們提出的解決方案不會涉及到大量、複雜的軟體改動,即可完美解決虛拟機建立耗時的問題。

T級記憶體,建立效率提升10倍以上,阿裡雲 KVM異構虛拟機啟動時間優化實踐1、發現問題:記憶體越大、啟動越慢, DMA map 執行是耗時大戶2、設計思路:異步 DMA map,完美解決虛拟機建立耗時問題3. 具體實踐:三個關鍵點優化,進一步優化啟動時間結語

圖 2:async DMA map 設計思路

Async DMA map 主要設計思路就是:虛拟機建立時,低于 4G 記憶體空間的 DMA map 請求會被正常處理,其他記憶體空間的 DMA map 操作将會等待 virtio_balloon 前端驅動加載完成後根據實際情況進行處理。

具體的操作流程如下:

首先,確定 virtio_balloon 驅動先于 VFIO 裝置驅動加載。這樣 virtio_balloon 驅動會在配置空間中擷取初始的 balloon 大小,然後再根據 balloon 大小進行實際的虛拟機記憶體的配置設定,被配置設定的記憶體将從可用記憶體中去除。在沒有釋放前,其他裝置将無法申請到這部分被占用的記憶體,那就不會被 DMA 通路到,也就不需要在這之前進行 map。

其次,完成 balloon,獲得可異步執行 map 記憶體空間。Balloon 的過程是經過很多次 inflate 操作完成的。每次操作完成後,前端的 virtio_balloon 會通知後端完成的 inflate balloon 大小及其對應的 PFN,位于主控端上的後端驅動收到通知後,會将 PFN 從消息隊列中解析出來,并轉換為 IOVA 記錄在 ballooned 頁表中。待 balloon 完成後,後端驅動會得到一張完整的被 virtio_balloon 占用的記憶體頁表,這部分的記憶體空間即是可以異步執行 map 的部分。沒有在頁表中的記憶體可能會被其他裝置通過 DMA 通路,是以需要即刻完成 map 操作。

最後,在保證虛拟機系統可繼續正常啟動的情況下,async DMA map 正式開始。通過向 virtio_balloon 前端驅動觸發 deflate 操作,進而向虛拟機歸還一定大小的記憶體,前端 virtio_balloon 驅動會将釋放的記憶體位址同步給後端驅動,後端驅動接收到被釋放的記憶體位址空間後,觸發同步的 DMA map,通過分步的 deflate 及 map,慢慢完成全部記憶體的映射、鎖定,進而使虛拟機恢複到完整記憶體資源可用狀态。

3. 具體實踐:三個關鍵點優化,進一步優化啟動時間

在具體的實踐中,我們進行了 balloon 臨近位址空間自動合并、增加單次 balloon 頁面大小和預處理機制等三個關鍵點的優化,以進一步優化啟動時間。具體優化如下:

(1)Balloon 臨近位址空間自動合并。通過合并多次 balloon 的臨近記憶體位址空間,可以顯著地減少觸發 DMA map 的次數。因為 virtio_balloon 會在系統啟動初期被加載,此時的記憶體使用較少,virtio_balloon 申請到的記憶體位址絕大部分是連續的,臨近記憶體位址的可合并率非常高。

(2)增加單次 balloon 頁面大小。記憶體資源已經不再是非常稀缺的資源,目前 virtio_balloon 前端驅動中基于小頁(4KB)大小的記憶體申請機制已經不太适合目前大規格執行個體的業務場景。基于業界使用者實際應用場景的分析,我們将 virtio_balloon 單次申請的記憶體大小從 4KB 提高到 2MB,這一舉措可減少約 98% 的前後端通信消耗,進而顯著減少了不必要的 CPU 資源占用。

(3)預處理機制。為了更快的完成異步 DMA map 操作,其實可以預先開始進行 DMA map 操作,而不是等待 deflate 觸發并收到 virtio_balloon 前端驅動發出的通知才進行。在接收到前端發出的通知後,隻需要做釋放位址已映射命中檢測即可。如位址未命中則可以插入 DMA map 操作,若命中則可以更快地傳回通知給虛拟機進行後續的 deflate 操作。

T級記憶體,建立效率提升10倍以上,阿裡雲 KVM異構虛拟機啟動時間優化實踐1、發現問題:記憶體越大、啟動越慢, DMA map 執行是耗時大戶2、設計思路:異步 DMA map,完美解決虛拟機建立耗時問題3. 具體實踐:三個關鍵點優化,進一步優化啟動時間結語

圖 3:VM 啟動時間與記憶體關系(左)、QEMu 初始化時間與記憶體關系(右)

如圖 3,經過上述的優化(初始保留 8G 記憶體給虛拟機),我們看到随着配置設定給虛拟機的記憶體增加,KVM 虛拟機的啟動時間及 QEMU 初始化時間均沒有明顯增加。即我們将 350G 記憶體 KVM 虛拟機的建立及啟動時間從原來的 120 秒以上減少到 20 秒以下,QEMU 初始化時間縮減到 7 秒以内。對于 T 級記憶體的使用者,預計效率可提升 10 倍以上,可以極快地獲得虛拟機的通路控制權限。

結語

未來,我們将持續依托阿裡雲智能,緻力于雲計算産品的性能及使用者體驗的優化,為使用者提供便捷、高效的彈性計算産品。

繼續閱讀