一种使用多队列技术的虚拟机网络性能优化的实现方法

文档序号:6362582阅读:203来源:国知局
专利名称:一种使用多队列技术的虚拟机网络性能优化的实现方法
技术领域
本发明采用基于Virtio的多队列虚拟化技术,涉及计算机虚拟化技术中的IO虚拟化。尤其涉及一种使用多队列技术的虚拟机网络性能优化的实现方法,它是一种虚拟化网络中采用多队列方法实现虚拟机和宿主机之间交互的实现方法,属于计算机技术领域。
背景技术
早在上个世纪60年代末70年代初IBM公司就在大型机上实现了商用的虚拟机,诸多文献描述了 IBM在OS 360使用的虚拟机的实现以及经典的虚拟机体系结构并描述了利用虚拟机监控器实现虚拟化的方法。研究人员总结了第三代计算机可虚拟性 (Virtualizability):指出可虚拟性主要依赖于计算机指令集中敏感指令集的存在方式。 同时总结了可虚拟性的两个重要定理定理一对于任何通常意义上的第三代计算机,如果该计算机敏感指令集是特权指令集的子集,就可以在此计算机上创建一个虚拟机监控器。定理二 对于任何通常意义上的第三代计算机,如果该计算机的用户敏感指令集是特权指令集的子集,就可以在此计算机上创建一个混合式(hybrid)的虚拟机监控器。由于大多数计算机并不满足定理一的要求,所以一些文献放松了要求只要符合定理二的要求就可以利用陷入-模拟的方式(trap-and-emulate)完成虚拟化。可虚拟化的关键是对敏感的非特权指令的处理。对这种指令的不同处理方式引发了下面几种不同的虚拟化方式。I)基于二进制翻译的全虚拟化(Full Virtualization with Binary Translation)。这种方式动态的扫描二进制代码,将敏感指令替换为跳转到相应模拟例程。 通过这种方式避免敏感指令的产生。VMware公司已经可以提供基于这种方式的商业化解决方案。这是目前唯一的在IA32/Intel 64体系结构下不需要特殊硬件辅助实现全虚拟化的方式。但这种方案也存在明显的缺陷由于要动态的监控并即时翻译二进制码,性能上会有所损失。2)硬件辅助的虚拟化(Hardware Assisted Virtualization)。这种方式通过扩展指令集,通过硬件完成传统虚拟机监控器(Virtual Machine Monitor, VMM)所需要的陷入以及状态切换。通过这种方式可以极大地简化虚拟机的设计。但是由于硬件在状态切换的时候会保存整个处理器的状态并切换地址空间,由此带来的开销不可忽略,特别是在虚拟机与虚拟机监控器频繁切换的情况下。本发明专利采用的就是这种方式实现VMM。3)准虚拟化(Para-virtualization)。这种方式通过静态的改写客户操作系统源代码,通过客户操作系统与虚拟机监控器显示协作的方式完成虚拟化策略。开放源代码的虚拟机监控器Xen就是基于这种技术。这种技术通过VM对VMM的感知,避免了传统陷入-模拟方式效率较低的问题,但需要对客户操作系统源代码进行修改。10设备虚拟化在虚拟环境里,1/0面临的问题是现实中外设资源是有限的,为了满足多个客户机操作系统对外设访问的需求,VMM必须通过I/O虚拟化的方式复用有限的外设资源。现代计算机环境中,I/O设备种类丰富,不同厂商生产的具有不同编程接口的I/O设备使I/O 虚拟化的难度相当大。根据不同I/O设备的特点和用途,虚拟化系统中的I/O设备可以分为5类 专用设备(Dedicated Devices) 可分割设备(Partitioned Devices) 共享设备(Shared Devices) 伪脱机设备(Spooled Devices) 物理不存在的设备I/O虚拟化作为系统虚拟化的重要组成部分,同样可按照实现技术分为软件I/O 全虚拟化、I/o类虚拟化和硬件辅助I/O全虚拟化。在软件完全虚拟化、类虚拟化和硬件辅助全虚拟化等虚拟化环境中,I/O设备的虚拟化都不尽相同,其核心在于I/o设备原生驱动(Legacy Driver)的存放位置以及VMM对 I/O设备的处理方式。软件完全虚拟化中,VMM必须模拟设备硬件,它是在会话的最低级别进行模拟的 (例如,网络驱动程序)。尽管在该抽象中模拟很干净,但它同时也是最低效、最复杂的。在类虚拟化中,Guest OS和VMM能够共同合作,让模拟更加高效。随着硬件辅助全虚拟化技术的出现,新的处理器通过加入虚拟化的高级指令来让Guest OS到VMM的切换更加地高效。 此外,硬件也随着I/O虚拟化的发展而不断改进。1)1/0全虚拟化软件完全虚拟化环境下,一般使用I/O模拟的方式来虚拟化I/O设备。在I/O虚拟化中,设备模型用于完成目标设备的模拟,设备请求的处理和响应。设备模型模拟目标设备的软件接口,使Guest OS能够用目标设备的驱动来驱动虚拟设备,进而透明地对虚拟设备进行操作。为了模拟目标设备软件接口,设备模型也需要同时实现目标设备的功能。这些功能是基于软件实现的。故设备模型所模拟的目标设备与宿主机的硬件不存在直接的关联与对应关系,而是建立在一定的运行环境之上。对于不同结构的虚拟机,其设备模型的工作方式是类似的VMM捕获对虚拟设备地址区域的读写操作、捕获对设备的访问;在真实硬件设备需要产生中断时,VMM还必须能触发Guest OS的中断。但是,对于不同结构的虚拟机,设备模型所运行的环境和位置可以是不同的。VMware Workstation和KVM都采用宿主操作系统结构,即它们的VMM运行于一个传统操作系统之上。这类VMM无法获得对硬件资源的完全控制,因此通常采用软件模拟的方法来虚拟1/0设备。Guest OS的1/0操作会被VMM捕获,并转交给Host OS的一个用户态进程,该进程通过对Host OS的系统调用来模拟设备的行为。VMware ESX Server对网卡,磁盘等关键设备采用了全虚拟化方法。它采用独立监控器模型,VMM直接运行于硬件之上,直接操作硬件设备。Guest OS看到的是一组统一的虚拟1/0设备。对这些虚拟设备的每一个1/0操作都会陷入到VMM中,由VMM对1/0指令进行解析并映射到实际物理设备,然后直接控制硬件完成。这种方法能够获得较好的性能,对客户操作系统也完全透明。但是由于VMM需要直接控制各种I/O设备,其设计会变的非常复杂,而且无法应对设备的快速更新。模拟技术的最大好处就是不需要修改客户设备驱动,但其缺点在于效率很低,模拟的难度大。这种方法最大性能开销在于处理器模式切换包括Guest OS到VMM的切换, 以及从内核带VMM到用户态I/O模拟进程的切换。故优化上主要策略就是减少模式切换。 为了减少模式切换,VMware Workstation中的许多I/O指令直接在VMM中处理,只有遇到真正会改变物理设备状态的操作(如读写磁盘,网络数据包收发),才会切换到I/O模拟进程中进一步处理。2) I/O类虚拟化在完全虚拟化中,I/O驱动包括Guest OS的硬件驱动,设备模拟及VMM中的真实硬件驱动。而类虚拟化不需要这种冗余的三层结构,I/o交互能够以高于I/O指令级别的抽闲来实现。类虚拟化环境下,Guest OS的内核被修改,原生设备驱动从Guest OS中移出,放入了一个经过VMM授权的设备虚拟机中(Device VM),其余虚拟机中Guest OS的I/O请求都交由这个设备虚拟机处理。而在Guest OS内部,系统为每个虚拟I/O设备安装一个特殊驱动,该驱动负责I/O请求的传递。设备虚拟机在经过VMM授权后,解析受到的I/O请求并映射到实际物理设备,最后交给它的原声设备驱动程序来控制硬件完成。目前,基于类虚拟化思想的I/O虚拟化有多种主要的实现,如Xen的I/O虚拟化和 Virtio 框架。 3)硬件辅助I/O全虚拟化硬件辅助I/O全虚拟化广泛应用于Xen中。Xen在引入了硬件虚拟化技术后,其 VMM能够支持未修改内核的Guest OS。尽管未修改内核的Guest OS中含有I/O设备的驱动程序,但是同类虚拟化一样,Xen同样不允许Guest OS直接访问真实物理硬件,而是通过 VMM单独授权的虚拟机间接访问。Xen的特权虚拟机中采用设备模型为未修改内核的Guest OS提供各种I/O设备的抽象。虚拟机内的Guest OS借助于这些虚拟设备来完成虚拟I/O 设备的访问,而这些虚拟I/O设备访问与实际硬件的交互则通过特权虚拟机的设备驱动完成。Virtio虚拟化框架Virtio是类虚拟化的VMM中的一组通用模拟设备的抽象。Virtio由Rusty Russell开发,他当时的目的是支持自己的虚拟化解决方案lguest。Virtio允许VMM导出一组通用的模拟设备,并通过一个通用的应用编程接口(API)让它们变得可用。有了类虚拟化VMM之后,Guest OS能够实现一组通用的接口,在一组后端驱动程序之后采用特定的设备模拟。后端驱动程序不需要是通用的,因为它们只实现前端所需的行为。Virtio API依赖一个简单的缓冲抽象来封装Guest OS需要的命令和数据。除了 ill立而驱动程序(在Guest OS中实现)和后纟而驱动程序(在VMM中实现)之外,Virtio还定义了两个层来支持Guest OS到VMM的通信。在顶级(称为Virtio)的是虚拟队列接口, 它在概念上将前端驱动程序附加到后端驱动程序。驱动程序可以使用O个或多个队列,具体数量取决于需求。例如,Virtio网络驱动程序使用两个虚拟队列(一个用于接收,另一个用于发送),而Virtio块驱动程序仅使用一个虚拟队列。虚拟队列实际上被实现为跨越 Guest OS和VMM的衔接点。但这可以通过任意方式实现,前提是Guest OS和VMM以相同的方式实现它。

发明内容
I 目的本发明提供了一种使用多队列技术的虚拟机网络性能优化的实现方法,它主要采用多队列虚拟化队列的虚拟化技术,为上层客户操作系统提供更好更迅速的网络服务。2技术方案2. I方法概述本发明专利基于kvm-linux操作系统的虚拟机模块kernel based virtual machine,其特点是通过将虚拟机和宿主机之间的单虚拟队列通信改变为多个虚拟队列,使得虚拟机和宿主机之间的网络数据传输速度加快。2. 2总体设计多队列思路是将发送/接收队列并行化,使多个队列可以同时发送/接收数据。 将单队列扩展成多队列需要对qemu(涉及kvm的IO虚拟化的模块之一)、vhost(涉及kvm 的IO虚拟化的模块之一),客户机的virtio-net进行修改。因为在初始化完成之后,vhost 与客户机之间的通信是通过kvm内核模块进行,不需要qemu进行任何操作,所以对qemu的修改仅限于vhost和virtio-net初始化、提供给用户的使用接口。对vhost进行多队列扩展关键在于设计数据结构,相关的修改包括了 vhost系统调用、内核线程创建等。客户机 virtio-net是以网卡驱动的形式存在的,要实现多队列,就是要实现多队列网卡驱动,对其修改的关键也在于数据结构的设计上,以及队列选择机制,相关的修改包括virtio-net设备探测、队列选择等。以上三部分的修改不是孤立的,必须作为一个整体考虑qemU需要向 vhost、virtio-net传递是否启用多队列、队列数量等信息,vhost、virtio-net也需要去检查这些信息;vhost中的队列与virtio-net中的队列也是--对应的。综上所述,本发明一种使用多队列技术的虚拟机网络性能优化的实现方法,该方法具体步骤如下步骤一对QEMU的网络初始化部分进行修改,通过修改QEMU,增加对于多队列的支持。这部分的修改主要涉及以下两个部分I. QEMU TAP (qemu模块中和数据传输有关的部分)初始化修改数据结构使得能够支持多队列,修改了对应队列的文件描述符,增加了用于指示描述符个数的项等。针对于数据结构的改变,修改相应的函数以适应新的数据结构。增加检测是否启用多队列的功能,当不启用多队列的时候,支持原本的单队列传输。2. Vhost_net (vhost模块中和网络相关的部分)初始化修改数据结构以支持多队列。调用修改后的vhost多队列的ioctl系统调用,用于创建和控制队列。步骤二 对vhost多队列的修改,是为了支持QEMU对多队列的使用和vhost-net于一个队列使用一个线程进行数据传输的修改和系统调用的修改。I.有关队列使用线程的修改在非多队列情况下,一个vhost_dev (虚拟机网络中的虚拟设备)对应一个内核线程,但是现在要实现多队列,就需要多个内核线程。因此需要一个队列对应一个线程。我们主要对以下几个数据结构进行重新设计和修改Vh0St_deV的修改主要针对于内核线程和队列进行映射之后,存在一些不再需要的项;vhost_virtqueue中需要指定队列号,并且对于每一个队列标识它所在的工作队列;因为前两个数据结构的修改,与其相关的数据结构vhost_poll和vhost_net也要针对于前面的改动而做一些修改。与这些数据结构相关的函数也需要根据数据结构的修改进行相应的调整。2.系统调用的修改具体修改包括将open中原先初始化队列的工作移到ioctl中,因为需要QEMU传递队列数量到内核态,open系统调用无法满足次要求,而ioctl可以;将release释放函数由原来释放发送/接收队列扩展成释放指定个数中增加初始化队列的工作,对清理队列的操作进行修改,将清理单队列变成清理多个队列。步骤三对vhost-net (vhost模块中和网络相关的部分)多队列网卡的修改,使得虚拟网卡支持多队列的传输。具体的修改包括增加feature的支持;向virtio_net_ config数据结构中增加用于说明多队列数目的项;将virtnet_info数据结构中的接收虚拟队列rvq和发送虚拟队列svq单独作为新的数据结构。(3)优点及效果通过基于virtio的多队列的技术,本发明为kvm虚拟机的网络提供了可靠的优化方法,提升了虚拟机的网络传输性能。经测试,本优化方法能够在保持平均CPU利用率不变的情况下,提升大数据包的平均传输吞吐量20%以上。本发明在现有的成熟技术基础上进行创新,实施不难,具有良好的使用和发展前景。


图I未使用多队列的KVM网络函数及模块框架2使用多队列的KVM网络函数及模块框架3本发明流程框中符号说明如下图1、2中的字母符号内容都表示函数名称。
具体实施例方式见图I、图2、图3,本发明一种使用多队列技术的虚拟机网络性能优化的实现方法,该方法具体步骤如下步骤一对QEMU的网络初始化部分进行修改,通过修改QEMU,增加对于多队列的支持。这部分的修改主要涉及以下两个部分I、QEMU TAP (qemu中和数据传输有关的部分)初始化修改数据结构使得能够支持多队列,修改了对应队列的文件描述符,增加了用于指示描述符个数的项等。针对于数据结构的改变,修改相应的函数以适应新的数据结构。增加检测是否启用多队列的功能,当不启用多队列的时候,支持原本的单队列传输。2、Vhost_net (vhost模块中和网络相关的部分)初始化修改数据结构以支持多队列。调用修改后的vhost多队列的ioctl系统调用,用于创建和控制队列。步骤二 对vhost多队列的修改,是为了支持QEMU对多队列的使用和vhost-net 多队列网卡的支持,主要包括针对于一个队列使用一个线程进行数据传输的修改和系统调用的修改。I、有关队列使用线程的修改在非多队列情况下,一个vhost_dev (虚拟机网络中的虚拟设备)对应一个内核线程,但是现在要实现多队列,就需要多个内核线程。因此需要一个队列对应一个线程。我们主要对以下几个数据结构进行重新设计和修改Vh0St_deV的修改主要针对于内核线程和队列进行映射之后,存在一些不再需要的项;vhost_virtqueue中需要指定队列号,并且对于每一个队列标识它所在的工作队列;因为前两个数据结构的修改,与其相关的数据结构vhost_poll和vhost_net也要针对于前面的改动而做一些修改。与这些数据结构相关的函数也需要根据数据结构的修改进行相应的调整。2、系统调用的修改具体修改包括将open中原先初始化队列的工作移到ioctl中,因为需要QEMU传递队列数量到内核态,open系统调用无法满足次要求,而ioctl可以;将release释放函数由原来释放发送/接收队列扩展成释放指定个数中增加初始化队列的工作,对清理队列的操作进行修改,将清理单队列变成清理多个队列。步骤三对vhost-net (vhost模块中和网络相关的部分)多队列网卡的修改,使得虚拟网卡支持多队列的传输。具体的修改包括增加feature的支持;向virtio_net_ config数据结构中增加用于说明多队列数目的项;将virtnet_info数据结构中的接收虚拟队列rvq和发送虚拟队列svq单独作为新的数据结构。
权利要求
1. 一种使用多队列技术的虚拟机网络性能优化的实现方法,其特征在于该方法具体步骤如下步骤一对QEMU的网络初始化部分进行修改,通过修改QEMU,增加对于多队列的支持; 这部分的修改涉及以下两个部分1.qemu模块中和数据传输有关的部分——QEMU TAP初始化修改数据结构使得能够支持多队列,修改了对应队列的文件描述符,增加了用于指示描述符个数的项;针对于数据结构的改变,修改相应的函数以适应新的数据结构;增加检测是否启用多队列的功能,当不启用多队列的时候,支持原本的单队列传输;2.vhost模块中和网络相关的部分-Vhost_net初始化修改数据结构以支持多队列;调用修改后的vhost多队列的ioctl系统调用,用于创建和控制队列;步骤二 对vhost多队列的修改,是为了支持QEMU对多队列的使用和vhost-net多队列网卡的支持,包括针对于一个队列使用一个线程进行数据传输的修改和系统调用的修改;1.有关队列使用线程的修改在非多队列情况下,一个虚拟机网络中的虚拟设备vhost_dev对应一个内核线程,但是现在要实现多队列,就需要多个内核线程,因此需要一个队列对应一个线程;对以下几个数据结构进行重新设计和修改Vh0St_deV的修改针对于内核线程和队列进行映射之后,存在一些不再需要的项;vhost_virtqueue中需要指定队列号,并且对于每一个队列标识它所在的工作队列;因为前两个数据结构的修改,与其相关的数据结构 vhost_poll和vhost_net也要针对于前面的改动而做一些修改;与这些数据结构相关的函数也需要根据数据结构的修改进行相应的调整; ·2.系统调用的修改具体修改包括将open中原先初始化队列的工作移到ioctl中,因为需要QEMU传递队列数量到内核态,open系统调用无法满足次要求,而ioctl可以;将release释放函数由原来释放发送/接收队列扩展成释放指定个数中增加初始化队列的工作,对清理队列的操作进行修改,将清理单队列变成清理多个队列;步骤三对vhost模块中和网络相关的部分-vhost-net多队列网卡的修改,使得虚拟网卡支持多队列的传输;具体的修改包括增加feature的支持;向virtio_net_config 数据结构中增加用于说明多队列数目的项;将virtnet_info数据结构中的接收虚拟队列 rvq和发送虚拟队列svq单独作为新的数据结构。
全文摘要
一种使用多队列技术的虚拟机网络性能优化的实现方法,它有三大步骤步骤一对QEMU的网络初始化部分进行修改,通过修改QEMU,增加对于多队列的支持;步骤二对vhost多队列的修改,是为了支持QEMU对多队列的使用和vhost-net多队列网卡的支持,包括针对于一个队列使用一个线程进行数据传输的修改和系统调用的修改;步骤三对vhost模块中和网络相关的部分——vhost-net多队列网卡的修改,使得虚拟网卡支持多队列的传输。本发明通过设计和实现虚拟机到宿主机的多个虚拟队列,来实现增加虚拟机网络数据流量和吞吐量的目的。该方法构思巧妙、科学合理,在计算机技术领域内具有良好的使用价值和广阔的应用前景。
文档编号G06F9/46GK102591715SQ20121000217
公开日2012年7月18日 申请日期2012年1月5日 优先权日2012年1月5日
发明者肖利民, 许航, 雷松松 申请人:北京航空航天大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1