一种虚拟机域间通信模式的动态透明切换方法【
技术领域:
】[0001]本发明涉及云计算、操作系统、网络通信虚拟化领域中基于系统调用截获的虚拟机域间通信模式的动态透明切换方法。【
背景技术:
】[0002]虚拟化技术已成为云计算环境IaaS(InfrastructureasaService)层的重要使能技术之一。它通过虚拟机监控器VMM(VirtualMachineMonitor)软件对物理计算机的CPU、内存、I/O等设备进行虚拟化,在一台物理计算机(简称物理机)上虚拟出多个虚拟机VM(VirtualMachine,也称虚拟机域),每个VM都运行一个客户操作系统(Guest0S,客户机)。VMM与一个特权虚拟机域(DomO或Host0S,宿主机)协调,保证位于同一物理计算机上的VM之间的相互隔离,支持无需宕机的前提下将VM从一台物理机在线迀移(LiveMigration)到另一台物理机。虚拟化技术在VM功能和性能隔离、基于VM在线迀移的负载均衡和系统容错、应用移植性、提高资源利用率、降低运维难度和成本等方面的优势使其被广泛应用于以Amazon为代表的大型数据中心和云计算环境的IaaS平台中,其典型应用涵盖高性能计算、大规模分布式计算、Web事务处理,等等,对于这类应用,网络通信是其负载的重要组成部分。[0003]通常将位于同一物理机上的VM称为共生(co-located)VM。导致VM间通信性能折损的一个重要原因在于基于VMM的VM间通信并不区分数据传输请求是否来自于共生VM,即并不判断通信双方是否具有共生关系。这就使得无论通信双方VM是否位于同一物理机上,都将采用基于TCP/IP的虚拟网络远程通信模式,通信数据的发送和接收均需经过多层网络协议栈,通信路径比较长,且各VM与DomO/VMM之间的上下文切换比较频繁,通信性能开销较大。而共生VM间的通信已成为虚拟网络通信负载中不可忽视的组成部分,对于位于同一物理机上的共生VM间通信而言,基于TCP/IP的远程通信模式会产生不必要的性能损耗。因此,如何面向共生VM进行通信优化成为一个值得关注的问题。一类现有的方法是建立共生关系感知(Co-locationAware)的虚拟机域间通信优化机制,S卩通过判断通信双方VM是否在同一台物理机上来区别处理:对于共生VM域间的通信,采用本地共享内存机制建立共享内存通道,以取代通信路径较长的基于TCP/IP的通信路径,从而降低通信开销,该通信模式称为本地模式;对于不在同一台物理机上的非共生VM,仍采用基于TCP/IP的传统方式进行通信,该通信模式称为远程模式。该方法支持面向共生VM的域间通信优化,可有效缩短基于TCP/IP的虚拟网络通信路径长度、并减少上下文切换次数,从而提高运行在VM中的以Web系统、高性能Grid应用、在线事务处理、分布和并行计算系统等为代表的网络通信密集型应用的通信效率。[0004]VM在线迀移是虚拟化技术的重要特性,VM在线迀移是指在不中断服务的前提下,将正在运行的VM从一台物理机移植到另一台物理机上,该特性能够有效支持系统负载平衡、容错恢复、降低能耗及提高可管理性,设计良好的共生关系感知的虚拟机域间通信优化机制在提高虚拟机域间通信效率的同时不应破坏该特性,这就为该类机制的构建带来了一定难度,为了保持VM在线迀移特性,需支持虚拟机域间通信的本地模式和远程模式之间的透明切换。如何在保证通信模式切换对用户透明的前提下,支持VM在线迀移、共生VM动态发现和共生VM集合维护、以及虚拟机域间通信模式的切换,且以较小的性能开销实现虚拟机域间通信模式切换,是本领域技术人员极为关注的技术问题。[0005]目前,已有的支持VM在线迀移的共生关系感知的虚拟机域间通信机制有IVC(Inter_VMCommunication)、XWAY、XenLoop和MMNet(Memory-MappedNetwork)。然而,IVC和XWAY采用预先设置的方式来静态确定参与通信的各台物理机上的共生VM集合,能够支持共生VM之间本地通信模式与非共生VM之间远程通信模式之间的自动切换,但由于VM在线迀移发生的时机并不总是预先确定的,这类方法不能支持两种通信模式之间对用户的透明切换。而XenLoop和MMNet均支持VM在线迀移、共生VM动态发现和共生VM集合维护、以及虚拟机域间通信模式的透明切换。但XenLoop和MMNet都是IP层之下完成网络请求的截获,由于其请求截获机制在TCP/IP网络协议栈中所处层次较低,与更高层次的截获方法相比,数据传输需要经过更长的通信路径,且需要在所经过的网络协议栈中逐层进行数据封装或解封,带来的性能开销较大。[0006]鉴于此,本发明提出一种新的支持VM在线迀移的共生关系感知且开销更小的虚拟域间通信机制。【
发明内容】[0007]本发明要解决的技术问题是:针对目前Linux系统中共生关系感知的虚拟机域间通信模式切换方法的不足,即要么不能在支持在线迀移的同时保证用户透明性、要么实现层次偏底层、通信效率较低,提出一种基于系统调用截获的虚拟机域间通信模式的透明切换方法,该方法通过动态发现共生VM、以及截获网络请求相关的系统调用(系统调用是由操作系统实现提供的所有系统调用所构成的集合即程序接口或应用编程接口,是应用程序同系统之间的接口)的手段来实现虚拟机域间通信时本地模式与远程模式之间的透明切换,使得用户透明性和通信效率得以兼顾,同时,该方法还具有支持VM在线迀移、无需修改操作系统内核等特点。[0008]其基本思想是:为网络通信相关的系统调用分别构造对应的自定义处理函数,将系统调用的原有缺省处理函数替换为自定义函数,自定义函数根据在截获网络通信相关系统调用请求时所获取的通信双方VM信息、利用已构造的共生VM动态发现和发布、共生VM集合维护机制来判定通信双方VM是否是共生VM,若是共生VM,则采用基于共享内存的本地通信模式,否则,重定向到操作系统中原有的面向TCP/IP的缺省处理函数进行处理。[0009]本发明的技术方案是:在客户机操作系统中构建域间通信优化内核模块,在宿主机中构建共生VM动态发现与发布模块,该模块由共生VM动态发现和共生VM发布两个子模块组成。[0010]在描述本发明的具体思想之前,首先对本发明所用到的几大重要数据结构及其操作进行说明。[0011]1.系统调用表(sys_call_table):Linux系统分为内核态和用户态,用户程序无法直接运行内核态的函数,必须借助系统调用实现,如建立网络连接,发送网络数据,接收网络数据等。系统调用表是Linux系统内核中固有的数据结构,由系统调用号和处理函数地址组成,在用户程序进行系统调用时,首先会传入系统调用号和参数,系统再通过系统调用号在系统调用表中找到相应的处理函数地址,最后找到相应的处理函数对参数进行处理。本发明的技术方案针对系统调用表的操作主要有:[0012]a)更改系统调用表所在页的读写属性:为了安全起见,系统调用表的初识属性是只读,为了能够替换处理函数地址,需要将系统调用表的属性更改为可写属性。[0013]b)备份原处理函数地址:即将原处理函数地址值取出,赋给函数备份指针。[0014]c)替换处理函数地址:将系统调用表中的处理函数地址更改为自定义的处理函数地址。[0015]d)恢复系统调用原处理函数地址:将原处理函数备份指针重新写到系统调用表相应位置。[0016]在本发明技术方案中,要截获的系统调用是网络请求相关系统调用,主要有:建立网络连接,发送网络数据,接收网络数据,关闭网络连接。[0017]2.宿主机共生VM列表:存放的是本物理机上存在共生关系的VM,每个列表项由〈DomID,IP>二元组组成,DomID是指客户机的ID,IP是客户机的IP地址,若系统中有n个存在共生关系的VM,则宿主机共生VM列表有n个列表项,第i项代表的是VMi。本发明的技术方案针对宿主机共生VM列表的操作主要有:[0018]a)初始化:仅从内存中申请一段空间,列表项数目为零。[0019]b)插入:当发现系统中有新的共生VM,则获取它的DomID和IP,插入到宿主机共生VM列表中,宿主机共生VM列表项数目加一。[0020]C)删除:当发现系统中有共生VM销毁,或者停止使用域间通信优化功能,则将这一VM对应的列表项删除,列表项数目减一。[0021]d)销毁:将宿主机共生VM列表的内存空间释放,返还给系统。[0022]3.客户机共生VM列表:存放的是与客户机存在共生关系的VM,每个列表项由〈DomID,IP>二元组和一个Hash表指针组成,二元组如上所述,Hash表指针指向一个本地通信连接Hash表。若系统中存在n个共生VM,则每个客户机中的共生VM列表中有n-1项,第i项代表代表第i个共生VM,表项中的Hash表指针指向客户机与VMi之间的本地通信连接Hash表。对于客户机共生VM列表的操作,主要有:[0023]a)初始化:向系统申请一段内存空间,列表数目为0。[0024]b)插入:将列表中不存在的二元组〈DomID,IP>插入到客户机共生VM列表中,并初始化一张本地通信连接Hash表,再将新插入的列表项中Hash表指针指向Hash表地址,最后客户机共生VM列表项数目加1。[0025]c)删除:找到要删除的列表项,先将列表项中Hash表指针所指向的本地通信连接Hash表销毁,再将列表项删除,最后客户机共生VM列表项数目减1。[0026]d)销毁:先删除所有的列表项,再将客户机共生VM列表所占内存空间释放。[0027]e)查找:传入通信的ip地址,查找列表项中是该ip地址对应的项在哪,若找到,则将列表项位置返回,否则返回"-1",代表该ip地址代表的机器与本客户机不存在共生关系。[0028]4.本地通信连接Hash表:Hash表中存放的每一项代表本VM与某共生VM之间的一组本地通信连接,若本VM与VMi(两者为共生VM关系)存在n组本地通信连接,则客户机共生VM列表第i项Hash表指针所指向的Hash表就存在n项。Hash表项以通信端口号为关键字做Hash运算并存放以下数据:通信端口号;发送缓冲区地址和大小、接收缓冲区地址和大小。本发明技术方案中,针对本地通信连接Hash表的操作主要有:[0029]a)初始化:为本地通信连接Hash表申请一段内存空间,返回值是这段内存空间的首地址。此时Hash表项数目为0。[0030]b)插入:当要建立一组本地通信连接的时候,会对本地通信连接Hash表进行插入操作。插入之前,应先建立本地通信连接,建立本地通信连接过程如下:本地通信连接发起者(某VM)首先向VMM申请数据发送缓冲区、数据接收缓冲区和事件缓冲区,再将所申请的这三个缓冲区的地址及通信端口号发送给本地通信连接响应者(另一VM),响应者新建Hash表项当前第1页1 2 3 4 5