學習 KVM 的系列文章:
本文將分析 PCI/PCIe 設備直接分配(Pass-through)和 SR-IOV, 以及三種 I/O 虛擬化方式的比較。
1. PCI/PCI-E 設備直接分配給虛機 (PCI Pass-through)
設備直接分配 (Device assignment)也稱爲 Device Pass-Through。
先簡單看看PCI 和 PCI-E 的區別(AMD CPU):
(簡單點看,PCI 卡的性能沒有 PCI-E 高,因爲 PCI-E 是直接連在 IOMMU 上,而 PCI 卡是連在一個 IO Hub 上。)
主要的 PCI 設備類型:
- Network cards (wired or wireless)
- SCSI adapters
- Bus controllers: USB,PCMCIA, I2C, FireWire, IDE
- Graphics and video cards
- Sound cards
1.1 PCI/PCIe Pass-through 原理
這種方式,允許將宿主機中的物理 PCI 設備直接分配給客戶機使用。較新的x86平臺已經支持這種類型,Intel 定義的 I/O 虛擬化技術成爲 VT-d,AMD 的稱爲 AMD-V。KVM 支持客戶機以獨佔方式訪問這個宿主機的 PCI/PCI-E 設備。通過硬件支持的 VT-d 技術將設備分給客戶機後,在客戶機看來,設備是物理上連接在PCI或者PCI-E總線上的,客戶機對該設備的I/O交互操作和實際的物理設備操作完全一樣,不需要或者很少需要 KVM 的參與。運行在 VT-d 平臺上的 QEMU/KVM,可以分配網卡、磁盤控制器、USB控制器、VGA 顯卡等設備供客戶機直接使用。
幾乎所有的 PCI 和 PCI-E 設備都支持直接分配,除了顯卡以外(顯卡的特殊性在這裏)。PCI Pass-through 需要硬件平臺 Intel VT-d 或者 AMD IOMMU 的支持。這些特性必須在 BIOS 中被啓用。Red Hat Enterprise Linux 6.0 及以上版本支持熱插拔的 PCI 設備直接分配到虛擬機。
網卡直接分配:
硬盤直接分配:
- 一般 SATA 或者 SAS 等類型的硬盤的控制器都是直接接入到 PCI 或者 PCI-E總線的,所以也可以將硬盤作爲普通的PCI設備直接分配個客戶機。需要注意的是,當分配硬盤時,實際上將其控制器作爲一個整體分配到客戶機中,因此需要在硬件平臺上至少有另兩個或者多個SATA或者SAS控制器。
1.2 設備直接分配讓客戶機的優勢和不足
-
好處:在執行 I/O 操作時大量減少甚至避免 VM-Exit 陷入到 Hypervisor中,極大地提高了性能,可以達到幾乎和原生系統一樣的性能。VT-d 克服了 virtio 兼容性不好和 CPU 使用頻率較高的問題。
-
不足:(1)一臺服務器主板上的空間比較有限,因此允許添加的 PCI 和 PCI-E 設備是有限的。大量使用 VT-d 獨立分配設備給客戶機,讓硬件設備數量增加,這會增加硬件投資成本。(2)對於使用 VT-d 直接分配了設備的客戶機,其動態遷移功能將受限,不過也可以使用熱插拔或者libvirt 工具等方式來緩解這個問題。
-
不足的解決方案:(1)在一臺物理宿主機上,僅少數 I/O 如網絡性能要求較高的客戶機使用 VT-d直接分配設備,其他的使用純模擬或者virtio 已達到多個客戶機共享同一個設備的目的 (2)對於網絡I/O的解決辦法,可以選擇 SR-IOV 是一個網卡產生多個獨立的虛擬網卡,將每個虛擬網卡分配個一個客戶機使用。
2. SR-IOV 設備分配
2.1 原理
VT-d 的性能非常好,但是它的物理設備只能分配給一個客戶機使用。爲了實現多個虛機共享一個物理設備,並且達到直接分配的目的,PCI-SIG 組織發佈了 SR-IOV (Single Root I/O Virtualization and sharing) 規範,它定義了一個標準化的機制用以原生地支持實現多個客戶機共享一個設備。不過,目前 SR-IOV (單根 I/O 虛擬化)最廣泛地應用還是網卡上。
SR-IOV 使得一個單一的功能單元(比如,一個以太網端口)能看起來像多個獨立的物理設備。一個帶有 SR-IOV 功能的物理設備能被配置爲多個功能單元。SR-IOV 使用兩種功能(function):
- 物理功能(Physical Functions,PF):這是完整的帶有 SR-IOV 能力的PCIe 設備。PF 能像普通 PCI設備那樣被發現、管理和配置。
- 虛擬功能(Virtual Functions,VF):簡單的 PCIe 功能,它只能處理I/O。每個 VF都是從 PF 中分離出來的。每個物理硬件都有一個 VF 數目的限制。一個 PF,能被虛擬成多個 VF 用於分配給多個虛擬機。
Hypervisor 能將一個或者多個 VF 分配給一個虛機。在某一時刻,一個 VF 只能被分配給一個虛機。一個虛機可以擁有多個 VF。在虛機的操作系統看來,一個 VF 網卡看起來和一個普通網卡沒有區別。SR-IOV 驅動是在內核中實現的。
網卡 SR-IOV 的例子:
光纖卡 SR-IOV 的例子:
2.2 SR-IOV 的條件
- 需要 CPU 支持 Intel VT-x 和 VT-D (或者 AMD 的 SVM 和 IOMMU)
- 需要有支持 SR-IOV規範的設備:目前這種設備較多,比如Intel的很多中高端網卡等。
- 需要 QEMU/KAM 的支持。
RedHat Linux 6.0 官方只完整測試了下面的幾款 SR-IOV 網卡:
- Intel® 82576NS Gigabit Ethernet Controller ( igb 驅動)
- Intel® 82576EB Gigabit Ethernet Controller ( igb 驅動)
- Intel® 82599ES 10 Gigabit Ethernet Controller ( ixgbe 驅動)
- Intel® 82599EB 10 Gigabit Ethernet Controller ( ixgbe 驅動)
2.3 分配 SR-IOV 設備的步驟
手頭沒有支持SR-IOV的設備。這是 RedHat 上 SR-IOV 的配置步驟: Using SR-IOV。
簡單來說,SR-IOV 分配步驟和設備直接分配相比基本類似,除了要使 PF 虛擬化成多個 VF 以外。
2.4 優勢和不足
1、優勢
- 真正實現設備共享 (多個客戶機共享一個 SR-IOV 設備的物理端口)
- 接近原生性能
- 相比 VT-d, SR-IOV 可以使用更少的設備來支持更多的客戶機,可以提高數據中心的空間利用率。
2、不足
-
對設備有依賴,目前只有部分設備支持 SR-IOV。RedHat Linux 只是測試了 Intel 的幾款高端網卡。
-
使用SR-IOV時不方便動態遷移客戶機。這是因爲這時候虛機直接使用主機上的物理設備,因此虛機的遷移(migiration)和保存(save)目前都不支持。這個在將來有可能被改變。
3. 各種設備虛擬化方式的比較
3.1 架構上的比較(以網卡爲例)
3.2 性能上的比較 (以網卡爲例)
純模擬網卡和物理網卡的比較:
(來源:Evaluating and Optimizing I/O Virtualization in Kernel-based Virtual Machine (KVM), Binbin Zhang, Xiaolin Wang, Rongfeng Lai, Liang Yang, Zhenlin Wang,Yingwei Luo, Xiaoming Li)
(測試環境:兩臺物理服務器 HostA 和 HostB,都使用GB以太網。HostA 使用 82566DC 網卡,HostB 使用 82567LM-2 網卡,一臺虛機運行在 HostB 上,使用 KVM-76.)
結論:
- 純模擬網卡的性能只有物理網卡的四成到六成
- 純模擬網卡的 UDP 性能比 TCP 性能高 50% 到 100%
- 在虛擬網卡上使用NAPI,不但不會提高性能,反而會是性能下降
- e1000 的性能比 rt18139 的性能高不少(爲什麼 RedHat Linux KVM上默認的網卡是 rt18139 呢?)
Virtio 和 vhost_net 的吞吐量比較:
- 來源:CANONICAL, KVM Performance Optimization, Paul Sim,Cloud Consultant, [email protected]
- 結論: vhost_net 比 virtio 的 UDP 和 TCP 性能高 20% 左右。
RedHat Linux 6 上 virtio,vhost_net,SR-IOV 和物理設備網絡延遲的比較:
(來源:RedHat 官網)
RedHat Linux 6 上 virtio 和 vhost_net 所消耗的主機CPU資源的比較:
(來源同上)
使用 virtio 的 KVM 與物理機的 TCP 吞吐量對比:
(數據來源:RedHat 官網)
物理機與使用 SR-IOV 的 KVM 的網絡性能對比:
(來源:同上)
物理機與使用 Pass-through 的KVM 的 TCP 性能對比:
(資料來源:Open Source Virtualization: KVM and Linux, Chris Wright, Principal Software Engineer, Red Hat,September 4, 2009)
3.3 Virtio 和 Pass-Through 的詳細比較
(來源:Reconnaissance of Virtio: What’s new and how it’s all connected? by Mario Smarduch)
4. 綜合結論
KVM 依賴的Intel/AMD 處理器的各種虛擬化擴展:
處理器 | CPU 虛擬化 | 內存虛擬化 | PCI Pass-through |
---|---|---|---|
Intel | VT-x | VPID,EPT | VT-d |
AMD | AMD-V | ASID,NPT | IOMMU |
I/O 虛擬化方案的選擇:
- I/O設備儘量使用準虛擬化(virtio 和 vhost_net)
- 如果需要實時遷移,不能使用 SR-IOV
- 對更高I/O要求又不需要實時遷移的,可以使用 SR-IOV
- 每種方案都有優勢和不足,在特定環境下其性能有可能反而下降,因此在生產環境中使用各種虛擬化方式前需要經過完整測試