SPDK Vhost-user 如何幫助超融合架構實現 I/O 儲存效能提升

SmartX超融合發表於2022-03-08

作者:深耕行業的 SmartX 金融團隊


本文主要介紹 使用 SPDK vhost-user 技術,來加速 KVM 虛擬機器中 virtio-blk/virtio-scsi 儲存裝置的 I/O 效能 ,並結合架構場景展開說明,讓讀者對這項技術帶來的特性提升有更直觀的瞭解。


首先我們先看看當前主流的 I/O 裝置虛擬化方案:

  • QEMU 純軟體模擬,利用軟體模擬 I/O 裝置提供給虛擬機器使用。

  • Virtio 半虛擬方案,規範了前後端模型,在虛擬機器(Guest OS)中使用 frontend 驅動(Virtio Drive),在 Hypervisor(QEMU)中使用 backend 裝置(Virtio Device)提供 I/O 能力,透過減少記憶體複製次數和 VM 陷入次數,提升 I/O 效能,這種方案需要安裝 Virtio 驅動。


本文的主角 vhost 技術是基於 Virtio 規範發展衍生出來, 最佳化 I /O 鏈路,可以用來加速 QEMU 中半虛擬化的 Virtio 裝置 I/O 效能

Virtio 介紹

Virtio 基於 Vring 的 I/O 通訊機制,相比 QEMU 的純軟體模擬, 有效降低了 I/O 延遲,具有效能優勢這也是 Virtio 普及的原因,各個廠商的半虛擬化 I/O 裝置實現方式開始變得統一。

在 QEMU 中,Virtio 裝置是為 Guest 作業系統模擬的 PCI/PCIe 裝置,遵循 PCI 規範,具有配置空間、中斷配置等功能。Virtio 註冊了 PCI 廠商 ID(0x1AF4)和裝置 ID,不同的裝置 ID 代表不同的裝置型別,例如面向儲存的 virtio-blk(0x1001)和 virtio-scsi 裝置 ID(0x1004)。

Virtio 由三部分組成,前端是驅動層,位於 Guest 系統內部,中間是虛擬佇列(virtqueue),負責資料傳輸和命令互動,後端裝置層,用於具體處理 Guest 傳送的請求。


下面我們一起來看一下超融合架構下,基於 virtio-blk 的資料路徑是什麼樣子的。


備註:超融合架構是一種 IT 基礎架構解決方案,將計算、儲存和網路資源整合在一個統一系統(計算伺服器)中。超融合基礎架構由虛擬化、分散式儲存和軟體定義網路組成。利用分散式架構實現叢集的可靠性和容錯性,並透過將計算與儲存整合在一起,靈活部署在通用標準硬體上,來降低資料中心複雜性和佔用空間,並支援更多的現代工作負載。

  1. Guest 發起 I/O 操作,Guest 核心 Virtio 驅動寫 PCI 配置空間,觸發 VM EXIT,返回到 Host KVM 中(通知 KVM);

  2. QEMU 的 vCPU 執行緒從 KVM 核心態回到 QEMU,讓 QEMU Device 來處理 Virtio Vring 請求;

  3. QEMU 透過 iSCSI Drive 發起儲存連線(iscsi over tcp to localhost);

  4. 透過 Socket 將請求連線到儲存程式提供的 iSCSI Target;

  5. 儲存引擎接收請求並進行 I/O 處理;

  6. 儲存引擎發起對本地儲存介質的 I/O;

  7. I/O 操作結束,透過上述逆過程返回至 Virtio 後端 Device,QEMU 會向模擬的 PCI 傳送中斷通知,從而 Guest 基於該中斷完成整個 I/O 流程。


QEMU 透過本地 Socket 連線儲存程式,資料流從使用者態到核心態再到使用者態(資料複製開銷),同時 iSCSI 協議層也存在效能消耗, 如果儲存程式可以直接接收處理本地 I/O,就可以避免這些問題帶來的損耗,實現 Virtio Offload to Storage Software


Vhost 加速

如前所述,Virtio 後端 Device 用於具體處理 Guest 的請求,負責 I/O 的響應,把 I/O 處理模組放在 QEMU 程式之外去實現的方案稱為 vhost。由於我們需要實現的最佳化目標是在兩個使用者態程式之間(超融合架構),所以採用 vhost-user 方案進行儲存加速實現(vhost-kernel 方案主要是將 I/O 負載解除安裝到核心完成,所在不在本文討論)。

V host-user 的資料平面處理主要分為 Master 和 Slave 兩個部分,其中 Master 為 virtqueue 的供應方,一般由 QEMU 作為 Master,儲存軟體作為 Slave,負責消費 virtqueue 中的 I/O 請求。

Vhost-user 方案優勢:

  • 消除 Guest 核心更新 PCI 配置空間,QEMU 捕獲 Guest 的 VMM 陷入所帶來的 CPU 上下文開銷(後端處理執行緒採用輪詢所有 virtqueue)。

  • 使用者態程式間記憶體共享,最佳化資料複製效率(零複製)。

  1. 當 Guest 發起 I/O 操作後,儲存軟體透過 Polling 機制感知新的請求動作,從 virtqueue 獲取資料;

  2. 儲存引擎接收請求並進行 I/O 處理;

  3. 儲存引擎發起對本地儲存介質的 I/O;

  4. I/O 操作完成後,由 vhost device 傳送 irqfd(eventfd)通知到 KVM;

  5. KVM 注入中斷通知 Guest OS 完成 I/O。

注:前端 vhost driver 與後端 vhost device 之間的控制類資訊傳遞透過 UNIX Domain Socket 檔案實現。


介紹完理論過程,讓我們看一組儲存效能對比 Virtio vs Vhost-user(單節點效能)。

測試資料基於 3 節點叢集(超融合架構,叢集儲存網路未開啟 RDMA),節點硬體配置如下:

  • Intel Xeon Gold 5122 3.6GHz

  • 8*16G DDR4 2666MHz

  • 2*Intel P4610 1.6T NVMe

  • Mellanox CX-4 25Gbps


透過圖表對比單節點 4k iodepth=128 下的 IOPS(數值越高越好)效能差異:

透過圖表對比單節點 4k iodepth=1 下的 Latency(數值越低越好)效能差異:

總結

透過理論和真實的效能資料介紹,可以看出,相比 Virtio 方案, 透過 Vhost 技術實現了更加突出的儲存效能表現,但 作為企業級產品交付,需要考慮到企業級功能,例如儲存軟體異常下的 Vhost 重連/切換、虛擬機器的記憶體熱新增等實際場景,希望這篇文章對於讀者理解 Vhost 以及適配超融合架構有所幫助。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69974533/viewspace-2867422/,如需轉載,請註明出處,否則將追究法律責任。

相關文章