本发明涉及云计算,具体地说是一种基于linux的虚拟机内存优化方法、设备及介质。
背景技术:
1、linux是一种自由和开放源码的类unix操作系统,unix操作系统的内核加上用户空间的应用程序之后,就成为了linux操作系统。linux操作系统也是自由软件和开放源代码软件发展中最著名的例子。只要遵循gnu 通用公共许可证(gpl),任何个人和机构都可以自由地使用linux的所有底层源代码,也可以自由地修改和再发布。
2、ksm(kernel samepage merging) 基于内存重复数据删除技术,实现了节省服务器物理内存使用。ksm在 2.6.32 中添加到 linux 内核中,最初是与kvm(kernel virtualmachine,内核虚拟机)一起使用而开发的,通过共享虚拟机之间的公共数据,将更多虚拟机放入物理内存中。 但是ksm的使用场景不止局限在虚拟机上,它对有相似内存数据的应用也有效果。但是当前ksm回收页面时存在回收速度慢、缺少进程等级优先级的缺点。
技术实现思路
1、本发明的技术任务是提供一种基于linux的虚拟机内存优化方法、设备及介质,来解决当前ksm回收页面时回收速度慢、缺少进程等级优先级的问题。
2、本发明的技术任务是按以下方式实现的,一种基于linux的虚拟机内存优化方法,该方法具体如下:
3、s1、虚拟机管理器使用madivse系统调用配置虚拟地址空间属性;
4、s2、内核的ksm模块将虚拟机管理器的进程号及虚拟地址空间的数据记录并存入优先级队列;
5、s3、ksm模块扫描时遍历扫描优先级队列;
6、s4、判断优先级队列是否非空:
7、①若否,则结束扫描;
8、②若是,则执行步骤s5;
9、s5、取出队列中优先级最大的元素;
10、s6、判断扫描页面数是否小于m:
11、①若否,则删除超过扫描次数的元素,并跳转至步骤s5;
12、②若是,则执行步骤s7;
13、s7、合并页面;
14、s8、调整临时优先级;
15、s9、修改扫描页面数,并跳转至步骤s6。
16、作为优选,将优先级队列引入到ksm模块中,优先级队列的每一个元素是一个结构体,该结构体包含五个属性,描述如下:
17、表示优先级的属性,类型为双精度浮点数;
18、表示进程号的属性,类型为整型;
19、其中,进程号的属性包括如下内容:
20、描述内存段容量的属性,对应的类型为无符号整型,长度为64位;
21、记录内存段起始地址的属性,对应的类型为无符号整型,长度为64位;
22、记录当前遍历到的虚拟地址位置的属性,对应的类型为无符号整型,长度为64位。
23、作为优选,扩展madivse系统的linux接口,增加一个新的madivse选项,名称为madv_register_pid,并记录在内存区域的属性中,从linux操作系统的当前进程对应的内存对象中获取到当前进程的进程号,并为进程配置一个默认优先级;其中,默认优先级支持通过启动的命令行进行配置,未配置时默认为0;
24、初始化优先级队列的元素,并将进程描述符、虚拟内存区域以及优先级的信息保存到新的队列元素中,将新的队列元素插入到优先级队列中,并按照优先级排序:
25、若优先级相同,则按照内存区域大小降序排列。
26、作为优选,内核线程在进行ksm模块回收循环时,遍历优先级队列中插入的元素:
27、若优先级队列为空,则按照原逻辑遍历;
28、若优先级队列非空,则获取到当前优先级最高的元素,并获取到对应进程的描述符和虚拟内存区域;
29、在获取到进程对应的虚拟区域后,查看当前记录的虚拟内存位置:
30、若无记录位置,则使用虚拟机内存区域的起始内存地址,通过内核中提供的follow_page函数将虚拟地址转换为物理页,若当前的虚拟地址未映射到物理页面上,则说明虚拟机还未使用到对应页面,计算一个新的虚拟地址,公式如下:
31、addr=addr+page_size;
32、其中,addr表示需要检查的虚拟地址;page_size表示内核配置的页框中的地址的数量,一般有4kib和64kib等几个选择,可以在编译内核和指定。
33、更优地,当通过follow_page函数获取到一个可用的地址时,具体如下:
34、判断是否已经是ksm模块合并过的页面:
35、若已经是ksm模块合并过的页面,则遍历下一个页面,且不增加遍历次数;
36、若非已经合并过的页面,则判断当前页面内容是否全为零:
37、若当前页面是全零,则对应页面为零页,按照零页的逻辑合并对应内存页面,并将临时优先级变量加1;
38、若当前页面不是全零,则尝试将对应页面插入到稳定树中,并判断是否能够插入到稳定树中:
39、若对应页面插入到稳定树中,则将临时优先级减1;
40、若对应页面无法插入到稳定树中,则将临时优先级加1;
41、若连续的n个页面不能进行合并(这里的n是一个正整数,且可以在编译时配置),则将当前的临时优先级更新到当前队列元素的优先级中,并进行一次队列的重新排序,再退出当前扫描;
42、若连续遍历了m个页面(这里m时一个正整数,且可以在编译时配置,且需要保证m>n),则睡眠50ms,更新当前队列元素的优先级,进行一次队列的重新排序后退出本次扫描;
43、若扫描到虚拟机地址的边界,无剩余的地址可控扫描,则将当前元素的完整扫描次数属性增加1,并比较和w的关系,若大于w(w是一个正整数,可以编译时配置,默认值为3),则将对应元素从优先级队列中删除,并退出扫描;
44、退出扫描后,检查当前优先级队列中是否非空:
45、若非空,则获取优先级最大的元素并进行扫描。
46、作为优选,当内核进程退出时,检查进程内存区域的属性:
47、若对应内存区域配置过madv_register_pid特性,则遍历优先级队列,检查进程是否在优先级队列中有记录:
48、若没有记录,则退出;
49、若有,则从优先级队列中删除该元素,并释放内存。
50、作为优选,该方法还提供一个名称为madv_deregister_pid的madvise系统调用的选项,用于将给定的内存区域从优先级队列中删除,在优先级队列中清理元素不会主动释放被ksm模块压缩及聚合的内存区域,其可能的影响仅为降低了内存页合并的速度,即ksm服务仍以一种扫描所有注册内存的方式进行扫描。
51、作为优选,该方法提供madvise选项后,虚拟机管理器(如qemu)将虚拟机的匿名内存区域使用madv_register_pid选项进行配置,使得内核优先处理匿名内存区域,并在虚拟机启动的过程中,将零页和内容重复的页面进行合并。
52、其中,madvise是linux内核提供的系统调用(syscall),通过madvise系统调用,应用程序可以给予内核提示,使内核可以更好的处理应用程序的特定的地址区域。其目标是优化系统的内存使用。
53、一种电子设备,包括:存储器和至少一个处理器;
54、其中,所述存储器存储计算机执行指令;
55、所述至少一个处理器执行所述存储器存储的计算机执行指令,使得所述至少一个处理器执行如上述的基于linux的虚拟机内存优化方法。
56、一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行时,实现如上述的基于linux的虚拟机内存优化方法。
57、本发明的基于linux的虚拟机内存优化方法、设备及介质具有以下优点:
58、(一)本发明通过改进ksm的数据结构、优化ksm的处理流程,结合内存气球技术,在降低宿主机上交换内存使用的前提下,在宿主机上主动回收虚拟机中闲置内存,最终实现对计算节点宿主机配置更高的内存超配比,从而达到提高内存使用率的效果;其中,内存气球(memory ballooning)技术是一种动态回收和释放虚拟机内存的技术,通过在虚拟机内申请和释放内存实现虚拟机内内存的释放和增加;当宿主机的vmm需要虚拟机释放内存的时候,宿主机vmm将通过virtio协议等方式将需要释放的内存的容量通知虚拟机系统,虚拟机的气球设备则按照指定的容量申请内存,并将虚拟机物理地址(gpa)通知vmm;若vmm需要提供更多内存给虚拟机,则虚拟机可以释放其申请的内存,并通知vmm,vmm则需要将给定的gpa归还给虚拟机使用;
59、(二)本发明实现了优化ksm对windows虚拟机等特定进程的相同特征内存的回收速度;
60、(三)本发明降低了高并发创建windows虚拟机场景下的失败率和降低该场景下交换内存的使用率;
61、(四)本发明降低了宿主机上虚拟机进程的内存使用,主动释放虚拟机内的可用内存,提升宿主机上的内存超配比;
62、(五)本发明通过拓展操作系统madvise系统调用的实现,支持优先扫描新创建的虚拟机的虚拟内存区域,针对虚拟机启动时初始化内存、和对内存填零的情况,提前对零页进行回收,而不需要等待全局扫描;与社区原生的方式相比,支持了提前对新加入的内存区域的扫描,从而达到了在虚拟机启动的过程中对内存进行释放的效果,提高了并发创建windows虚拟机的成功率;由于释放了宿主机上的内存空间,一定程度上使得宿主机的内存可以进行一定的超配。
1.一种基于linux的虚拟机内存优化方法,其特征在于,该方法具体如下:
2.根据权利要求1所述的基于linux的虚拟机内存优化方法,其特征在于,将优先级队列引入到ksm模块中,优先级队列的每一个元素是一个结构体,该结构体包含五个属性,描述如下:
3.根据权利要求1所述的基于linux的虚拟机内存优化方法,其特征在于,扩展madivse系统的linux接口,增加一个新的madivse选项,名称为madv_register_pid,并记录在内存区域的属性中,从linux操作系统的当前进程对应的内存对象中获取到当前进程的进程号,并为进程配置一个默认优先级;其中,默认优先级支持通过启动的命令行进行配置,未配置时默认为0;
4.根据权利要求1所述的基于linux的虚拟机内存优化方法,其特征在于,内核线程在进行ksm模块回收循环时,遍历优先级队列中插入的元素:
5.根据权利要求4所述的基于linux的虚拟机内存优化方法,其特征在于,当通过follow_page函数获取到一个可用的地址时,具体如下:
6.根据权利要求1所述的基于linux的虚拟机内存优化方法,其特征在于,当内核进程退出时,检查进程内存区域的属性:
7.根据权利要求1所述的基于linux的虚拟机内存优化方法,其特征在于,该方法还提供一个名称为madv_deregister_pid的madvise系统调用的选项,用于将给定的内存区域从优先级队列中删除。
8.根据权利要求1所述的基于linux的虚拟机内存优化方法,其特征在于,该方法提供madvise选项后,虚拟机管理器将虚拟机的匿名内存区域使用madv_register_pid选项进行配置,使得内核优先处理匿名内存区域,并在虚拟机启动的过程中,将零页和内容重复的页面进行合并。
9.一种电子设备,其特征在于,包括:存储器和至少一个处理器;
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行时,实现如权利要求1至8中任一所述的基于linux的虚拟机内存优化方法。
