PCIe Switch有很多种技术,我们在前文已经介绍过了,后面将一一细探这些技术的具体实现。今天首先来看的是SR-IOV。
虚拟化
现在的云计算技术火的一塌糊涂,其实云计算最重要的业务就是虚拟机,很多云计算公司就是建个机房,买很多机器,每个机器安装很多虚拟机,租给用户使用。所以虚拟机的性能很重要,性能高了,既可以提升用户满意度,又可以降低成本,其实就是一个物理机多放几台虚拟机。阿呆之前在实战NVMe一文中首篇就介绍了虚拟化技术,有一个就是IO虚拟化。SR-IOV的全称是Single Root IO Virtualization,顾名思义,就是其实只有一个物理主机,但是里面很多虚拟机的IO也能虚拟化,和物理主机分开。就是一个群租房,每个租户有自己的独立卫生间和厨房,互不干扰,效率高,又安全隐私。摘抄那篇文章中的几段:
“Intel的VT-x技术推出了两种操作模式:VMX root operation,VMX non-root operation。我们知道虚拟机包含两部分,虚拟层VMM(virtual machine monitor)和虚拟出来的系统,虚拟层其实就是我们物理系统里的一个应用,所以它跑在VMX root operation,和正常模式一样。而虚拟出来的系统跑在VMX non-root operation,是处在VMM控制之下的一个环境。这样虚拟机跑在自己的CPU轨道里,物理机也跑在自己的原来的CPU轨道里,相互隔离,性能也得到了提高。
这就像是孩子长大娶了老婆,和父母住在一起,生活已经是两家人了,可是共用厨房和厕所,首先经常上厕所得排队,憋得受不了,其次,小两口的隐私也得不到保护。老爹没办法,可怜天下父母心啊,又花钱盖了一套厕所和厨房,大家同在屋檐下,再也不冲突了,相安无事。
一家人和睦了一段时间之后,新的问题又出现了。小两口消费观念新潮,总是需要买各种东西,但是又没时间去,所以只能让爹妈每天去超市代买,垃圾也让二老去倒。老人嫌累,小两口嫌他们少买了这个那个。老父亲好好想了想,找出症结了:尽管我们空间分开了,但是生活的原材料还没分开。后来,小两口不从超市购物了,他俩的东西全都选择网购,更自由,更方便,垃圾让快递小哥顺手帮忙带走,什么都搞定了。这就是I/O虚拟化啊:两家人的消费和废物处理隔离。
我们都知道,影响电脑性能的主要是CPU和内存,玩游戏还要显卡,下电影要网速和硬盘快。虚拟机也有这些问题,CPU虚拟化提升了处理能力,但是数据操作也需要高性能啊,关键在于解决I/O设备与虚拟机数据交换的问题,而这部分主要相关的是DMA直接内存存取,以及IRQ中断请求,只要解决好这两个方面的隔离、保护以及性能问题,就是成功的I/O虚拟化。
慈祥的老父亲Intel开发了VT-d技术,在北桥(现在改叫MCH,因为南桥退休了)提供DMA虚拟化和IRQ虚拟化。传统的IOMMU(memory management unit,内存管理单元)集中管理所有DMA,不容易实现DMA隔离,而VT-d实现了多个DMA保护区域的存在,实现DMA虚拟化。
传统设备中断请求有两种方式:一是通过I/O中断控制器路由,另一种是DMA写请求直接发出去的MSI(message signaled interrupt,消息中断)。由于使用了DMA,需要访问所有内存地址,没办法实现中断隔离,其实就是虚拟机的没办法区分。VT-d的中断重映射架构重新定义了MSI的格式,尽管MSI依然是DMA写请求,但是不嵌入内存地址,而是消息ID,通过消息ID区分不同的虚拟机区域。”
SR-IOV介绍
SR-IOV有两个重要组件:Virtual Function VF和Physical Function PF。每个PF有标准的PCIe功能,能关联到多个VF。而每个VF都有与性能相关的资源,共享一个物理设备。所以就是PF具有完整的PCIe功能,VF能独立使用关键功能。
每个VF有一个RID,这个RID很有用,相当于身份证。确定了唯一的PCIe交换源,也能索引IOMMU页表,我们上面讲过了,这个可以实现多个DMA区域相互隔离,实现DMA虚拟化。但是VF没有设备初始化和配置资源,功能比较简单,这样一个多功能PCIe设备芯片里面可以放很多个VF,扩展性更好。
SR-IOV怎么实现
如下图,VF驱动运行在客户虚拟机上,PF驱动在宿主物理机上,对VF进行管理。宿主机还有IOVM,用来表示所有VF的配置空间,同时管理PCIe拓扑的控制点。
具体功能如下:
- PF驱动:可以直接访问PF所有资源,同时管理所有VF并进行配置。它可以设置VF数量,进行全局启动或停止。负责配置2层分发,如图中Layer2 Switching,其实就是多路选择器,对从VF或者PF进来的数据进行路由。
- VF驱动:在客户机上,完成数据转移,比如DMA等操作不需要宿主机VMM参与,直接与PCIe VF设备交互。
- IOVM:为每个VF分配了完整的虚拟配置空间,客户机可以像普通设备一样配置VF。一般我们的主机发现所有PCIe设备是通过枚举实现的,但是,初始化SR-IOV不能简单的扫描PCIe Vendor ID和Device ID列举出所有VF,因为VF没有完整的PCIe配置空间。可以用Linux PCI热插拔API动态为宿主机增加VF,然后分配给客户机。IOVM为每个VF分配虚拟的完整配置空间,所以当VF分配给客户机以后,客户机就能像普通PCIe一样初始化和配置VF。
SR-IOV IO虚拟化大法
SR-IOV之所以能够提升虚拟机性能,就是因为实现了IO虚拟化。虚拟机模拟软件VMM不再干预客户机的IO,IOMMU把客户机地址重映射为宿主机物理地址,这样能直接通过DMA在宿主机和VF设备之间进行高速数据搬移,并产生中断。当中断产生的时候,VMM根据中断向量识别出客户机,并将虚拟MSI中断通知给客户机。
那PF和VF之间又是怎么通信的?比如VF把客户机IO请求发给PF,PF也会把一些全局设备重置等事件发给VF。有的设备采用的是Doorbell机制,发送方把消息放入信箱,按一下门铃,产生中断通知接收方,接收方读到消息在共享寄存器做个标记,表示信息接收了。
SR-IOV优点
-
提升性能。
- 在数据传输方面,虚拟机和物理机差不多了,直接和设备交互。
- 直接进行IO寄存器读写,不需要模拟了。
- 中断重映射。中断延迟是虚拟机性能的大敌,SR-IOV中VMM把中断交给虚拟机处理,而不是VMM处理IO。
- 资源共享。所有VF都能共享一个PCIe设备,而不是独占。
-
管理简单。
- VF替换物理设备,数量减少。
- 在底层对VF进行隔离,更加安全。
- 扩展性高。可以在一个性能很高的设备上跑多个VF,相比多个性能不高的PCIe设备,节省了PCIe插槽。
-
简化虚拟机设计。
- 通用性。虚拟机不需要全断驱动,VMM不需要后端驱动。
- 宿主机负担轻。通过SR-IOV,虚拟机直接和PCIe设备数据交互,这样宿主机负担轻了,能支持更多虚拟机。
引用
阿呆实战NVMe 1 http://www.ssdfans.com/?p=3201
基于SR-IOV的IO虚拟化技术 http://wenku.baidu.com/view/bba90b5c312b3169a451a487.html