PCI 和 PCI-E iommu


本文將分析 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 的條件

  1. 需要 CPU 支持 Intel VT-x 和 VT-D (或者 AMD 的 SVM 和 IOMMU) 
  2. 需要有支持 SR-IOV 規范的設備:目前這種設備較多,比如Intel的很多中高端網卡等。
  3. 需要 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 設備的物理端口)
  2. 接近原生性能
  3. 相比 VT-d, SR-IOV 可以使用更少的設備來支持更多的客戶機,可以提高數據中心的空間利用率。
  1. 對設備有依賴,目前只有部分設備支持 SR-IOV。RedHat Linux 只是測試了 Intel 的幾款高端網卡。
  2. 使用 SR-IOV 時不方便動態遷移客戶機。 這是因為這時候虛機直接使用主機上的物理設備,因此虛機的遷移(migiration)和保存(save)目前


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM