KVM 介绍(4):I/O设备直接分配和 SRIOV [KVM PCI/PCIe PassThrough S

分类: 云计算/虚拟化 |
学习 KVM 的系列文章:
(1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分配和 SR-IOV (5)libvirt 介绍 (6)OpenStack 和 KVM本文将分析 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):
http://www.it165.net/uploadfile/files/2015/0605/20150605193620165.jpg介绍(4):I/O设备直接分配和
(简单点看,PCI 卡的性能没有 PCI-E 高,因为 PCI-E 是直接连在 IOMMU 上,而 PCI 卡是连在一个 IO Hub 上。)
主要的 PCI 设备类型:
Network1.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 显卡等设备供客户机直接使用。硬盘直接分配:
一般1.2 在 RedHat Linux 6 上使用 virt-manger 分配一个光纤卡给虚机
准备工作:
(1)在 BIOS 中打开
(2)在 Linux 内核中启用 PCI Pass-through
添加
(3)重启系统,使得配置生效
实际分配:
(1)使用 lspci -nn 命令找到待分配的 PCI 设备。这里以一个 FC 卡为例:
http://www.it165.net/uploadfile/files/2015/0605/20150605193620168.jpg介绍(4):I/O设备直接分配和
使用 lspci 命令得到的 PCI 数字的含义,以后使用 libvirt API 分配设备时会用到:
http://www.it165.net/uploadfile/files/2015/0605/20150605193620169.jpg介绍(4):I/O设备直接分配和
(2)使用 virsh nodedev-list 命令找到该设备的 PCI 编号
http://www.it165.net/uploadfile/files/2015/0605/20150605193620170.jpg介绍(4):I/O设备直接分配和
(3)将设备从主机上解除
http://www.it165.net/uploadfile/files/2015/0605/20150605193620171.jpg介绍(4):I/O设备直接分配和
(4)使用 virt-manager 将设备直接分配给一个启动了的虚拟机
(5)添加好了后的效果
http://www.it165.net/uploadfile/files/2015/0605/20150605193620173.jpg介绍(4):I/O设备直接分配和
(6)在虚机中查看该PCI设备
http://www.it165.net/uploadfile/files/2015/0605/20150605193620174.jpg介绍(4):I/O设备直接分配和
(7)不再使用的话,需要在 virt-manager 中首先将该设备移除,然后在主机上重新挂载该设备
1.3 在 RedHat Linux 6 上使用 qemu-kvm 分配一个光纤卡给虚机
除了步骤(4),其他步骤同上面。
http://www.it165.net/uploadfile/files/2015/0605/20150605193621176.jpg介绍(4):I/O设备直接分配和
1.4 设备直接分配让客户机的优势和不足
好处:在执行 I/O 操作时大量减少甚至避免 VM-Exit 陷入到 Hypervisor 中,极大地提高了性能,可以达到几乎和原生系统一样的性能。VT-d 克服了2. SR-IOV 设备分配
2.1 原理
http://www.it165.net/uploadfile/files/2015/0605/20150605193621178.jpg介绍(4):I/O设备直接分配和
光纤卡 SR-IOV 的例子:
http://www.it165.net/uploadfile/files/2015/0605/20150605193621179.jpg介绍(4):I/O设备直接分配和
2.2 SR-IOV 的条件
需要 CPU 支持 Intel VT-x 和 VT-D (或者 AMD 的 SVM 和 IOMMU)2.3 分配 SR-IOV 设备的步骤
手头没有支持SR-IOV的设备。这是 RedHat 上 SR-IOV 的配置步骤: Using SR-IOV。
简单来说,SR-IOV 分配步骤和设备直接分配相比基本类似,除了要使 PF 虚拟化成多个 VF 以外。
2.4 优势和不足
优势 | 不足 |
真正实现设备共享 (多个客户机共享一个 SR-IOV 设备的物理端口) 接近原生性能 相比 VT-d, SR-IOV 可以使用更少的设备来支持更多的客户机,可以提高数据中心的空间利用率。 | 对设备有依赖,目前只有部分设备支持 SR-IOV。RedHat Linux 只是测试了 Intel 的几款高端网卡。 使用 SR-IOV 时不方便动态迁移客户机。 这是因为这时候虚机直接使用主机上的物理设备,因此虚机的迁移(migiration)和保存(save)目前都不支持。这个在将来有可能被改变。 |
3. 各种设备虚拟化方式的比较
3.1 架构上的比较(以网卡为例)
http://www.it165.net/uploadfile/files/2015/0605/20150605193621181.jpg介绍(4):I/O设备直接分配和
3.2 性能上的比较 (以网卡为例)
纯模拟网卡和物理网卡的比较:
http://www.it165.net/uploadfile/files/2015/0605/20150605193621182.jpg介绍(4):I/O设备直接分配和
(来源: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
使用
结论:
纯模拟网卡的性能只有物理网卡的四成到六成 纯模拟网卡的 UDP 性能比 TCP 性能高 50% 到 100% 在虚拟网卡上使用 NAPI,不但不会提高性能,反而会是性能下降 e1000 的性能比 rt18139 的性能高不少(为什么 RedHat Linux KVM 上默认的网卡是 rt18139 呢?)Virtio 和 vhost_net 的吞吐量比较:
http://www.it165.net/uploadfile/files/2015/0605/20150605193621183.jpg介绍(4):I/O设备直接分配和
RedHat Linux 6 上 virtio,vhost_net,SR-IOV 和物理设备网络延迟的比较:
http://www.it165.net/uploadfile/files/2015/0605/20150605193621184.jpg介绍(4):I/O设备直接分配和
(来源:RedHat 官网)
RedHat Linux 6 上 virtio 和 vhost_net 所消耗的主机CPU资源的比较:
http://www.it165.net/uploadfile/files/2015/0605/20150605193621185.jpg介绍(4):I/O设备直接分配和
(来源同上)
使用 virtio 的 KVM 与物理机的 TCP 吞吐量对比:
http://www.it165.net/uploadfile/files/2015/0605/20150605193621186.jpg介绍(4):I/O设备直接分配和
(数据来源:RedHat 官网)
物理机与使用 SR-IOV 的 KVM 的网络性能对比:
http://www.it165.net/uploadfile/files/2015/0605/20150605193621187.jpg介绍(4):I/O设备直接分配和
(来源:同上)
物理机与使用 Pass-through 的KVM
http://www.it165.net/uploadfile/files/2015/0605/20150605193621188.jpg介绍(4):I/O设备直接分配和
(资料来源:Open Source Virtualization: KVM and Linux, Chris Wright, Principal Software Engineer, Red Hat,September 4, 2009)
3.3 Virtio 和 Pass-Through
的详细比较
http://www.it165.net/uploadfile/files/2015/0605/20150605193621189.jpg介绍(4):I/O设备直接分配和
(来源:Reconnaissance of Virtio: What’s new
4. 综合结论
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 每种方案都有优势和不足,在特定环境下其性能有可能反而下降,因此在生产环境中使用各种虚拟化方式前需要经过完整测试