虛擬化進階(三)

一、PCI/PCI-E 設備直接分配給虛機 (PCI Pass-through)

PCI總線英文全稱爲Peripheral Component Interconnect,翻譯成中文是“外圍器件互聯”,是由PCISIG (PCI Special Interest Group)推出的一種局部並行總線標準。由ISA(Industy Standard Architecture)總線發展而來。
PCI接口數據寬度爲32位(bit,也就是常說的小b),交互速度爲33MHz,理論最大帶寬就是4Byte/s*33MHz=133MB/s,注意這裏就變成了Byte字節
PCI-X依然採用的PCI總線標準,通過提升針腳數量來提升速度,另外PCI 64/66新規範提供了64位(bit)的數據寬度和66MHz的工作頻率,理論帶寬就提升到了533MB/s。這種思路似乎就像是將兩個PCI接口合併使用,但又不是完全相同。
AGP:主要目的就是爲了解決顯示卡和處理器之間的通信問題,所以它僅是一個“端口”,這意味着它只能接駁一個終端而這個終端又必須是圖形加速卡。
PCI則是一條總線,它可以連接許多不同種類的終端,可以是顯卡,也可以是網卡或者SCSI卡,還有聲卡,等等等等。
AGP沿用了PCI的規範,32位的數據寬度,但是工作頻率是從66MHz開始,AGP1X規範就可以提供266MB/s的理論帶寬。而到了AGP2X的版本,採用了新的雙向數據傳輸技術(上升沿和下降沿各傳輸一個數據),從而理論帶寬翻倍,達到了533MB/
PCI-E:帶寬分爲1X/2X/4X/8X/16X。PCI-E接口將PCI及AGP使用的並行數據傳輸方式更改爲了串行傳輸方式,串行傳輸的優勢是傳輸速度可以更快,缺點是容易出現數據損失,不過這個缺陷在不斷進步的新技術面前已經不是什麼問題。
PCI-E 1.0 2.5GT/s(Giga Transmissionper second ,千兆傳輸/秒,即每一秒內傳輸的次數,不同於Gbps)的傳輸速度
PCI-E 2.0 5.0GT/s 雙向帶寬爲16GB/s。8bit/10bit標準
PCI-E 3.0 8.0GT/s 128bit/130bit PCI-E 3.0 X16的理論雙向帶寬可以達到32GB/s
圖一:
虛擬化進階(三)
(簡單點看,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、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 設備直接分配到虛擬機。
顯卡特殊 (http://www.linux-kvm.org/page/VGA_device_assignment)
圖2:
虛擬化進階(三)
硬盤直接分配:
一般 SATA 或者 SAS 等類型的硬盤的控制器都是直接接入到 PCI 或者 PCI-E 總線的,所以也可以將硬盤作爲普通的PCI設備直接分配個客戶機。需要注意的是,當分配硬盤時,實際上將其控制器作爲一個整體分配到客戶機中,因此需要在硬件平臺上至少有另兩個或者多個SATA或者 SAS控制器。

2、使用virtual-manager分配一個光纖卡給guest os

準備工作:
(1)在 BIOS 中打開 Intel VT-d
(2)在 Linux 內核中啓用 PCI Pass-through
添加 intel_iommu=on 到 /boot/grub/grub.conf 文件中。(例如 /boot/grub.conf)
(3)重啓系統,使得配置生效
使用 lspci -nn 命令找到待分配的 PCI 設備。這裏以一個 FC 卡爲例:
圖3:
虛擬化進階(三)
使用 lspci 命令得到的 PCI 數字的含義,以後使用 libvirt API 分配設備時會用到:
圖4:
虛擬化進階(三)
使用 virsh nodedev-list 命令找到該設備的 PCI 編號
圖5:
虛擬化進階(三)
將設備從主機上解除
圖6:
虛擬化進階(三)
使用 virt-manager 將設備直接分配給一個啓動了的虛擬機
圖7-8:
虛擬化進階(三)
虛擬化進階(三)
在虛機中查看該PCI設備
圖9:
虛擬化進階(三)
不再使用的話,需要在 virt-manager 中首先將該設備移除,然後在主機上重新掛載該設備
virsh nodedev-reattach pci_0000_0b_00_0

3、使用qemu-kvm分配一個光纖給guest os

圖:q1
虛擬化進階(三)

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 是一個網卡產生多個獨立的虛擬網卡,將每個虛擬網卡分配個一個客戶機使用。

二、SQ-IOV設備分配

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 用於分配給多個虛擬機。
網卡 SR-IOV 的例子:
圖2-1/2
虛擬化進階(三)
虛擬化進階(三)
光纖卡 SR-IOV 的例子:
圖2-3
虛擬化進階(三)

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 驅動)

3、分配SR-IOV設備的步驟

參考:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/virtualization_host_configuration_and_guest_installation_guide/sect-virtualization_host_configuration_and_guest_installation_guide-sr_iov-how_sr_iov_libvirt_works
簡單來說,SR-IOV 分配步驟和設備直接分配相比基本類似,除了要使 PF 虛擬化成多個 VF 以外。

4、優勢和不足

優勢:
真正實現設備共享 (多個客戶機共享一個 SR-IOV 設備的物理端口)
接近原生性能
相比 VT-d, SR-IOV 可以使用更少的設備來支持更多的客戶機,可以提高數據中心的空間利用率
不足:
對設備有依賴,目前只有部分設備支持 SR-IOV。RedHat Linux 只是測試了 Intel 的幾款高端網卡。
使用 SR-IOV 時不方便動態遷移客戶機。 這是因爲這時候虛機直接使用主機上的物理設備,因此虛機的遷移(migiration)和保存(save)目前都不支持。這個在將來有可能被改變。

三、各種設備虛擬化的方式比較

1、架構上的比較

圖:3-1
虛擬化進階(三)

2、性能上的比較

圖:3-2
虛擬化進階(三)
結論:
純模擬網卡的性能只有物理網卡的四成到六成
純模擬網卡的 UDP 性能比 TCP 性能高 50% 到 100%
在虛擬網卡上使用 NAPI,不但不會提高性能,反而會是性能下降
e1000 的性能比 rt18139 的性能高不少(爲什麼 RedHat Linux KVM 上默認的網卡是 rt18139 呢?)
Virtio 和 vhost_net 的吞吐量比較:
圖3-3:
虛擬化進階(三)
RedHat Linux 6 上 virtio,vhost_net,SR-IOV 和物理設備網絡延遲的比較:
圖3-4:
虛擬化進階(三)
RedHat Linux 6 上 virtio 和 vhost_net 所消耗的主機CPU資源的比較:
圖3-5:
虛擬化進階(三)
使用 virtio 的 KVM 與物理機的 TCP 吞吐量對比:
圖3-6:
虛擬化進階(三)
物理機與使用 SR-IOV 的 KVM 的網絡性能對比:
圖3-8:
虛擬化進階(三)
物理機與使用 Pass-through 的KVM 的 TCP 性能對比:
圖3-9:
虛擬化進階(三)

3、Virtio 和 Pass-Through 的詳細比較

圖3-10:
虛擬化進階(三)

四、綜合結論

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
每種方案都有優勢和不足,在特定環境下其性能有可能反而下降,因此在生產環境中使用各種虛擬化方式前需要經過完整測試

參考博客:
https://www.ibm.com/developerworks/cn/linux/l-cn-amd-virt2/
http://www.cnblogs.com/sammyliu/p/4548194.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章