一、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
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、架构上的比较
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 的详细比较
四、综合结论
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