KVM(四) I/O 裝置直接分配和 SR-IOV
(4):I/O 裝置直接分配和 SR-IOV
本文將分析 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 裝置都支援直接分配,除了顯示卡以外(顯示卡的特殊性在這裡)。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 在 RedHat Linux 6 上使用 virt-manger 分配一個光纖卡給虛機
準備工作:
(1)在 BIOS 中開啟 Intel VT-d
(2)在 Linux 核心中啟用 PCI Pass-through
新增 intel_iommu=on 到 /boot/grub/grub.conf 檔案中。(在我的 RedHat Linux 6上,該檔案是 /boot/grub.conf)
(3)重啟系統,使得配置生效
實際分配:
(1)使用 lspci -nn 命令找到待分配的 PCI 裝置。這裡以一個 FC 卡為例:
使用 lspci 命令得到的 PCI 數字的含義,以後使用 libvirt API 分配裝置時會用到:
(2)使用 virsh nodedev-list 命令找到該裝置的 PCI 編號
(3)將裝置從主機上解除
(4)使用 virt-manager 將裝置直接分配給一個啟動了的虛擬機器
(5)新增好了後的效果
(6)在虛機中檢視該PCI裝置
(7)不再使用的話,需要在 virt-manager 中首先將該裝置移除,然後在主機上重新掛載該裝置
1.3 在 RedHat Linux 6 上使用 qemu-kvm 分配一個光纖卡給虛機
除了步驟(4),其他步驟同上面。
1.4 裝置直接分配讓客戶機的優勢和不足
- 好處:在執行 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 優勢和不足
優勢 | 不足 |
|
|
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
- 每種方案都有優勢和不足,在特定環境下其效能有可能反而下降,因此在生產環境中使用各種虛擬化方式前需要經過完整測試