发明名称 一种支持在线迁移的虚拟机间快速通信方法
摘要 本发明公开了一种支持在线迁移的虚拟机间快速通信方法,方案是构造支持VM迁移的基于共享内存机制的通信加速内核模块,在该模块内部添加初始化、系统调用分析器、连接管控、通告处理、数据传输管理、VM迁移支持六个子模块;扩展VMM功能,添加虚拟机组管理和通告管理两个子模块,并修改在线迁移子模块;由VMM和VM组成一个虚拟机系统,采用虚拟机系统对VM间通信进行加速:对VM进行组管理,构建VM间通信加速和系统调用分析所需的软件环境,旁路掉与网络操作无关的系统调用,选择与网络操作有关的系统调用分类进行处理,完成同一物理计算机上的VM间的基于共享内存的快速通信。本发明在Socket与TCP/IP层实现、对应用编程透明、支持虚拟机在线迁移。
申请公布号 CN101859263B 申请公布日期 2012.07.25
申请号 CN201010198970.9 申请日期 2010.06.12
申请人 中国人民解放军国防科学技术大学 发明人 任怡;刘晓建;吴庆波;戴华东;管剑波;谭郁松
分类号 G06F9/54(2006.01)I;H04L29/08(2006.01)I 主分类号 G06F9/54(2006.01)I
代理机构 国防科技大学专利服务中心 43202 代理人 郭敏
主权项 一种支持在线迁移的虚拟机间快速通信方法,其特征在于包括以下步骤:第一步,构造客户操作系统中的共享内存通信支持模块,扩展虚拟机监控器VMM功能,在已有计算机硬件的基础上,由扩展了的VMM和多个包括通信加速支持的虚拟机VM组成一个虚拟机系统,方法是:1.1在客户操作系统中构建支持VM迁移的基于共享内存机制的通信加速内核模块,方法是:不修改已有操作系统内核代码,遵循标准的操作系统内核模块开发接口、在Socket通信层添加一个自包含可加载的通信加速内核模块,并在该模块内部构造并添加初始化、系统调用分析器、连接管控、通告处理、数据传输管理、VM迁移支持共六个子模块,方法是:1.1.1构造并添加初始化子模块:根据当前VM的组ID配置,首先调用VMM的虚拟机组管理子模块来创建组或在相应的组中注册该VM;接着请求操作系统保留连续的虚地址空间,并向VMM的域间共享内存子模块发出请求,由其建立共享内存缓冲区;然后调用VMM的在线迁移子模块以生成VM的当前位置号并更新VMM的当前位置号表,当前位置号表的每一项为VM的ID及其对应的当前位置号;调用VM迁移支持子模块,通知VM迁移支持子模块获取并维护该VM的当前位置号的一个拷贝;当发生系统调用时转到系统调用分析器子模块进行对应用透明的通信加速;1.1.2构造并添加系统调用分析器子模块:截获来自网络应用的系统调用请求,首先过滤掉与网络操作无关的系统调用,对于其它系统调用,如果是不同物理计算机上的VM间通信,则仍采用面向TCP/IP网络协议的传统机制处理,如果是位于同一物理计算机上的VM间的通信,则调用连接管控子模块或数据传输管理子模块进行创建或关闭连接、数据传输;1.1.3构造并添加连接管控子模块,连接管控子模块负责网络连接信息的维护和管理,为网络连接信息构造连接控制块数据结构,该数据结构包含以下信息:通信的VM双方的IP地址和端口号;I/O模式标志位;一个发送缓冲区和一个接收缓冲区;等待发送的睡眠VM队列、等待接收的睡眠VM队列;在构造上述数据结构之后,将所有连接控制块组织成连接控制块表,表中每一项为一个网络连接的ID号,以及该ID对应的连接控制块;然后按照如下流程和与其它子模块之间的接口构造并添加连接管控子模块:在建立连接、关闭连接或进行数据收发时,被系统调用分析器子模块、数据传输管理子模块或VM迁移支持子模块调用,用于访问VMM域间共享内存子模块创建的共享内存,从而创建、注册、读取、修改或回收连接控制块,维持基于共享内存的通信连接;1.1.4构造并添加通告处理子模块:接收VMM通告管理子模块和事件注入子模块转发的与当前事件对应的中断,读取事件缓冲区,获取所需事件,事件类型包括唤醒目标 VM接收数据、唤醒源VM发送数据、网络连接已关闭、数据缓冲区可被释放四种;根据事件类型唤醒源VM发送或目标VM接收数据、或通知通信另一方VM网络连接已关闭、数据缓冲区可被释放;1.1.5构造并添加数据传输管理子模块:首先调用VM迁移支持子模块判断是否发生了在线迁移,若发生了迁移,则可能出现数据丢失情况,需重建连接或者重传数据,若未发生迁移,则向连接管控子模块发请求获得连接控制块,从而得到共享缓冲区的位置信息,接着通过该共享缓冲区发送或接收数据;1.1.6构造并添加VM迁移支持子模块:在进行连接关闭、数据发送/接收时,判断VM迁移支持子模块维护的当前位置号拷贝与VMM在线迁移子模块中当前位置号表中的当前位置号是否相同,如果不同,则表明发生了迁移,这时首先读取VMM在线迁移子模块维护的当前位置号表中的当前位置号,并将其更新到该VM的VM迁移支持子模块维护的拷贝中,然后根据迁移的具体情况重新建立TCP连接或者基于共享内存的连接,并调用连接管控子模块和数据传输管理子模块对已经发送但尚未接收的数据进行处理;1.2扩展VMM功能,使VMM具有通信加速支持能力,方法是保留VMM已有的中断处理子模块、CPU指令虚拟化子模块、MMU虚拟化子模块、事件注入子模块、域间共享内存子模块和在线迁移子模块,添加虚拟机组管理和通告管理两个子模块,并修改在线迁移子模块,具体方法如下:1.2.1构造并添加虚拟机组管理子模块:虚拟机组管理子模块在启动VM时根据VM的组信息配置来设置VM的组ID,具有相同组ID的VM构成一个虚拟机组;在VM销毁时虚拟机组管理子模块将该VM从其虚拟组中删除,判断组内VM成员数是否为0,若是0,则删除该虚拟机组;虚拟机组管理子模块在VM启动或关闭时调用通告管理子模块为虚拟机组创建或回收事件缓冲区;1.2.2构造并添加通告管理子模块,通告管理子模块在VM启动或关闭时被虚拟机组管理子模块调用为虚拟机组创建或回收事件缓冲区,此时通告管理子模块调用VMM的域间共享内存子模块完成事件缓冲区的内存映射;通告管理子模块还登记和缓存来自VM的请求对应的事件,并通过通告处理子模块向目标VM发送事件,发送事件的步骤是:根据当前VM的网络连接信息,定位通信另一方VM对应的事件缓冲区位置;将当前事件类型和参数登记到该事件缓冲区中;向通信另一方VM注入当前事件类型对应的中断;中断处理完毕后清除事件缓冲区中的该事件;1.2.3修改在线迁移子模块,保留VMM在线迁移子模块的在线迁移功能,添加迁移辅助处理功能,迁移辅助处理功能与在线迁移功能以及VM的通信加速内核模块之间的接口为:在操作系统加载通信加速内核模块时迁移辅助处理功能被初始化子模块调用;在接收到外部在线迁移命令并通过VMM在线迁移子模块的原有在线迁移功能完成VM的迁移 后,迁移辅助处理功能被激活;迁移辅助处理的流程及其与其它子模块的接口具体如下:在通信加速内核模块被加载时,添加的迁移辅助处理功能被通信加速内核模块的初始化子模块激活,生成VM的当前位置号,并在当前VMM的当前位置号表中加入该VM的ID和当前位置号,调用通信加速内核模块的VM迁移支持子模块,使后者获取该VM当前位置号的一个拷贝,用于在数据传输和连接关闭时判断VM是否发生了迁移;在接收到外部在线迁移命令并通过原有在线迁移功能完成VM的迁移后,在线迁移子模块中添加的迁移辅助处理功能将当前VM迁移前所在物理计算机上的源VMM中保存的连接控制块、已发送和已接收字节数同步到迁移后的目标VMM中,然后通知目标VMM的在线迁移子模块生成被迁移VM的当前位置号,并更新当前位置号表中的信息;第二步,采用虚拟机系统对VM间通信进行加速,具体步骤为:2.1VMM启动VM,VMM的虚拟机组管理子模块对虚拟机系统中需要进行通信加速的VM进行组管理;2.2通信加速内核模块的初始化子模块构建VM间通信加速和系统调用分析所需的软件环境,方法是:2.2.1初始化子模块请求操作系统保留连续的虚地址空间,并向VMM的域间共享内存子模块发出请求,由VMM建立共享内存缓冲区,用于存放相互通信的VM的连接控制块信息、待传输的数据和待处理的事件;2.2.2初始化子模块获取当前VM的IP地址及其所在物理计算机的MAC地址,调用VMM的在线迁移子模块,通过函数转换,生成该虚拟机系统中每个VM唯一的位置标志信息——当前位置号;VMM的在线迁移子模块在共享缓冲区中为所有VM维护一个当前位置号表,存储虚拟机系统中每个VM的ID及该VM的最新当前位置号;在生成当前位置号后,初始化子模块调用在线迁移子模块将该VM的ID及其当前位置号加入当前位置号表中,并调用通信加速内核模块的VM迁移支持子模块,使得后者获取并维护该VM的当前位置号的一个拷贝;2.3VM客户操作系统中的通信加速内核模块接收应用程序或外部命令中的系统调用,转发给系统调用分析器子模块,系统调用分析器子模块首先旁路掉与网络操作无关的系统调用,然后选择与网络操作有关的系统调用分类进行处理,完成同一物理计算机上的VM间的基于共享内存的快速通信,方法是:2.3.1若当前系统调用的类别是建立网络连接,则:2.3.1.1连接管控子模块首先通过VMM获得当前VM的组ID及其所在物理计算机的MAC地址,接着判断通信双方VM的虚拟组ID是否相同,如果通信双方虚拟机组ID不同,则无需进行通信加速,按操作系统常规的建立TCP网络连接的流程处理;如果通信双方虚 拟机组ID相同,则判断通信双方是否位于同一台物理计算机上,按以下方法处理:2.3.1.1.1如果通信双方不位于同一台物理计算机,则按操作系统常规的建立TCP网络连接的流程处理;2.3.1.1.2如果通信双方位于同一台物理计算机,且该系统调用对应的网络连接的连接控制块尚未被添加到连接管控子模块中的连接控制块表中,则调用VMM的域间共享内存子模块,获取源VM和目标VM的数据缓冲区,初始化已发送和已接收的字节数为0,在第2.2.1步中VMM建立的共享内存缓冲区中创建连接控制块,设置连接控制块的初始值,分配用于数据发送或接收的共享缓冲区,最后在连接管控子模块中注册该连接,即将该连接对应的连接控制块添加到连接控制块表中;2.3.2若当前系统调用是数据发送操作,则:2.3.2.1通信加速内核模块的数据传输管理子模块调用VM迁移支持子模块,判断其维护的该VM当前位置号拷贝与VMM当前位置号表中的对应当前位置号是否一致;如果一致,表明通信双方VM未发生迁移,转第2.3.2.2步进行基于共享内存的快速数据发送;如果不一致,表明在进行该发送操作前该VM发生了迁移,进行迁移辅助处理:VM迁移支持子模块读取VMM的在线迁移子模块维护的当前位置号表中的当前位置号,并将其更新到自身维护的当前位置号拷贝中;为了对已经发送但尚未被接收到的数据进行处理,VM迁移支持子模块查询连接管控子模块中是否注册了该连接对应的连接控制块:2.3.2.1.1如果注册了,读取VMM中的已发送和已接收的字节数,若前者大于后者,则表明第2.3.1.1.2步所分配的数据缓冲区中仍有数据未被目标VM所接收,数据传输管理子模块等待直到目标VM的接收缓冲区为空,并更新VMM中已接收的字节数,否则表明数据均被接收;回收当前连接控制块和数据缓冲区,将数据发送从基于共享内存的方式转为基于TCP协议的方式,按操作系统常规的基于TCP连接的数据发送流程处理;2.3.2.1.2如果未注册,数据传输管理子模块等待直到网络上的数据被接收完毕,然后判断迁移后通信双方是否在同一台物理计算机上,若不是,则仍然采用基于TCP协议的方式发送数据,按操作系统常规的基于TCP连接的数据发送流程处理;若是,则迁移后通信双方在同一台物理计算机上;判断发送数据的当前VM的组ID与目标VM的组ID是否相同:如果相同,则表明迁移后源VM和目标VM位于同一物理计算机上且应采用共享内存方式对其通信进行加速,需要建立基于共享内存的连接,于是将当前系统调用设置为该数据发送操作,转第2.3.1.1步执行;若不相同,则仍然采用基于TCP协议的方式,按照操作系统常规流程基于TCP连接来发送数据;2.3.3若当前系统调用是数据接收操作,则:2.3.3.1通信加速内核模块的数据传输管理子模块调用VM迁移支持子模块,判断其维护的该VM当前位置号拷贝与VMM当前位置号表中的对应值是否一致;如果一致,表明 通信双方VM未发生迁移,直接转第2.3.3.2步进行基于共享内存的快速数据接收;如果不一致,表明在进行此接收操作前该VM发生了迁移,进行迁移辅助处理:首先读取VMM的在线迁移子模块维护的当前位置号表中的当前位置号,并将其更新到该VM的VM迁移支持子模块维护的拷贝中;为了对已经发送但尚未被接收到的数据进行处理,查询连接管控子模块中是否注册了该连接对应的连接控制块:2.3.3.1.1如果注册了,读取VMM中的已发送和已接收的字节数,若前者大于后者,则表明第2.3.1.1.2步所分配的数据缓冲区中仍有数据未被目标VM所接收;由于迁移后通信双方不在同一台物理计算机上,则当仍有数据未被接收时,首先请数据发送方将用于发送的数据缓冲区中的数据重发一遍,接收完网络上传输的剩余数据后,回收当前连接控制块和数据缓冲区,将数据发送从基于共享内存的方式转为基于TCP协议的方式,按操作系统常规流程基于TCP连接来接收数据;2.3.3.1.2如果未注册,数据传输管理子模块等待目标VM继续接收数据直到网络上的数据被接收完毕;然后判断迁移后通信双方是否在同一台物理计算机上,若不是,则仍然采用基于TCP协议的方式发送数据,按操作系统常规流程基于TCP连接来接收数据;若是,则迁移后通信双方在同一台物理计算机上;判断接收数据的当前VM的组ID与源VM的组ID是否相同:如果相同,则表明迁移后源VM和目标VM位于同一物理计算机上且应采用共享内存方式对其通信进行加速,需要建立基于共享内存的连接,于是将当前系统调用设置为该数据接收操作,以便在重建连接后继续本次数据接收,然后转第2.3.1.1步;若不相同,则无需用共享内存方式加速通信,仍然采用基于TCP协议的方式,按照操作系统常规流程基于TCP连接来接收数据;2.3.3.2通信加速内核模块的数据传输管理子模块进行基于共享内存的快速数据接收;通信加速内核模块的数据传输管理子模块首先读取连接管控子模块维护和管理的连接控制块表,判断是否存在当前接收操作对应的连接,若不存在,则表明通信双方VM不在同一台物理计算机上,转操作系统常规流程基于TCP连接来接收数据,否则判断通信双方VM的虚拟组ID是否相同,如果不相同,则转操作系统常规流程基于TCP连接来接收数据,否则按照共享内存的方式接收数据:如果接收缓冲区不为空,则目标VM接收其中的数据,并将已接收数据字节数增加相应的值;若接收操作完毕,则数据接收流程结束,否则按以下方法处理:2.3.3.2.1当本次I/O为非阻塞式时,转第2.3.3步;2.3.3.2.2当本次I/O为阻塞式时,则将本接收任务添加到连接控制块的等待接收的睡眠VM队列,调用操作系统功能进行睡眠,直至源VM通过通信加速内核模块的通告处理子模块传递发送数据事件唤醒本任务,转第2.3.3步;2.3.4若当前系统调用是关闭网络连接,则:2.3.4.1通信加速内核模块的连接管控子模块调用VM迁移支持子模块判断其维护的该VM当前位置号拷贝与VMM当前位置号表中的对应值是否一致;如果一致,表明通信双方VM未发生迁移,直接转第2.3.4.2步关闭连接;如果不一致,表明在即将关闭网络连接前VM发生了迁移,进行迁移辅助处理:首先读取VMM的在线迁移子模块维护的当前位置号表中的当前位置号,并将其更新到该VM的VM迁移支持子模块维护的拷贝中;为了对已经发送但尚未被接收到的数据进行处理,查询连接管控子模块中是否注册了该连接对应的连接控制块:2.3.4.1.1如果注册了,读取VMM中的已发送和已接收的字节数,若前者大于后者,则表明仍有数据未被接收;当仍有数据未被接收时,由于迁移后通信双方VM不在一台物理计算机上,若当前VM是源VM,则等待直到目标VM的接收缓冲区为空,若当前VM是目标VM,则请数据发送方将用于发送的数据缓冲区中的数据重发一遍,并接收网络上传输的重发数据;2.3.4.1.2如果未注册,则判断当前VM是源VM还是目标VM,如果为源VM,则等待直至网上传输的数据被接收完毕;如果当前VM为目标VM,则读取网络上传输的剩余数据;2.3.4.2通信加速内核模块的数据传输管理子模块读取连接管控子模块维护和管理的连接控制块表,判断是否存在当前操作对应的连接,若不存在,则转操作系统常规流程关闭TCP连接,否则判断通信的另一方VM是否在睡眠,若其正在睡眠,则请求VMM的通告管理子模块通过事件缓冲区向对方发送事件,用于通知后者网络连接已经断开且可以释放数据缓冲区,通告管理子模块通过VMM的事件注入子模块向VM注入当前事件对应的中断,VM中的通信加速内核模块的通告处理子模块接收中断;2.3.4.3调用VMM的域间共享内存子模块以释放双方的数据缓冲区,判断对方是否已经关闭连接,如果已经关闭,则通过连接管控子模块回收当前连接控制块;2.4VMM关闭IP为addr、所属组ID为gid、组密钥为key的VM,VMM的虚拟机组管理子模块从组中删除该VM。
地址 410073 湖南省长沙市开福区德雅路109号