标题:
Linux 虚拟化和 PCI 透传技术(2)
[打印本页]
作者:
look_w
时间:
2018-6-13 14:28
标题:
Linux 虚拟化和 PCI 透传技术(2)
设备透传技术正如上面介绍的两个设备模型所示,设备共享是有代价的。无论设别模拟是在管理程序还是在一个独立 VM 中的用户空间中执行,都存在开销。只要有多个客户操作系统需要共享这些设备,这个开销就是值得的。如果共享不是必须的,则有更有效的方法来共享这些设备。
因此,在最高层面上,设备透传就是向一个特定客户操作系统提供一种设备隔离,以便该设备能够被那个客户操作系统独占使用(见图 3)。但这种技术为什么有用?设备透传之所以有价值,原因有很多,其中两个最重要的原因是性能以及提供本质上不能共享的设备的专用权。
图 3. 管理程序内的设备透传
对于性能而言,使用设备透传可以获得近乎本机的性能。对于某些网络应用程序(或那些拥有高磁盘 I/O 的应用程序)来说,这种技术简直是完美的。这些网络应用程序没有采用虚拟化,原因是穿过管理程序(达到管理程序中的驱动程序或从管理程序到用户空间模拟)会导致竞争和性能降低。但是,当这些设备不能被共享时,也可以将它们分配到特定的客户机中。例如,如果一个系统包含多个视频适配器,则那些适配器可以被传递到特定的客户域中。
最后,可能有一些只有一个客户域使用的专用 PCE 设备,或者有一些不受管理程序支持因而应该被传递到客户机的设备。单独的 USB 端口可以与一个给定域隔离,一个串口(自身不是可共享的)可以与一个特定客户机隔离。
设备模拟背后的秘密早期的设备模拟类型在管理程序中实现影子(shadow)形式的设备接口,以便为客户操作系统提供一个到硬件的虚拟接口。这个虚拟接口包含预期的接口,包括表示设备(如 shadow PCI)的虚拟地址空间和虚拟中断。但是,由于有一个设备驱动程序与虚拟接口通信,且有一个管理程序为实际硬件转换这种通信,因此开销非常大 — 特别是在诸如网络适配器之类的高带宽设备中。
Xen 使 PV 方法(上一小节介绍过)得以流行,PV 方法通过使客户操作系统驱动程序意识到它正在被虚拟化来减少性能降低幅度。在本例中,客户操作系统将不会看到一个设备(比如网络适配器)的 PCI 空间,而是一个提供高级抽象(比如包接口)的网络适配器应用程序编程接口(API)。这种方法的缺点是客户操作系统必须针对 PV 进行修改,优点是在某些情况下您可以得到近乎本机的性能。
在设备透传技术早期发展过程中,开发人员使用一个瘦模拟模型,在该模型中,管理程序提供基于软件的内存管理(将客户操作系统地址空间转换为可信主机地址空间)。尽管开发人员在早期提供了隔离一个设备和一个客户操作系统的方法,但那种方法缺乏大型虚拟化环境需要的性能和伸缩性。幸运的是,处理器供应商已经为下一代处理器装备了一些指令,以支持管理程序和用于设备透传的逻辑,包括终端虚拟化和直接内存访问(DMA)支持。因此,新的处理器提供 DMA 地址转换和权限检查以实现有效的设备透传,而不是捕获并模拟对管理程序下的物理设备的访问。
设备透传的硬件支持Intel 和 AMD 都在它们的新一代处理器架构中提供对设备透传的支持(以及辅助管理程序的新指令)。Intel 将这种支持称为
Virtualization Technology for Directed I/O
(VT-d),而 AMD 称之为
I/O Memory Management Unit
(IOMMU)。不管是哪种情况,新的 CPU 都提供将 PCI 物理地址映射到客户虚拟系统的方法。当这种映射发生时,硬件将负责访问(和保护),客户操作系统在使用该设备时,就仿佛它不是一个虚拟系统一样。除了将客户机映射到物理内存外,新的架构还提供隔离机制,以便预先阻止其他客户机(或管理程序)访问该内存。Intel 和 AMD CPU 提供更多虚拟化功能,您可以在 部分了解更多信息。
另一种帮助将中断缩放为大量 VM 的技术革新称为
Message Signaled Interrupts
(MSI)。MSI 将中断转换为更容易虚拟化的消息(缩放为数千个独立中断),而不是依赖将被关联到一个客户机的物理中断 pin。从 PCI 2.2 开始,MSI 就已经可用,但 PCI Express (PCIe) 也提供 MSI,在 PCIe 中,MSI 支持将结构缩放为多个设备。MSI 是理想的 I/O 虚拟化技术,因为它支持多个中断源的隔离(而不是必须通过软件多路传输或路由的物理 pin)。
设备透传的管理程序支持使用最新的支持虚拟化的处理器架构,有多个管理程序和虚拟化解决方案支持设备透传。您将在 Xen 和 KVM 以及其他管理程序中发现设备透传支持(使用 VT-d 或 IOMMU)。在多数情况下,客户操作系统(域为 0)必须被编译为支持透传,这通常作为一个内核构建时选项提供。也许还需要对主机 VM 隐藏设备(Xen 中使用 pciback 实现)。PCI 中有一些限制(例如,一个 PCIe-to-PCI 桥接器后面的 PCI 设备必须被分配到相同的域),但 PCIe 没有这种限制。
另外,您将在 libvirt(以及 virsh)中发现设备透传的配置支持,这为底层管理程序使用的配置模式提供一个抽象。
设备透传问题设备透传带来的一个问题体现在实时迁移方面。
实时迁移
是指一个 VM 在迁移到一个新的物理主机期间暂停迁移,然后又继续迁移,该 VM 在这个时间点上重新启动。实时迁移是在一个物理主机网络上支持负载平衡的一个很好的特性,但使用透传设备时它会产生问题。PCI 热插拔(有几个关于它的规范)就是需要解决的一个问题。PCI 热插拔允许 PCI 设备从一个给定内核进出,这很理想 — 特别是将 VM 迁移到新主机上的管理程序时(设备需要在这个新管理程序中拔出然后再插入)。当设备被模拟(比如虚拟网络适配器)时,模拟提供一个抽象层以抽象物理硬件。这样,一个虚拟网络适配器可以在该 VM 内轻松迁移(这个 VM 还得到 Linux® 绑定驱动程序的支持,该驱动程序支持将多个逻辑网络适配器绑定到相同的接口上)。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0