本文将分析 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 设备类型:
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 设备直接分配到虚拟机。
网卡直接分配:
硬盘直接分配:
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 设备直接分配让客户机的优势和不足
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):
Hypervisor 能将一个或者多个 VF 分配给一个虚机。在某一时刻,一个 VF 只能被分配给一个虚机。一个虚机可以拥有多个 VF。在虚机的操作系统看来,一个 VF 网卡看起来和一个普通网卡没有区别。SR-IOV 驱动是在内核中实现的。
网卡 SR-IOV 的例子:
光纤卡 SR-IOV 的例子:
2.2 SR-IOV 的条件
RedHat Linux 6.0 官方只完整测试了下面的几款 SR-IOV 网卡:
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.) 结论:
Virtio 和 vhost_net 的吞吐量比较:
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 的详细比较
4. 综合结论KVM 依赖的Intel/AMD 处理器的各种虚拟化扩展:
I/O 虚拟化方案的选择:
其它参考资料:
(责任编辑:IT) |