第四章 I/O 裝置直接配置設定和 SR-IOV
1. PCI/PCI-E 裝置直接配置設定給虛機 (PCI Pass-through)
1.1 PCI/PCIe Pass-through 原理
1.2 在 RedHat Linux 6 上使用 virt-manger 配置設定一個光纖卡給虛機
1.3 在 RedHat Linux 6 上使用 qemu-kvm 配置設定一個光纖卡給虛機
1.4 裝置直接配置設定讓客戶機的優勢和不足
2. SR-IOV 裝置配置設定
2.1 原理
2.2 SR-IOV 的條件
2.3 配置設定 SR-IOV 裝置的步驟
2.4 優勢和不足
3. 各種裝置虛拟化方式的比較
3.1 架構上的比較(以網卡為例)
3.2 性能上的比較 (以網卡為例)
3.3 Virtio 和 Pass-Through 的詳細比較
4. 綜合結論
【KVM系列文章】https://blog.csdn.net/baidu_37107022/article/details/88812463
本文将分析 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 在 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
- 每種方案都有優勢和不足,在特定環境下其性能有可能反而下降,是以在生産環境中使用各種虛拟化方式前需要經過完整測試