KVM 介绍(4):I/O 设备直接分配和 SR-IOV [KVM PCI/PCIe Pass-Through SR-IOV]

学习 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):

(简单点看,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.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 设备直接分配到虚拟机。

 

网卡直接分配:

 

硬盘直接分配:

  • 一般 SATA 或者 SAS 等类型的硬盘的控制器都是直接接入到 PCI 或者  PCI-E 总线的,所以也可以将硬盘作为普通的PCI设备直接分配个客户机。需要注意的是,当分配硬盘时,实际上将其控制器作为一个整体分配到客户机中,因此需要在硬件平台上至少有另两个或者多个SATA或者 SAS控制器。 

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 设备直接分配让客户机的优势和不足

  • 好处:在执行 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 是一个网卡产生多个独立的虚拟网卡,将每个虚拟网卡分配个一个客户机使用。

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):

  • 物理功能(Physical Functions,PF):这是完整的带有 SR-IOV 能力的PCIe 设备。PF 能像普通 PCI 设备那样被发现、管理和配置。
  • 虚拟功能(Virtual Functions,VF):简单的 PCIe 功能,它只能处理I/O。每个 VF 都是从 PF 中分离出来的。每个物理硬件都有一个 VF 数目的限制。一个 PF,能被虚拟成多个 VF 用于分配给多个虚拟机。

 

Hypervisor 能将一个或者多个 VF 分配给一个虚机。在某一时刻,一个 VF 只能被分配给一个虚机。一个虚机可以拥有多个 VF。在虚机的操作系统看来,一个 VF 网卡看起来和一个普通网卡没有区别。SR-IOV 驱动是在内核中实现的。

 

网卡 SR-IOV 的例子:

 

光纤卡 SR-IOV 的例子:

2.2 SR-IOV 的条件

  1. 需要 CPU 支持 Intel VT-x 和 VT-D (或者 AMD 的 SVM 和 IOMMU) 
  2. 需要有支持 SR-IOV 规范的设备:目前这种设备较多,比如Intel的很多中高端网卡等。
  3. 需要 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 驱动)

2.3 分配 SR-IOV 设备的步骤

手头没有支持SR-IOV的设备。这是 RedHat 上 SR-IOV 的配置步骤: Using SR-IOV

简单来说,SR-IOV 分配步骤和设备直接分配相比基本类似,除了要使 PF 虚拟化成多个 VF 以外。

2.4 优势和不足

优势不足
  1. 真正实现设备共享 (多个客户机共享一个 SR-IOV 设备的物理端口)
  2. 接近原生性能
  3. 相比 VT-d, SR-IOV 可以使用更少的设备来支持更多的客户机,可以提高数据中心的空间利用率。
  1. 对设备有依赖,目前只有部分设备支持 SR-IOV。RedHat Linux 只是测试了 Intel 的几款高端网卡。
  2. 使用 SR-IOV 时不方便动态迁移客户机。 这是因为这时候虚机直接使用主机上的物理设备,因此虚机的迁移(migiration)和保存(save)目前都不支持。这个在将来有可能被改变。

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.)

结论:

  • 纯模拟网卡的性能只有物理网卡的四成到六成
  • 纯模拟网卡的 UDP 性能比 TCP 性能高 50% 到 100%
  • 在虚拟网卡上使用 NAPI,不但不会提高性能,反而会是性能下降
  • e1000 的性能比 rt18139 的性能高不少(为什么 RedHat Linux KVM 上默认的网卡是 rt18139 呢?)

Virtio 和 vhost_net 的吞吐量比较:

  • 来源:CANONICAL, KVM Performance Optimization, Paul Sim,Cloud Consultant, paul.sim@canonical.com
  • 结论: vhost_net 比 virtio 的 UDP 和 TCP 性能高 20% 左右。

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 的详细比较


(来源:Reconnaissance of Virtio: What’s new and how it’s all connected? by Mario Smarduch)

 4. 综合结论

KVM 依赖的Intel/AMD 处理器的各种虚拟化扩展:

处理器CPU 虚拟化内存虚拟化PCI Pass-through
IntelVT-xVPID,EPTVT-d
AMDAMD-VASID,NPTIOMMU

 

I/O 虚拟化方案的选择:

  • I/O设备尽量使用准虚拟化(virtio 和 vhost_net)
  • 如果需要实时迁移,不能使用 SR-IOV
  • 对更高I/O要求又不需要实时迁移的,可以使用 SR-IOV
  • 每种方案都有优势和不足,在特定环境下其性能有可能反而下降,因此在生产环境中使用各种虚拟化方式前需要经过完整测试

 

其它参考资料:

<think>嗯,用户问的是SR-IOVIOMMU的区别,这两个技术都虚拟化有关,但具体有什么不同呢?首先得回忆一下这两个术语的定义作用。SR-IOV好像是关于硬件虚拟化的,允许一个物理设备分成多个虚拟设备,对吧?而IOMMU可能与内存管理有关,处理DMA地址转换之类的。 接下来需要确认两者的基本概念。SR-IOV全称是Single Root I/O Virtualization,属于PCI-SIG的标准,主要让单个物理PCIe设备能创建多个虚拟功能(VF),每个VF可以被不同的虚拟机直接使用,这样能提高性能减少延迟,因为绕过了hypervisor的管理。而IOMMU,输入输出内存管理单元,是硬件功能,负责将设备的DMA请求转换为物理地址,同时提供隔离,防止设备访问不该访问的内存区域。 然后需要比较它们的应用场景解决的问题。SR-IOV主要是解决I/O设备的虚拟化问题,提升性能,适用于需要高效网络或存储虚拟化的环境,比如云计算。IOMMU则是解决设备直接内存访问的安全性问题,确保设备只能访问被分配的内存,增强系统安全性稳定性。 可能用户混淆它们是因为两者都涉及虚拟化中的设备管理,但侧重点不同。SR-IOV侧重于硬件资源的虚拟化分割,而IOMMU侧重于内存访问的控制隔离。需要举例子说明,比如在使用SR-IOV时,每个VF可以被不同的VM直接使用,但如果没有IOMMU,这些VF可能无法安全地进行DMA操作,导致内存访问冲突或安全问题。 另外,技术实现层面,SR-IOV需要硬件设备支持(比如特定的网卡或GPU),而IOMMU是CPU或芯片组的功能,需要操作系统硬件的协同支持。比如Intel的VT-dAMD的AMD-Vi都是IOMMU的实现。 可能需要提到两者的互补性,SR-IOV提供虚拟化能力,IOMMU提供安全隔离,实际应用中通常会一起使用,以确保高效且安全的I/O操作。 还要注意回答的结构,先分别介绍,再对比区别,最后总结应用场景关联。确保用户理解它们不是替代关系,而是协作关系。需要检查是否有技术细节错误,比如SR-IOV的VF类型(PFVF的区别),IOMMU的具体功能如地址转换访问权限控制。</think>### SR-IOV 与 IOMMU 的区别 #### 1. **基本定义** - **SR-IOV(Single Root I/O Virtualization)** 一种硬件虚拟化技术,允许单个物理设备(如网卡、GPU)通过 PCIe 接口分割成多个 **虚拟功能(Virtual Functions, VF)**,每个 VF 可直接分配给不同虚拟机(VM),绕过 Hypervisor 的软件层,提升 I/O 性能。 - **IOMMU(Input-Output Memory Management Unit)** 一种硬件单元(集成在 CPU 或芯片组中),负责管理设备对内存的直接访问(DMA),将设备发起的物理地址转换为虚拟机或进程的实际物理地址,并提供 **内存隔离** **访问权限控制**,防止设备越权访问内存。 --- #### 2. **核心功能对比** | **特性** | **SR-IOV** | **IOMMU** | |-------------------|-------------------------------------|-------------------------------------| | **目标** | 提升 I/O 虚拟化性能 | 保障设备 DMA 安全性 | | **实现方式** | 物理设备硬件支持(需 PCIe 设备支持) | CPU/芯片组硬件支持(如 Intel VT-d) | | **主要作用** | 将物理设备虚拟化为多个独立 VF | 转换设备 DMA 地址,隔离内存访问 | | **依赖关系** | 需要 Hypervisor 驱动支持 | 需要操作系统硬件协同支持 | --- #### 3. **解决的问题** - **SR-IOV** - **性能瓶颈**:传统虚拟化中,Hypervisor 需模拟设备 I/O,导致延迟高、吞吐量低。 - **资源争用**:通过硬件级虚拟化,让 VM 直接访问物理设备资源,减少软件层开销。 - **IOMMU** - **安全性风险**:设备 DMA 可能错误或恶意访问其他 VM 或系统内存。 - **地址映射**:解决虚拟机或进程的物理地址与设备可见地址不一致的问题(例如 Passthrough 场景)。 --- #### 4. **典型应用场景** - **SR-IOV** - 云计算中高性能网络(如 25G/100G 网卡)或 GPU 虚拟化。 - 要求低延迟、高吞吐的虚拟机(如 NFV、AI 推理)。 - **IOMMU** - 设备直通(Passthrough)时隔离 VM 内存。 - 防止恶意设备通过 DMA 攻击系统内存(如 “DMA 攻击” 防御)。 --- #### 5. **关联与协作** - **互补关系**: SR-IOV 提供高性能虚拟化能力,而 IOMMU 确保设备访问内存的安全性。 例如,将 SR-IOV 虚拟出的 VF 直通给 VM 时,需 IOMMU 隔离该 VM 的内存,防止其他 VF 或设备篡改。 - **协同案例**: 在 KVM 虚拟化中,启用 SR-IOV 网卡并配置 Intel VT-d(IOMMU),VM 可直接使用 VF 且内存访问受严格保护。 --- ### 总结 - **SR-IOV** 是 **硬件资源虚拟化** 技术,优化性能; - **IOMMU** 是 **内存访问控制** 技术,保障安全。 两者在虚拟化场景中通常 **联合使用**,兼顾效率与安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值