IO虚拟化性能优化及应用

 

虚拟化技术实现了对于系统资源的合理分配和方便维护,在今天发挥的作用日益突出。在虚拟化的应用中,有一大类应用对于IO的性能有着极高的要求,并推动了IO虚拟化上对于性能优化的发展。本文简单分析了这样一类技术和它在当代虚拟化技术中的应用前景。...



晶格思维(crystalwit),从行业视角介绍IT领域特别是存储领域的新技术、新趋势,强调刨根问底和联想类比。本文为原创内容,如果需要转载,请标明原始出处。

为了增加互动,在晶格思维公众号的主页上增加了投票按钮,方便大家根据兴趣点来投票决定后续的话题。我将会根据大家的投票结果来及时调整后续的话题。借助MSD Partners和Silver Lake的资本运作,Dell以670亿美元收购EMC,成为了轰动一时的科技界最大的并购案。EMC在2015年度的GAAP财务收入为247亿美元,仅比上一年增加1%。对于它来说,目前虽然不用担心生计问题,但是来自企业云的压力正在成为EMC所面临的重要问题。对于众多IT企业来说,把更多的企业功能放到数据中心的云服务中,可以有效降低软件销售成本、系统扩充边际成本,提升管理的集成度。Amazon,Microsoft,Google等公司在企业云中的领先地位,将会成为EMC的有力竞争对手。而对于Dell来说,日益萎缩的PC市场和它位居第三的市场地位也促使它必须做出调整。

Dell对于EMC的收购,则是期望能够整合各自的资源,并达成一个战略互补的关系。借助EMC在存储方面的优势地位和EMC控股的公司VMWare的虚拟化业务,Dell可以达到与HP,Lenovo相匹配的产品组合,同时EMC也会给Dell带来新的市场。而对于EMC来说,虽然它清楚地意识到了传统存储架构和产品面临的挑战,并据此对其产品方向做出了相应的调整,但是慑于上市公司的业务压力和内部的关系,这些战略起到的效果有限。而这次并购则可以帮助EMC整合相关的资源并做出相应的业务调整。对于Dell来说,合并所要解决的问题并不是收获针对HP的竞争优势;而更重要的是如何与Amazon,Microsoft,Google等新型的云服务提供商之间的竞争。

与全球服务器市场的收入形成鲜明对比的是在云端的快速增加的市场。在下面展示的最近的Forbes提供的统计结果,基于公有云IaaS的硬件和软件的增长非常迅速。2016年全年的IaaS的规模为380亿美元,而SaaS和PaaS的部分规模达职位120亿美元。公有云硬件和附加的软件规模上的快速增长反映了众多公司对于下一代IT架构的偏好:通过使计算分布在大量的分布式计算机上,而非本地计算机或远程服务器中,企业数据中心的运行将与互联网更相似。这使得企业能够将资源切换到需要的应用上,根据需求访问计算机和存储系统。
 
低成本、可靠、方便维护、不需要采购硬件并降低了软件系统的成本,正是云服务的优势所在。而低成本的关键在于其核心的虚拟化技术。虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件。在实际的物理平台上,通过创建虚拟的服务器,并且赋予它相应的资源,从而达到对于真实的服务器的模拟。
在虚拟化系统中,通常用Host和Guest来分别代表用于虚拟化的硬件平台和虚拟化得到的虚拟机。虚拟化的应用技术重点在于如何让Host模拟出来若干个可以独立运行的Guest,同时保证各个Guest之间互不影响,以及有效利用Host提供的物理资源。由于现代的x86服务器核心包括CPU,Memory,Disk和NIC,因此虚拟化的重点在于这几个部分。在早期,虚拟化主要是通过软件的方法在Host上运行一个核心的资源管理系统(通常叫Hypervisor),并通过软件模拟的方式来实现各个硬件单元的隔离。这样导致的问题是虚拟化的性能低下。而对于云服务来说,如果希望云服务真正能够替代传统的硬件服务,必须让Guest运行足够快。

在x86上,Intel和AMD各自给出了自己的方案。对于Intel,VT-x和APICv技术实现了对于CPU虚拟化的有效支持,EPT实现了对于Memory映射的虚拟化,而VT-d技术则主要用于对包括Disk/NIC在内的IO设备进行虚拟化。对于CPU、Memory的虚拟化主要由Intel的CPU逻辑实现硬件加速,上层的Hypervisor软件通过配置和使用这些CPU提供的能力来实现硬件加速;而对于Disk/NIC来说,仅仅在CPU端使能虚拟化硬件加速是不够的。这是因为对于IO事务来说,需要CPU和外设的配合才能完成特定的动作,在虚拟化的环境中,为了最大限度减小虚拟化的损耗,需要让每一个Guest都能直接与硬件打交道,这就需要硬件把自己分身成若干个虚拟的硬件,每个虚拟的硬件都可以绑定一个Guest并与其直接进行通信和数据传输。因此为了支持IO的虚拟化,不仅仅需要VT-d这样的主机端硬件加速,也需要在主板和设备端提供支持。在这个层面就诞生了SRIOV技术。

Single Root I/O Virtualization简称SRIOV,是由PCI-SIG组织定义的协议,适用于PCIe设备上的虚拟化,提供了对于IO虚拟化所需要的硬件加速支持。由于现在PCIe接口已经成为CPU内部标准IO总线接口,通用的外设例如NIC和硬盘都可以基于PCIe接口来实现,因此Intel VT-d加上SRIOV可以有效构成对于IO设备的虚拟化加速。可以说,在100GE以太网和高速NVMe SSD逐渐走向普及的今天,对于IO设备的虚拟化可以有效克服虚机的IO瓶颈,给云服务平台提供强力的IO支持。目前VMWare的ESX,Microsoft的Hyper-V,Xen,KVM都已经支持利用SRIOV来加速虚拟机的IO性能,Oracle的VirtualBox也正在计划支持中。

为了说明SRIOV技术如何帮助虚拟化软件来提升性能,我们需要先简单了解当前的基于x86平台的PCIe设备是如何工作的。PCIe协议是在PCI协议的基础上发展出来的。由于抨弃了PCI总线的并行总线结构而转用高速串行总线作为物理层协议,因此它的带宽可以达到非常高,最新的PCIe Gen3.0x8的有效负载容量可以达到7GB/s。在传输层则采用了包交换的结构,称为TLP。为了支持扩充,PCIe实现了树状结构的拓扑结构并可采用PCIe Switch来扩充端口。
由于采用了与PCI兼容的配置过程,PCIe设备可以很容易实现即插即用的功能。在服务器上电的时候,根据PCIe设备在PCIe拓扑结构中的位置,BIOS找到相关的设备并通过对其配置空间中寄存器进行配置,来检测设备所提供的BAR空间、中断方式、支持的操作方式等关键信息。BIOS完成配置和启动过程后,将设备的信息通过ACPI提供给操作系统。操作系统在获得这些信息后,会根据设备的标称的功能来调用相关的功能驱动程序完成对设备的使能过程。如果PCIe设备是在x86运行状态时插入的,那么对应的设备所在的RC会产生中断给驱动程序中负责热插拔的模块,该模块会完成相关的检测过程并通知相关的功能驱动程序完成对设备的使能过程。

除了配置空间,每个PCIe的Function可以提供最多6个空间(BAR)。这些空间或者是IO空间,或者是内存空间,提供了主机驱动程序和设备进行交流的通道。在老式的系统中,为了区分对于内存的操作和IO的操作,操作设备一般是通过CPU执行IO相关的指令来完成对于设备的控制。但是基于内存映射的设备操作具有更大的灵活性,因此广泛应用在较新的设备中并逐渐成为标准。

采用内存映射的IO空间,可以像内存一样操作设备地址空间,同时借助CPU提供的内存系统保护机制来保护内核对于设备空间的操作的安全性。例如,在Linux的设备驱动模型中,PCIe提供的BAR空间中的地址要先通过ioremap将总线地址关联到x86内部的虚拟地址空间。在将I/O内存资源的物理地址映射成核心虚地址后,理论上讲我们就可以象读写RAM那样直接读写I/O内存资源了。为了保证驱动程序的跨平台的可移植性,我们应该使用Linux中特定的函数来访问I/O内存资源,而不应该通过指向核心虚地址的指针来访问。在内部ioremap会检查总线地址的合法性,并指示MMU构建页表和页表权限,并给出对应的虚拟地址供驱动程序使用。

值得注意的是,虽然通过了内存映射的空间可以像正常的内存操作一样使用该空间,但是操作的效果与内存操作是完全不同的,体现在这样几个方面:

1、对这些内存的读写操作并不需要一定满足内存读写的行为,并且可以含有副作用。这些副作用可以看成驱动程序发送命令给设备。而正是基于这些副作用,驱动程序实现了对于设备的控制过程。正是基于这个原因,通常的对于这些位置的内存映射采用了关闭Cache的方式,避免因为CPU的Cache机制打乱命令的顺序或延迟命令发送的时机。

2、由于对设备的操作最终需要反映到设备端,对于PCIe设备来说需要把操作真正传输到设备端,因此需要的延迟较大,并且这些操作需要阻塞CPU流水线的执行直到操作完成。为了避免大量操作导致的CPU负担,通常CPU仅把最关键的内容告诉设备,然后设备依据这些信息自己主动去通过DMA等手段操作数据。

由于上述的特点,为了提高设备的性能,在高速的IO设备上(例如100GE以太网卡),主机和设备之间传输数据是通过DMA由设备端直接发出PCIe请求读写主机内存空间的数据,而主机则通过预定义好的设备描述符告诉设备如何去获得这些数据以及获得数据后应当如何处理;并且,甚至连设备描述符都是由设备主动通过DMA获得的,主机仅操作设备端的寄存器告诉它新到了一个数据描述符。

基于上面的理解,我们可以大致得出一个基本的设备是如何与主机CPU进行通讯完成数据和信息的交互,以下面的NIC设备发送一个Ethernet的包的例子简单介绍一下。
1、在主机准备好数据帧的内存后,OS在本地内存中构建一个关于数据帧的描述符。

2、在主机和NIC之间维护了一个邮箱机制,这可以通过一组预定义的寄存器来实现。主机OS写这个位于NIC的寄存器,以此通知NIC上一步的数据帧描述符已经准备好了。

3、NIC发起一个DMA从主机内存上取出该数据帧的描述符。对这个描述符进行分析。

4、根据上一步分析的结果,NIC决定发起一个DMA操作并将数据帧都入到设备端。

5、NIC把数据帧通过下面的传输层发出去。

6、在主机和NIC之间维护了一个通知机制,通常可以用中断的方式来实现。NIC完成传输后,可以发中断给主机,主机据此可以知道之前的数据帧已经完成了传输。

在实际的系统中,为了提升IO的性能,很多时候IO的处理过程是并行来进行的。同一时刻,不同的IO可以处于上面1~6步中的某一步。与此同时,在Numa架构中,CPU中的不同Core在同一时刻也可以来处理不同的IO,从而提高CPU处理IO的性能,降低延迟。由于这种特性,需要从硬件设备上与CPU的不同Core之间都有独立的接口,避免因为不同的Core需要访问同一组硬件资源造成的等待排队问题。
在上面的例子中,主机的CPU在步骤1、6两步需要与硬件设备进行通信,在2~5步中涉及到的是设备端的动作,因此硬件独立接口主要需要考虑邮箱机制和通知机制的并行化。由于邮箱机制可以通过寄存器来实现,而一个内存映射空间的大小可以由设备指定,因此,设备可以定义多个寄存器组,每组寄存器与一个Core关联。在设备端,由硬件将这些寄存器组对应的内容进行排队后交给后端处理。而对于通过中断来实现的通知机制来说,PCIe协议规定了消息类型的中断MSI和MSIX。它们分别定义了最多32个和2048个中断向量。如果把每个中断绑定一个Core,那么就可以实现通知机制的并行化。

上面简单分析了基于PCIe协议设备如何与主机进行交互。下面进一步来分析对于基于PCIe协议的设备如何实现虚拟化以及如何利用SRIOV和VT-d来加速虚拟化。目前适用于企业应用和云服务的虚拟化软件很多,众多的虚拟化软件在处理IO的虚拟化时采用的方法不尽相同。不过,它们都需要解决单个设备如何在虚机上共享的问题。即如何实现物理设备对于VM的隔离,实现Host对于资源的有效管理和避免有缺陷的VM对于整个系统造成影响。为了满足这个目的,在通常的设计中,虚拟机不能直接访问设备,只能通过发送IO请求到Host,然后由Host进行分析,如果这个请求是合理的,就再把请求通过位于Host上的驱动程序发给真实的设备。设备完成请求后,也是Host首先得到通知,然后再通过Host到Guest的通知机制把这个结果转发给Guest。依赖于Host软件的中转,可以较好地实现VM的隔离,也便于让一个设备在众多的VM之间得到公平分享。

下面的示意图描述了这一过程在VMWare上的实现。在Host的Hypervisor层面有一个虚拟化的设备层,这一层对Guest提供服务,表现为一个虚拟的设备。Hypervisor层面则实现对于真实的设备的控制。来自于Guest的请求需要通过Hypervisor来进行中转适配。由于中转适配是一个软件层面的操作,因此需要消耗一定的Hypervisor中CPU的计算能力。由于来自不同的Guest的IO请求会汇聚到Hypervisor,因此在Host的Hypervisor由于中转适配导致的计算量会很大,这将会影响到Guest处理IO的能力。同时基于软件的中转过程会导致IO请求在Host端重新进行排队和调度,因此引入的延迟会累加到Guest端看到的延迟,影响VM的服务质量。
为了应对上述性能的问题,设备透传技术应运而生。设备透传就是通过把设备通过映射直接暴漏给一个特定VM,以便该设备能够被那个客户操作系统独占使用。由于VM可以直接看到所有的硬件资源,因此VM可以直接向设备发送IO请求,并直接获得设备的响应。对于性能而言,使用设备透传可以获得近乎本机的性能。对于某些网络应用程序或那些拥有高磁盘 I/O 的应用程序来说,这种技术简直是完美的。当然,为了保护设备透传,需要确保映射的硬件资源只能被目标VM使用,其他VM和Host不应该操作这个设备。

Intel 和 AMD 都在它们的新一代处理器架构中提供对设备透传的支持(以及辅助管理程序的新指令)。Intel 将这种支持称为 Virtualization Technology forDirected I/O (VT-d),而 AMD 称之为 I/OMemory Management Unit (IOMMU)。当这种映射发生时,硬件将负责访问和保护,客户操作系统在使用该设备时,就仿佛它不是一个虚拟系统一样。除了将客户机映射到物理内存外,新的架构还提供隔离机制,以便预先阻止其他客户机或管理程序访问该内存。
基于Intel的VT-d技术,虚拟化软件可以很方便地实现IO设备在VM上的分配和映射。VM上运行的Guest OS可以通过Guest上的驱动程序访问到内存映射空间,并对其进行操作。该操作通过位于Host上的EPT服务转化成总线地址并发给真实设备。随后,设备主动获取位于Guest的内存空间上的IO描述符和对应的IO数据值。需要注意的是,由于设备收到的IO描述符描述的地址是基于Guest看到的总线地址来表示的,因此这一地址无法直接用于获取数据。VT-d所支持的地址翻译服务可以为DMA提供地址翻译,将Guest看到的总线地址翻译成Host看到的真实的总线地址。VT-d也可以提供对于消息型终端的重新映射,将MSI和MSIX定向到VM端的驱动程序。最后VT-d也可以提供对于设备和VM的保护。如果设备通过VT-d只映射给了VM A和VM B,那么如果设备发生了错误并且试图访问VMC的内存空间,将会产生一个硬件错误并被Host捕获到。
至此,我们看到了通过设备透传和虚拟化硬件加速来提升IO的性能的努力方向。但是仅仅支持设备透传和硬件虚拟化距离云服务的需求还是有差距的。设备透传解决了因为Host上的Hypervisor软件中转适配造成的性能问题,极大改善了IO的性能和服务质量。但是,如果把设备同时透传给多个VM,由于不同VM之间并没有协作,并且Host上的Hypervisor管理软件无法操作设备,因此,设备不能同时服务多个VM。可见,由于设备只提供了一套供上层驱动程序软件来管理的接口方法,只能同时服务一个VM,这正是这个方法所导致的问题的症结。因此,一个直觉的想法是让设备同时提供若干套供上层驱动程序软件来管理的接口方法,每套方法通过透传技术关联到一个VM。这正是SRIOV技术的雏形,可以说,SRIOV实现的是一个简化版的设备端实现多个虚拟设备的方案。这种虚拟化技术在单根中提供设备虚拟化。通过 SRIOV,一个 PCIe 设备可以导出共享该 I/O 设备上的资源的一组虚拟功能。

实现了SRIOV硬件虚拟化的设备,可以支持一个物理功能和多个虚拟功能。物理功能(PF)可以提供管理接口,用于创建、删除和配置虚拟的功能。通常,运行在Host端的驱动程序控制这个物理功能。虚拟机的管理员可以通过Hypervisor管理界面来配置虚拟功能的数量,以及它们与不同的VM的对应关系。而每一个虚拟功能(VF)则是一个简化版的设备接口。它提供了该设备的一个“分身”,可以通过该接口给这个设备发送请求并接收对应的应答。当然,虚拟功能相比于物理功能来说,为了降低硬件实现的复杂度,在性能相关性不大的配置空间做了简化,所有的虚拟功能配置空间都是基于物理功能来实现的,并且在Host的配合下完成虚拟化。

下面的图介绍了基于SRIOV的设备实现虚拟化的过程。设备曝露出1个物理功能和多个虚拟功能。其中位于Host上的Hypervisor层驱动程序通过物理驱动程序管理该设备,可以创建多个虚拟功能。Hypervisor再通过VT-d等透传技术将每个虚拟功能分配到一个VM。VM上的Guest再通过位于VM上的驱动程序去直接操作虚拟功能。为了方便Hypervisor监控和管理每个VM使用该设备的情况,Hypervisor可以通过物理功能来读取设备的某个“分身”看到的IO使用情况,并通过物理功能来让设备进行多个VM对于该设备的公平共享。
由于虚拟功能的配置空间并不是一个合法的配置空间,因此,对于Guest来说,它上面的驱动程序是不能直接操作该地址的,这在某些需要支持全虚拟化的场合(例如VMWare ESX)是不能接受的,因为它们不允许修改VM上的Guest操作系统。对此,解决的方法一般是针对配置空间仍然使用位于Host上的Hypervisor层进行翻译。由于配置空间操作主要针对配置过程,并不涉及到IO操作,因此配置空间不采用虚拟化方法来处理不会对性能造成影响。

虚拟化技术是云服务的基础技术。而IO虚拟化技术直到最近几年才得到广泛的理解和关注。特别是在一些分布式服务中,由于数据、计算资源分布在不同的节点,为了完成一个复杂的操作,需要多个节点之间进行复杂地交互和数据传输,这就对IO的性能和反应时间提出了极高的要求。Intel的VT-d(AMD的IOMMU)和SRIOV等技术提供了对于IO虚拟化加速的硬件支持。借助了这些技术,可以实现VM上软件无损耗的IO交互过程,极大提高了虚拟化的效率和服务质量。

从一个更宏观的层面去理解,虚拟化的硬件加速技术反映了在日益增长的IO服务需求和来自高速的介质(例如高速互联和高速存储)双重压力下,服务器体系结构更新的必然选择。这种底层技术的创新需要来自多方面的生态系统建设,也会给我们带来很多新颖的应用方式,这需要来自硬件、系统、应用等多方面的努力。

[1] http://tech.163.com/15/1013/08/B5PV8G02000948V8.html

[2] http://www.emc.com/about/news/press/2016/20160127-earnings.htm

[3] http://www.businessinsider.com/this-is-why-dell-is-paying-67-billion-for-emc-and-how-it-could-backfire-2015-10

[4] http://www.forbes.com/sites/louiscolumbus/2016/03/13/roundup-of-cloud-computing-forecasts-and-market-estimates-2016/#79ab00374b07

[5]http://searchdatacenter.techtarget.com/feature/Can-traditional-server-vendors-survive-the-cloud-push

[6] https://members.pcisig.com/wg/PCI-SIG/document/download/8257

[7] https://pcisig.com/specifications/iov/

[8] http://blog.csdn.net/do2jiang/article/details/5450839

[9] ftp://ftp.os3.nl/people/nsijm/INR/Week%201/papers/32_virtio_Russel.pdf

[10] http://www.ece.rice.edu/~willmann/teng_nics_hownicswork.html

[11] https://www.ibm.com/developerworks/cn/linux/l-pci-passthrough/

[12] https://software.intel.com/en-us/articles/intel-virtualization-technology-for-directed-io-vt-d-enhancing-intel-platforms-for-efficient-virtualization-of-io-devices


    关注 晶格思维


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册