本文將分析 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 原理

硬盤直接分配:
- 一般 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 原理
- 物理功能(Physical Functions,PF):這是完整的帶有 SR-IOV 能力的PCIe 設備。PF 能像普通 PCI 設備那樣被發現、管理和配置。
- 虛擬功能(Virtual Functions,VF):簡單的 PCIe 功能,它只能處理I/O。每個 VF 都是從 PF 中分離出來的。每個物理硬件都有一個 VF 數目的限制。一個 PF,能被虛擬成多個 VF 用於分配給多個虛擬機。
光纖卡 SR-IOV 的例子:
2.2 SR-IOV 的條件
- 需要 CPU 支持 Intel VT-x 和 VT-D (或者 AMD 的 SVM 和 IOMMU)
- 需要有支持 SR-IOV 規范的設備:目前這種設備較多,比如Intel的很多中高端網卡等。
- 需要 QEMU/KAM 的支持。
- 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 優勢和不足
優勢 | 不足 |
|
|