【KVM系列04】KVM的I/O 设备直接分配和SR-IOV
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?第四章 I/O 設(shè)備直接分配和 SR-IOV?
1. PCI/PCI-E 設(shè)備直接分配給虛機(jī) (PCI Pass-through)
1.1 PCI/PCIe Pass-through 原理
1.2 在 RedHat Linux 6 上使用 virt-manger 分配一個光纖卡給虛機(jī)
1.3 在 RedHat Linux 6 上使用 qemu-kvm 分配一個光纖卡給虛機(jī)
1.4 設(shè)備直接分配讓客戶機(jī)的優(yōu)勢和不足
2. SR-IOV 設(shè)備分配
2.1 原理
2.2 SR-IOV 的條件
2.3 分配 SR-IOV 設(shè)備的步驟
2.4 優(yōu)勢和不足
3. 各種設(shè)備虛擬化方式的比較
3.1 架構(gòu)上的比較(以網(wǎng)卡為例)
3.2 性能上的比較 (以網(wǎng)卡為例)
3.3??Virtio 和 Pass-Through 的詳細(xì)比較
?4. 綜合結(jié)論
【KVM系列文章】https://blog.csdn.net/baidu_37107022/article/details/88812463
?
本文將分析 PCI/PCIe 設(shè)備直接分配(Pass-through)和 SR-IOV, 以及三種 I/O 虛擬化方式的比較。
1. PCI/PCI-E 設(shè)備直接分配給虛機(jī) (PCI Pass-through)
設(shè)備直接分配 (Device assignment)也稱為 Device Pass-Through。
先簡單看看PCI 和 PCI-E 的區(qū)別(AMD CPU):
(簡單點看,PCI 卡的性能沒有 PCI-E 高,因為 PCI-E 是直接連在 IOMMU 上,而 PCI 卡是連在一個 IO Hub 上。)
主要的 PCI 設(shè)備類型:
- 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 原理
這種方式,允許將宿主機(jī)中的物理 PCI 設(shè)備直接分配給客戶機(jī)使用。較新的x86平臺已經(jīng)支持這種類型,Intel 定義的 I/O 虛擬化技術(shù)成為 VT-d,AMD 的稱為 AMD-V。KVM 支持客戶機(jī)以獨占方式訪問這個宿主機(jī)的 PCI/PCI-E 設(shè)備。通過硬件支持的 VT-d 技術(shù)將設(shè)備分給客戶機(jī)后,在客戶機(jī)看來,設(shè)備是物理上連接在PCI或者PCI-E總線上的,客戶機(jī)對該設(shè)備的I/O交互操作和實際的物理設(shè)備操作完全一樣,不需要或者很少需要 KVM 的參與。運行在 VT-d 平臺上的 QEMU/KVM,可以分配網(wǎng)卡、磁盤控制器、USB控制器、VGA 顯卡等設(shè)備供客戶機(jī)直接使用。
幾乎所有的 PCI 和 PCI-E 設(shè)備都支持直接分配,除了顯卡以外(顯卡的特殊性在這里)。PCI Pass-through 需要硬件平臺?Intel VT-d 或者?AMD IOMMU 的支持。這些特性必須在 BIOS 中被啟用。Red Hat Enterprise Linux 6.0 及以上版本支持熱插拔的 PCI 設(shè)備直接分配到虛擬機(jī)。
網(wǎng)卡直接分配:
硬盤直接分配:
- 一般?SATA 或者 SAS 等類型的硬盤的控制器都是直接接入到 PCI 或者 ?PCI-E 總線的,所以也可以將硬盤作為普通的PCI設(shè)備直接分配個客戶機(jī)。需要注意的是,當(dāng)分配硬盤時,實際上將其控制器作為一個整體分配到客戶機(jī)中,因此需要在硬件平臺上至少有另兩個或者多個SATA或者 SAS控制器。?
1.2 在 RedHat Linux 6 上使用 virt-manger 分配一個光纖卡給虛機(jī)
準(zhǔn)備工作:
(1)在 BIOS 中打開?Intel VT-d?
(2)在 Linux 內(nèi)核中啟用 PCI Pass-through
添加?intel_iommu=on 到?/boot/grub/grub.conf 文件中。(在我的 RedHat Linux 6上,該文件是 /boot/grub.conf)
(3)重啟系統(tǒng),使得配置生效
實際分配:
(1)使用 lspci -nn 命令找到待分配的 PCI 設(shè)備。這里以一個 FC 卡為例:
使用 lspci 命令得到的 PCI 數(shù)字的含義,以后使用 libvirt API 分配設(shè)備時會用到:
(2)使用 virsh nodedev-list 命令找到該設(shè)備的 PCI 編號
(3)將設(shè)備從主機(jī)上解除
(4)使用 virt-manager 將設(shè)備直接分配給一個啟動了的虛擬機(jī)
?
(5)添加好了后的效果
(6)在虛機(jī)中查看該PCI設(shè)備
(7)不再使用的話,需要在 virt-manager 中首先將該設(shè)備移除,然后在主機(jī)上重新掛載該設(shè)備
??
1.3 在 RedHat Linux 6 上使用 qemu-kvm 分配一個光纖卡給虛機(jī)
除了步驟(4),其他步驟同上面。
?
1.4 設(shè)備直接分配讓客戶機(jī)的優(yōu)勢和不足
- 好處:在執(zhí)行 I/O 操作時大量減少甚至避免 VM-Exit 陷入到 Hypervisor 中,極大地提高了性能,可以達(dá)到幾乎和原生系統(tǒng)一樣的性能。VT-d 克服了?virtio 兼容性不好和 CPU 使用頻率較高的問題。
- 不足:(1)一臺服務(wù)器主板上的空間比較有限,因此允許添加的 PCI 和 PCI-E 設(shè)備是有限的。大量使用?VT-d 獨立分配設(shè)備給客戶機(jī),讓硬件設(shè)備數(shù)量增加,這會增加硬件投資成本。(2)對于使用 VT-d 直接分配了設(shè)備的客戶機(jī),其動態(tài)遷移功能將受限,不過也可以使用熱插拔或者libvirt 工具等方式來緩解這個問題。
- 不足的解決方案:(1)在一臺物理宿主機(jī)上,僅少數(shù) I/O 如網(wǎng)絡(luò)性能要求較高的客戶機(jī)使用 VT-d直接分配設(shè)備,其他的使用純模擬或者 virtio 已達(dá)到多個客戶機(jī)共享同一個設(shè)備的目的 (2)對于網(wǎng)絡(luò)I/O的解決辦法,可以選擇 SR-IOV 是一個網(wǎng)卡產(chǎn)生多個獨立的虛擬網(wǎng)卡,將每個虛擬網(wǎng)卡分配個一個客戶機(jī)使用。
2. SR-IOV 設(shè)備分配
2.1 原理
? ? VT-d 的性能非常好,但是它的物理設(shè)備只能分配給一個客戶機(jī)使用。為了實現(xiàn)多個虛機(jī)共享一個物理設(shè)備,并且達(dá)到直接分配的目的,PCI-SIG 組織發(fā)布了 SR-IOV (Single Root I/O Virtualization and?sharing) 規(guī)范,它定義了一個標(biāo)準(zhǔn)化的機(jī)制用以原生地支持實現(xiàn)多個客戶機(jī)共享一個設(shè)備。不過,目前 SR-IOV (單根 I/O 虛擬化)最廣泛地應(yīng)用還是網(wǎng)卡上。?
SR-IOV 使得一個單一的功能單元(比如,一個以太網(wǎng)端口)能看起來像多個獨立的物理設(shè)備。一個帶有 SR-IOV 功能的物理設(shè)備能被配置為多個功能單元。SR-IOV 使用兩種功能(function):
- 物理功能(Physical Functions,PF):這是完整的帶有 SR-IOV 能力的PCIe 設(shè)備。PF 能像普通 PCI 設(shè)備那樣被發(fā)現(xiàn)、管理和配置。
- 虛擬功能(Virtual Functions,VF):簡單的 PCIe 功能,它只能處理I/O。每個 VF 都是從 PF 中分離出來的。每個物理硬件都有一個 VF 數(shù)目的限制。一個 PF,能被虛擬成多個 VF 用于分配給多個虛擬機(jī)。
Hypervisor 能將一個或者多個 VF 分配給一個虛機(jī)。在某一時刻,一個 VF 只能被分配給一個虛機(jī)。一個虛機(jī)可以擁有多個 VF。在虛機(jī)的操作系統(tǒng)看來,一個 VF 網(wǎng)卡看起來和一個普通網(wǎng)卡沒有區(qū)別。SR-IOV 驅(qū)動是在內(nèi)核中實現(xiàn)的。
網(wǎng)卡 SR-IOV 的例子:
?
光纖卡 SR-IOV 的例子:
2.2 SR-IOV 的條件
?RedHat Linux 6.0 官方只完整測試了下面的幾款 SR-IOV 網(wǎng)卡:
- Intel? 82576NS Gigabit Ethernet Controller (?igb?驅(qū)動)
- Intel? 82576EB Gigabit Ethernet Controller (?igb?驅(qū)動)
- Intel? 82599ES 10 Gigabit Ethernet Controller (?ixgbe?驅(qū)動)
- Intel? 82599EB 10 Gigabit Ethernet Controller (?ixgbe?驅(qū)動)
2.3 分配 SR-IOV 設(shè)備的步驟
手頭沒有支持SR-IOV的設(shè)備。這是 RedHat 上 SR-IOV 的配置步驟:?Using SR-IOV。
簡單來說,SR-IOV 分配步驟和設(shè)備直接分配相比基本類似,除了要使 PF 虛擬化成多個 VF 以外。
2.4 優(yōu)勢和不足
| 優(yōu)勢 | 不足 |
| | |
3. 各種設(shè)備虛擬化方式的比較
3.1 架構(gòu)上的比較(以網(wǎng)卡為例)
3.2 性能上的比較 (以網(wǎng)卡為例)
純模擬網(wǎng)卡和物理網(wǎng)卡的比較:
(來源: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)
(測試環(huán)境:兩臺物理服務(wù)器 HostA 和 HostB,都使用GB以太網(wǎng)。HostA 使用?82566DC 網(wǎng)卡,HostB 使用?82567LM-2 網(wǎng)卡,一臺虛機(jī)運行在 HostB 上,使用 KVM-76.)
結(jié)論:
- 純模擬網(wǎng)卡的性能只有物理網(wǎng)卡的四成到六成
- 純模擬網(wǎng)卡的 UDP 性能比 TCP 性能高 50% 到 100%
- 在虛擬網(wǎng)卡上使用 NAPI,不但不會提高性能,反而會是性能下降
- e1000 的性能比 rt18139 的性能高不少(為什么 RedHat Linux KVM 上默認(rèn)的網(wǎng)卡是 rt18139 呢?)
Virtio 和 vhost_net 的吞吐量比較:
- 來源:CANONICAL, KVM Performance Optimization, Paul Sim,Cloud Consultant, paul.sim@canonical.com
- 結(jié)論: vhost_net 比 virtio 的 UDP 和 TCP 性能高 20% 左右。
RedHat Linux 6 上 virtio,vhost_net,SR-IOV 和物理設(shè)備網(wǎng)絡(luò)延遲的比較:
(來源:RedHat 官網(wǎng))
RedHat Linux 6 上 virtio 和 vhost_net 所消耗的主機(jī)CPU資源的比較:
(來源同上)
使用 virtio 的 KVM 與物理機(jī)的 TCP 吞吐量對比:
(數(shù)據(jù)來源:RedHat 官網(wǎng))
物理機(jī)與使用 SR-IOV 的 KVM 的網(wǎng)絡(luò)性能對比:
(來源:同上)
物理機(jī)與使用 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 的詳細(xì)比較
(來源:Reconnaissance of Virtio: What’s new?and how it’s all connected? by?Mario Smarduch)
?4. 綜合結(jié)論
KVM 依賴的Intel/AMD 處理器的各種虛擬化擴(kuò)展:
| 處理器 | CPU 虛擬化 | 內(nèi)存虛擬化 | PCI Pass-through |
| Intel | VT-x | VPID,EPT | VT-d |
| AMD | AMD-V | ASID,NPT | IOMMU |
I/O 虛擬化方案的選擇:
- I/O設(shè)備盡量使用準(zhǔn)虛擬化(virtio 和 vhost_net)
- 如果需要實時遷移,不能使用 SR-IOV
- 對更高I/O要求又不需要實時遷移的,可以使用 SR-IOV
- 每種方案都有優(yōu)勢和不足,在特定環(huán)境下其性能有可能反而下降,因此在生產(chǎn)環(huán)境中使用各種虛擬化方式前需要經(jīng)過完整測試
總結(jié)
以上是生活随笔為你收集整理的【KVM系列04】KVM的I/O 设备直接分配和SR-IOV的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【KVM系列03】KVM的I/O 全虚拟
- 下一篇: 【KVM系列05】Libvirt 介绍