CN115408105A - 一种缺页异常处理方法、装置、设备及存储介质 - Google Patents
一种缺页异常处理方法、装置、设备及存储介质 Download PDFInfo
- Publication number
- CN115408105A CN115408105A CN202211025832.XA CN202211025832A CN115408105A CN 115408105 A CN115408105 A CN 115408105A CN 202211025832 A CN202211025832 A CN 202211025832A CN 115408105 A CN115408105 A CN 115408105A
- Authority
- CN
- China
- Prior art keywords
- page
- memory
- idle
- virtual machine
- target
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 166
- 230000015654 memory Effects 0.000 claims abstract description 435
- 230000008569 process Effects 0.000 claims abstract description 114
- 230000001960 triggered effect Effects 0.000 claims abstract description 47
- 238000012545 processing Methods 0.000 claims abstract description 35
- 238000013507 mapping Methods 0.000 claims abstract description 14
- 230000007246 mechanism Effects 0.000 claims description 18
- 230000006870 function Effects 0.000 claims description 14
- 230000004044 response Effects 0.000 claims description 3
- 238000010586 diagram Methods 0.000 description 7
- 238000004891 communication Methods 0.000 description 6
- 230000009471 action Effects 0.000 description 3
- 230000005540 biological transmission Effects 0.000 description 3
- 230000000694 effects Effects 0.000 description 3
- 238000012546 transfer Methods 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 2
- 230000005856 abnormality Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 230000000750 progressive effect Effects 0.000 description 1
- 230000001052 transient effect Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/07—Responding to the occurrence of a fault, e.g. fault tolerance
- G06F11/0703—Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation
- G06F11/0706—Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment
- G06F11/0712—Error or fault processing not based on redundancy, i.e. by taking additional measures to deal with the error or fault not making use of redundancy in operation, in hardware, or in data representation the processing taking place on a specific hardware platform or in a specific software environment in a virtual computing platform, e.g. logically partitioned systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45583—Memory management, e.g. access or allocation
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Mathematical Physics (AREA)
- Quality & Reliability (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
本申请公开了一种缺页异常处理方法、装置、设备及存储介质,涉及计算机技术领域,包括:在目标虚拟机的目标进程启动的过程中,判断当前是否触发缺页异常;若当前触发缺页异常,则针对目标虚拟机是否使用标准大页的情况从不同的存储空间上获取空闲内存页,并判断空闲内存页是否设置有已清零标记;如果空闲内存页已设置有已清零标记,则跳过内存页清零操作,并利用空闲内存页为目标进程的虚拟内存映射物理内存。本申请通过将空闲内存页提前清零并设置相关的已清零标记,在缺页异常发生时,判断获取到空闲内存页是否设置有已清零标记,若设置有,则说明该空闲内存页已清零,从而降低虚拟机启动过程中触发的缺页执行时间,提升虚拟机的启动速度。
Description
技术领域
本发明涉及计算机技术领域,特别涉及一种缺页异常处理方法、装置、设备及存储介质。
背景技术
当前,为了在虚拟机中获取更好的硬件性能,会将物理设备透传到虚拟机内部,比如通过VFIO((Virtual Function I/O,即I/O虚拟化)技术将GPU(Graphics ProcessingUnit,图形处理器)、网卡设备透传到虚拟机内部后,可以在虚拟机上获得GPU、网卡在HOST(即主机)上相当的性能。并且现在一般也会为虚拟机指定比较大的内存,这就会导致添加了IO透传设备的虚拟机启动时间会比未添加IO透传设备的虚拟机启动时间明显增加,比如同样是分配了1TB内存的虚拟机,做了GPU透传的虚拟机启动时间会比未做GPU透传的虚拟机启动时间延长数分钟,这在一些对虚拟机启动时间比较敏感的场景严重影响了用户体验。由于虚拟机内的物理地址就是QEMU(即模拟处理器)进程申请的一块虚拟地址,为了让虚拟机内部的驱动进程每次访问相同的内存时能够映射到相同的物理地址,QEMU为虚拟机分配的整个内存进行了iommu map操作,这个过程会对为虚拟机分配的整个虚拟内存进行pin操作,然后再对虚拟内存和物理内存进行iommu map,其中,所述iommu的功能和cpu的mmu功能类似,iommu可以在设备发生DMA(Direct Memory Access,直接存储器访问)时将设备访问的地址转换为内存地址,所述pin操作也即将虚拟内存和物理内存的关系进行绑定,使虚拟内存对应的物理内存不会因为内存回收、迁移而发生改变,在此过程如果虚拟地址未映射物理地址则会触发缺页,比如虚拟机内存大小为1TB,则QEMU进程会对这1TB内存执行pin操作,在pin的过程中会触发缺页为虚拟内存分配物理内存,然而在缺页过程中存在一个非常耗时的操作就是内存的清零,所以在pin内存的过程中执行内存页的清零是导致虚拟机启动时间延长的重要原因,也就是说,将物理设备透传到虚拟机内部,需要让虚拟机内部的驱动进程每次访问相同的内存时能够映射到相同的物理地址,所以可以在为虚拟机分配内存时,进行iommu map操作,在进行这个操作的时候,需要先对虚拟机分配的内存进行pin,在pin过程中又会触发缺页为虚拟机内存分配物理内存,缺页过程中存在内存清零的操作,该操作又十分耗时,所以导致虚拟机启动时间延长。
发明内容
有鉴于此,本发明的目的在于提供一种缺页异常处理方法、装置、设备及存储介质,能够降低虚拟机启动过程中触发的缺页执行时间,从而提升虚拟机的启动速度。其具体方案如下:
第一方面,本申请公开了一种缺页异常处理方法,包括:
在目标虚拟机的目标进程启动的过程中,判断当前是否触发缺页异常;
若当前触发所述缺页异常,则针对所述目标虚拟机是否使用标准大页的情况从不同的存储空间上获取空闲内存页,并判断所述空闲内存页是否设置有已清零标记;
如果所述空闲内存页已设置有所述已清零标记,则跳过内存页清零操作,并利用所述空闲内存页为所述目标进程的虚拟内存映射物理内存。
可选的,所述判断当前是否触发缺页异常之前,还包括:
针对所述目标虚拟机未使用标准大页的情况,利用Linux内核的空闲页跟踪机制按照第一预设周期对获取到的Buddy内存中的空闲内存页执行预清零操作,并在所述空闲内存页对应的目标标志位上设置相应的已清零标记;
相应的,所述针对所述目标虚拟机是否使用标准大页的情况从不同的存储空间上获取空闲内存页,并判断所述空闲内存页是否设置有已清零标记,包括:
针对所述目标虚拟机未使用标准大页的情况,若当前触发所述缺页异常,则从所述Buddy内存中获取所述空闲内存页,并判断所述空闲内存页对应的所述目标标志位上是否设置有所述已清零标记。
可选的,所述利用Linux内核的空闲页跟踪机制按照第一预设周期对获取到的Buddy内存中的空闲内存页执行预清零操作,包括:
基于Linux内核的空闲页跟踪机制注册空闲页清零处理函数;
通过所述空闲页跟踪机制按照第一预设周期获取Buddy内存中的空闲内存块对应的各空闲内存页;
利用所述空闲页清零处理函数对各所述空闲内存页执行预清零操作。
可选的,所述判断当前是否触发缺页异常之前,还包括:
针对所述目标虚拟机使用标准大页的情况,通过创建的内核线程按照第二预设周期对获取到的大页内存池中的空闲大页内存执行预清零操作,并在所述空闲大页内存对应的目标标志位上设置相应的已清零标记;
相应的,所述针对所述目标虚拟机是否使用标准大页的情况从不同的存储空间上获取空闲内存页,并判断所述空闲内存页是否设置有已清零标记,包括:
针对所述目标虚拟机使用标准大页的情况,若当前触发所述缺页异常,则从所述大页内存池中获取所述空闲大页内存,并判断所述空闲大页内存对应的所述目标标志位上是否设置有所述已清零标记。
可选的,所述通过创建的内核线程按照第二预设周期对获取到的大页内存池中的空闲大页内存执行预清零操作,包括:
通过创建的内核线程按照第二预设周期判断当前大页内存池中是否存在空闲大页内存;
如果当前所述大页内存池中存在所述空闲大页内存,则获取所述空闲大页内存,并对所述空闲大页内存对应的各空闲内存页执行预清零操作。
可选的,所述通过创建的内核线程按照第二预设周期判断当前大页内存池中是否存在空闲大页内存之前,包括:
判断当前是否存在进程正在缺页异常中申请当前所述大页内存池中的大页内存;
如果当前不存在所述进程正在缺页异常中申请当前所述大页内存池中的所述大页内存,则触发执行所述通过创建的内核线程按照第二预设周期判断当前大页内存池中是否存在空闲大页内存的步骤;
如果当前存在所述进程正在缺页异常中申请当前所述大页内存池中的所述大页内存,则等待预设时间后重新执行所述判断当前是否存在进程正在缺页异常中申请当前所述大页内存池中的大页内存的步骤,直至当前不存在所述进程正在缺页异常中申请当前所述大页内存池中的所述大页内存。
可选的,所述获取所述空闲大页内存之后,还包括:
对所述空闲大页内存的目标状态设置为1;
相应的,所述对所述空闲大页内存对应的各空闲内存页执行预清零操作之后,还包括:
将所述空闲大页内存的所述目标状态设置为0。
第二方面,本申请公开了一种缺页异常处理装置,包括:
第一判断模块,用于在目标虚拟机的目标进程启动的过程中,判断当前是否触发缺页异常;
空闲页获取模块,用于在当前触发所述缺页异常时,则针对所述目标虚拟机是否使用标准大页的情况从不同的存储空间上获取空闲内存页;
第二判断模块,用于判断所述空闲内存页是否设置有已清零标记;
内存清零控制模块,用于在所述空闲内存页已设置有所述已清零标记时,则跳过内存页清零操作,并利用所述空闲内存页为所述目标进程的虚拟内存映射物理内存。
第三方面,本申请公开了一种电子设备,包括:
存储器,用于保存计算机进程;
处理器,用于执行所述计算机进程,以实现前述公开的缺页异常处理方法的步骤。
第四方面,本申请公开了一种计算机可读存储介质,用于存储计算机进程;其中,所述计算机进程被处理器执行时实现前述公开的缺页异常处理方法的步骤。
可见,本申请提供了一种缺页异常处理方法,包括:在目标虚拟机的目标进程启动的过程中,判断当前是否触发缺页异常;若当前触发所述缺页异常,则针对所述目标虚拟机是否使用标准大页的情况从不同的存储空间上获取空闲内存页,并判断所述空闲内存页是否设置有已清零标记;如果所述空闲内存页已设置有所述已清零标记,则跳过内存页清零操作,并利用所述空闲内存页为所述目标进程的虚拟内存映射物理内存。由此可知,本申请通过将空闲内存页提前清零并设置相关的已清零标记,当发生缺页异常为目标进程的虚拟内存映射分配物理内存时,则可以先判断获取到空闲内存页是否设置有已清零标记,若该空闲内存页设置有所述已清零标记,就能够在虚拟机启动的过程中避免进行耗时较长的内存页清零操作,从而能够降低虚拟机启动过程中触发的缺页执行时间,提升虚拟机的启动速度。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本申请公开的一种缺页异常处理方法流程图;
图2为本申请公开的一种struct page数据结构示意图;
图3为本申请公开的一种具体的缺页异常处理方法流程图;
图4为本申请公开的一种具体的空闲内存页预清零方法流程图;
图5为本申请公开的一种空闲内存页遍历方式示意图;
图6为本申请公开的一种具体的缺页异常处理方法流程图;
图7为本申请公开的另一种具体的内存页预清零方法流程图;
图8为本申请公开的一种具体的缺页异常处理方法流程图;
图9为本申请公开的一种缺页异常处理装置结构示意图;
图10为本申请公开的一种电子设备结构图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
当前,为了在虚拟机中获取更好的硬件性能,会将物理设备透传到虚拟机内部,但是将物理设备透传到虚拟机内部之后,在虚拟机启动时为了使虚拟机内部的驱动进程每次访问相同的内存时能够映射到相同的物理地址,需要对分配的整个内存进行pin操作,然后再对虚拟内存和物理内存进行iommu map,在pin操作过程中会触发缺页,然而缺页过程中存在一个十分耗时的内存清零操作,该操作十分耗时,从而会导致虚拟机的启动时间增加。为此,本申请提供了一种缺页异常处理方案,能够降低虚拟机启动过程中触发的缺页执行时间,从而提升虚拟机的启动速度。
本发明实施例公开了一种缺页异常处理方法,参见图1所示,该方法包括:
步骤S11:在目标虚拟机的目标进程启动的过程中,判断当前是否触发缺页异常。
本实施例中,缺页异常是在pin过程中发生的异常,其中,在QEMU(模拟处理器)为虚拟机分配的整个内存进行了iommu map操作时就会对为虚拟机分配的整个虚拟内存进行pin操作,所以在目标虚拟机的目标进程启动的过程,为了使虚拟机内部的驱动进程每次访问相同的内存时能够映射到相同的物理地址,QEMU就会为虚拟机分配的整个内存进行所述iommu map操作,所以在支持IO透传设备的虚拟机的QEMU进程启动时会触发内存的pin操作时,判断当前是否触发缺页异常。需要指出的是,应用程序在分配内存时,比如调用mmap申请内存时,只是为应用程序分配了虚拟内存,只有程序在访问申请的内存时内核才会触发缺页异常,此时才会为应用程序的虚拟内存映射物理内存。
步骤S12:若当前触发所述缺页异常,则针对所述目标虚拟机是否使用标准大页的情况从不同的存储空间上获取空闲内存页,并判断所述空闲内存页是否设置有已清零标记。
需要指出的是,空闲内存分为两种情况,一种是在buddy中的空闲内存,程序使用的普通内存和透明大页内存都是在buddy内存中申请的,另一种是在大页内存池中的空闲内存,当使用标准大页时会在大页内存池中申请。其中,大页,即页面是Linux管理内存的基本单位,X86架构下一般为4KB,但也可以使用2M/1G的大页,使用大页的好处是能增加TLB的命中,提升内存访问性能,使用所述标准大页时需要先从系统中申请一定数量的物理地址连续的普通页存放到大页内存池中,后续程序在使用标准大页时就可以在大页内存池中申请。由于标准大页需要进行预分配,并且需要修改应用程序的内存分配接口,使用受到限制,所述透明大页就是在程序使用内存时在内核发生缺页时透明的为虚拟地址映射大页内存。在buddy内存管理系统中,所有物理内存都在buddy中分配,分配的内存为物理连续,在x86架构下最大可以从buddy中分配4M大小的内存。
本实施例中,预先将系统的空闲内存页提前清零并在所述空闲内存页上设置相应的已清零标记,而且为了降低内存预清零操作对系统性能的影响,只有CPU在空闲时才执行,所以在支持IO透传设备的虚拟机的QEMU进程启动时会触发内存的pin操作,进而进入缺页异常,在内核发生缺页异常进行申请物理内存时,即当前触发所述缺页异常为QEMU进程的虚拟内存分配物理内存时,则针对所述目标虚拟机是否使用标准大页的情况从系统空闲内存的链表上获取到空闲内存页后,并判断所述空闲内存页是否设置有已清零标记。例如,struct page数据结构是内核中用来描述一个内存页的,其中page->flags用来标记page的状态,添加一个新的标记用来标识当前内存页是否被清零,即当page->flags的PG_clean位被置1说明当前内存页已被清零,未被置1则说明当前内存页未被清零,相关的代码表示如下:
其中,如果需要提前清零的内存页为标准大页时,则将该标准大页的首个page数据结构中的flags用来标识整个标准大页是否被清零,如图2所示,2M的标准大页使用首个page中的flags来标识该标准大页是否被清零。
步骤S13:如果所述空闲内存页已设置有所述已清零标记,则跳过内存页清零操作,并利用所述空闲内存页为所述目标进程的虚拟内存映射物理内存。
本实施例中,在判断所述空闲内存页是否设置有所述已清零标记时,如果所述空闲内存页已设置有所述已清零标记,说明该空闲内存页已经被提前清零,直接跳过针对所述空间内存页的内存页清零操作,直接进行物理内存的申请,也即,利用所述空闲内存页为所述目标进程的虚拟内存映射物理内存,从而减少缺页异常的处理时间。
可见,本申请实施例中,通过将空闲内存页提前清零并设置相关的已清零标记,当发生缺页异常为目标进程的虚拟内存映射分配物理内存时,则可以先判断获取到空闲内存页是否设置有已清零标记,若该空闲内存页设置有所述已清零标记,就能够在虚拟机启动的过程中避免进行耗时较长的内存页清零操作,从而能够降低虚拟机启动过程中触发的缺页执行时间,可以有效降低支持设备透传的虚拟机的启动时间,提升虚拟机的启动速度,尤其是虚拟机配置了大容量内存的情况下效果更为明显,本申请的技术方案还可以应用于虚拟化场景下用户对虚拟机启动时间敏感的场景。
参见图3所示,本发明实施例公开了一种具体的缺页异常处理方法,相较于上一实施例,本实施例对技术方案作了进一步的说明和优化。
步骤S21:在目标虚拟机的目标进程启动的过程中,判断当前是否触发缺页异常。
步骤S22:针对所述目标虚拟机未使用标准大页的情况,若当前触发所述缺页异常,则从所述Buddy内存中获取所述空闲内存页,并判断所述空闲内存页对应的所述目标标志位上是否设置有所述已清零标记。
需要指出的是,针对buddy中的空闲内存的预清零,具体可以包括:针对所述目标虚拟机未使用标准大页的情况,利用Linux内核的空闲页跟踪机制按照第一预设周期对获取到的Buddy内存中的空闲内存页执行预清零操作,并在所述空闲内存页对应的目标标志位上设置相应的已清零标记。可以理解的是,基于Linux内核的空闲页跟踪机制注册空闲页清零处理函数;通过所述空闲页跟踪机制按照第一预设周期获取Buddy内存中的空闲内存块对应的各空闲内存页;利用所述空闲页清零处理函数对各所述空闲内存页执行预清零操作。例如,如图4所示,通过内核free page reporting机制(即空闲页跟踪机制)注册空闲页清零处理函数clean_free_page,所述内核free page reporting机制每隔2秒遍历指定阶及以上的空闲内存,其中,所述Free page reporting:即为Linux内核中的空闲页跟踪机制,根据该空闲跟踪机制可以周期性的将内核中未使用的页上报给调用者,调用者根据自身需求对空闲页进行处理。例如,如图5所示,在X86架构下只遍历buddy中2的9次方和2的10次方的内存页,即只遍历2M和4M的内存区域,然后将每块内存从空闲链表摘下并调用clean_free_page函数,所述内核clean_free_page函数对每个内存块里的每个内存页执行预清零操作,比如,10阶内存需要将每个内存块对应的1024个内存页进行清零,并在清零之后,设置page的flag为PG_clean。而且由于内存页清零操作相比于系统中的其它程序优先级较低,所以为了不影响系统中其它业务程序的运行,每处理完一个内存块之后都将让出CPU试让其它业务程序执行。
本实施例中,针对所述目标虚拟机使用标准大页的情况,由于已经预先对Buddy内存中的空闲页执行预清零处理,所以在支持IO透传设备的虚拟机的QEMU进程启动时会触发内存的pin操作,进而进入缺页异常,在内核发生缺页异常进行申请物理内存时,即当前触发所述缺页异常,则从所述Buddy内存中获取所述空闲内存页,并判断所述空闲内存页对应的所述目标标志位上是否设置有所述已清零标记。
步骤S23:如果所述空闲内存页已设置有所述已清零标记,则跳过内存页清零操作,并利用所述空闲内存页为所述目标进程的虚拟内存映射物理内存。
关于上述步骤S21以及步骤S23的具体内容可以参考前述实施例中公开的相应内容,在此不再进行赘述。
可见,本申请实施例中,通过将空闲内存页提前清零并设置相关的已清零标记,当发生缺页异常为目标进程的虚拟内存映射分配物理内存时,则可以先判断获取到空闲内存页是否设置有已清零标记,若该空闲内存页设置有所述已清零标记,就能够在虚拟机启动的过程中避免进行耗时较长的内存页清零操作,从而能够降低虚拟机启动过程中触发的缺页执行时间,可以有效降低支持设备透传的虚拟机的启动时间,提升虚拟机的启动速度,尤其是虚拟机配置了大容量内存的情况下效果更为明显,本申请的技术方案还可以应用于虚拟化场景下用户对虚拟机启动时间敏感的场景。
参见图6所示,本发明实施例公开了一种具体的缺页异常处理方法,相较于上一实施例,本实施例对技术方案作了进一步的说明和优化。
步骤S31:在目标虚拟机的目标进程启动的过程中,判断当前是否触发缺页异常。
步骤S32:针对所述目标虚拟机使用标准大页的情况,若当前触发所述缺页异常,则从所述大页内存池中获取所述空闲大页内存,并判断所述空闲大页内存对应的所述目标标志位上是否设置有所述已清零标记。
需要指出的是,针对大页内存池中的空闲内存的预清零,具体可以包括:针对所述目标虚拟机使用标准大页的情况,通过创建的内核线程按照第二预设周期对获取到的大页内存池中的空闲大页内存执行预清零操作,并在所述空闲大页内存对应的目标标志位上设置相应的已清零标记。可以理解的是,通过创建的内核线程按照第二预设周期判断当前大页内存池中是否存在空闲大页内存;如果当前所述大页内存池中存在所述空闲大页内存,则获取所述空闲大页内存,并对所述空闲大页内存对应的各空闲内存页执行预清零操作。而且在所述通过创建的内核线程按照第二预设周期判断当前大页内存池中是否存在空闲大页内存之前,还可以包括:判断当前是否存在进程正在缺页异常中申请当前所述大页内存池中的大页内存;如果当前不存在所述进程正在缺页异常中申请当前所述大页内存池中的所述大页内存,则触发执行所述通过创建的内核线程按照第二预设周期判断当前大页内存池中是否存在空闲大页内存的步骤;如果当前存在所述进程正在缺页异常中申请当前所述大页内存池中的所述大页内存,则等待预设时间后重新执行所述判断当前是否存在进程正在缺页异常中申请当前所述大页内存池中的大页内存的步骤,直至当前不存在所述进程正在缺页异常中申请当前所述大页内存池中的所述大页内存。在所述获取所述空闲大页内存之后,还包括:对所述空闲大页内存的目标状态设置为1;相应的,所述对所述空闲大页内存对应的各空闲内存页执行预清零操作之后,还包括:将所述空闲大页内存的所述目标状态设置为0。可以理解的是,在将一个空闲大页内存从空闲链表中取下时,首先设置HUGEPAGE_CLEANING状态为1,执行完清零操作再次添加到链表上时设置HUGEPAGE_CLEANING状态为0。例如,如图7所示,在初始化阶段为每一个大页内存池创建一个内核线程,所述内核线程用来轮询将空闲大页内存清零,比如,在X86架构上需要为2M大页和1G大页创建两个内核线程,并且该内核线程每隔N1秒判断当前大页内存池是否存在空闲内存页,如果当前大页内存池存在空闲内存页,则从空闲链表上将空闲内存页逐个取下,然后将大页内存对应的每个内存页清零并为该空闲内存页设置首个page的flags为PG_clean。与buddy中的空闲内存预清零一样,大页内存池中的空闲内存预清零操作相比于其它业务程序优先级较低,所以每处理完一个内存块之后也需要让出CPU尝试让其它业务程序执行。而且为了不影响程序申请大页内存,每次轮询开始需要判断当前是否有程序正在缺页中申请大页内存,如果当前有程序正在缺页中申请大页内存,则等待N2秒再次判断当前是否有程序正在缺页中申请大页内存,直到没有查询到当前没有程序正在缺页中申请大页内存。这样做的目的是为了正在进行内存页清零的过程中,如果有一个程序开始申请大页内存而可用的大页内存不足时,需要等待将正在清零的大页内存返回给大页内存池。
步骤S33:如果所述空闲内存页已设置有所述已清零标记,则跳过内存页清零操作,并利用所述空闲内存页为所述目标进程的虚拟内存映射物理内存。
关于上述步骤S31以及步骤S33的具体内容可以参考前述实施例中公开的相应内容,在此不再进行赘述。
可见,本申请实施例中,通过将空闲内存页提前清零并设置相关的已清零标记,当发生缺页异常为目标进程的虚拟内存映射分配物理内存时,则可以先判断获取到空闲内存页是否设置有已清零标记,若该空闲内存页设置有所述已清零标记,就能够在虚拟机启动的过程中避免进行耗时较长的内存页清零操作,从而能够降低虚拟机启动过程中触发的缺页执行时间,可以有效降低支持设备透传的虚拟机的启动时间,提升虚拟机的启动速度,尤其是虚拟机配置了大容量内存的情况下效果更为明显,本申请的技术方案还可以应用于虚拟化场景下用户对虚拟机启动时间敏感的场景。
例如,针对于虚拟机未使用标准大页时的缺页异常处理:从buddy中获取了一个未使用的空闲页判断所述空闲页的flags是否设置了PG_clean标记,如果所述空闲页的flags设置了PG_clean标记,则跳过页清零操作,从而减少缺页异常的处理时间,否则执行相应的页清零操作。如图8所示,针对于虚拟机使用标准大页时的缺页异常处理:进入大页内存的缺页异常处理函数,也即从大页内存池中获取了一个未使用的空闲大页,判断该空闲大页首个page的flags是否设置了PG_clean标记,如果该空闲大页首个page的flags设置了PG_clean标记,则跳过页清零操作,否则执行相应的页清零操作,并且在进程进入缺页异常申请大页内存时,可以将hugepage_allocating计数加1,退出时将hugepage_allocating计数减1,这样内存清零内核线程可以通过hugepage_allocating判断出是否有进程正在申请大页内存,如果申请大页内存时发现大页内存不足,则判断HUGEPAGE_CLEANING状态是否为1,如果HUGEPAGE_CLEANING状态为1,则等待HUGEPAGE_CLEANING状态为0时再次尝试申请大页内存。也就是说,为了不影响大页内存的申请,只有在没有程序申请大页内存时才执行大页内存的清零操作,并且会在程序申请不到大页内存时等待内存预清零操作执行完成后再次尝试申请大页内存。
相应的,本申请实施例还公开了一种缺页异常处理装置,参见图9所示,该装置包括:
第一判断模块11,用于在目标虚拟机的目标进程启动的过程中,判断当前是否触发缺页异常;
空闲页获取模块12,用于在当前触发所述缺页异常时,则针对所述目标虚拟机是否使用标准大页的情况从不同的存储空间上获取空闲内存页;
第二判断模块13,用于判断所述空闲内存页是否设置有已清零标记;
内存清零控制模块14,用于在所述空闲内存页已设置有所述已清零标记时,则跳过内存页清零操作,并利用所述空闲内存页为所述目标进程的虚拟内存映射物理内存。
由上可见,本申请实施例中,通过将空闲内存页提前清零并设置相关的已清零标记,当发生缺页异常为目标进程的虚拟内存映射分配物理内存时,则可以先判断获取到空闲内存页是否设置有已清零标记,若该空闲内存页设置有所述已清零标记,就能够在虚拟机启动的过程中避免进行耗时较长的内存页清零操作,从而能够降低虚拟机启动过程中触发的缺页执行时间,提升虚拟机的启动速度。
在一些具体的实施例中,所述缺页异常处理装置,具体可以包括:
第一预清零模块,用于针对所述目标虚拟机未使用标准大页的情况,利用Linux内核的空闲页跟踪机制按照第一预设周期对获取到的Buddy内存中的空闲内存页执行预清零操作,并在所述空闲内存页对应的目标标志位上设置相应的已清零标记;
在一些具体的实施例中,所述空闲页获取模块12,具体可以包括:
第一空闲页获取单元,用于针对所述目标虚拟机未使用标准大页的情况,若当前触发所述缺页异常,则从所述Buddy内存中获取所述空闲内存页;
在一些具体的实施例中,所述第二判断模块13,具体可以包括:
第一标记判断单元,用于判断所述空闲内存页对应的所述目标标志位上是否设置有所述已清零标记。
在一些具体的实施例中,所述第一预清零模块,具体可以包括:
函数注册单元,用于基于Linux内核的空闲页跟踪机制注册空闲页清零处理函数;
第二空闲页获取单元,用于通过所述空闲页跟踪机制按照第一预设周期获取Buddy内存中的空闲内存块对应的各空闲内存页;
第一预清零单元,用于利用所述空闲页清零处理函数对各所述空闲内存页执行预清零操作。
在一些具体的实施例中,所述缺页异常处理装置,具体可以包括:
第二预清零模块,用于针对所述目标虚拟机使用标准大页的情况,通过创建的内核线程按照第二预设周期对获取到的大页内存池中的空闲大页内存执行预清零操作,并在所述空闲大页内存对应的目标标志位上设置相应的已清零标记;
在一些具体的实施例中,所述空闲页获取模块12,具体可以包括:
第三空闲页获取单元,用于针对所述目标虚拟机使用标准大页的情况,若当前触发所述缺页异常,则从所述大页内存池中获取所述空闲大页内存;
第二标记判断单元,用于判断所述空闲大页内存对应的所述目标标志位上是否设置有所述已清零标记。
在一些具体的实施例中,所述第二预清零模块,具体可以包括:
内存判断单元,用于通过创建的内核线程按照第二预设周期判断当前大页内存池中是否存在空闲大页内存;
第四空闲页获取单元,用于在当前所述大页内存池中存在所述空闲大页内存时,则获取所述空闲大页内存,并对所述空闲大页内存对应的各空闲内存页执行预清零操作。
在一些具体的实施例中,所述通过创建的内核线程按照第二预设周期判断当前大页内存池中是否存在空闲大页内存之前,具体可以包括:
内存申请判断单元,用于判断当前是否存在进程正在缺页异常中申请当前所述大页内存池中的大页内存;
步骤触发单元,用于在当前不存在所述进程正在缺页异常中申请当前所述大页内存池中的所述大页内存时,则触发执行所述通过创建的内核线程按照第二预设周期判断当前大页内存池中是否存在空闲大页内存的步骤;
步骤重新执行单元,用于在当前存在所述进程正在缺页异常中申请当前所述大页内存池中的所述大页内存时,则等待预设时间后重新执行所述判断当前是否存在进程正在缺页异常中申请当前所述大页内存池中的大页内存的步骤,直至当前不存在所述进程正在缺页异常中申请当前所述大页内存池中的所述大页内存。
在一些具体的实施例中,所述获取所述空闲大页内存之后,具体可以包括:
第一状态设置单元,用于对所述空闲大页内存的目标状态设置为1;
在一些具体的实施例中,所述对所述空闲大页内存对应的各空闲内存页执行预清零操作之后,具体可以包括:
第二状态设置单元,用于将所述空闲大页内存的所述目标状态设置为0。
进一步的,本申请实施例还提供了一种电子设备。图10是根据一示例性实施例示出的电子设备20结构图,图中的内容不能认为是对本申请的使用范围的任何限制。
图10为本申请实施例提供的一种电子设备20的结构示意图。该电子设备20,具体可以包括:至少一个处理器21、至少一个存储器22、电源23、通信接口24、输入输出接口25和通信总线26。其中,所述存储器22用于存储计算机进程,所述计算机进程由所述处理器21加载并执行,以实现前述任一实施例公开的缺页异常处理方法中的相关步骤。另外,本实施例中的电子设备20具体可以为电子计算机。
本实施例中,电源23用于为电子设备20上的各硬件设备提供工作电压;通信接口24能够为电子设备20创建与外界设备之间的数据传输通道,其所遵循的通信协议是能够适用于本申请技术方案的任意通信协议,在此不对其进行具体限定;输入输出接口25,用于获取外界输入数据或向外界输出数据,其具体的接口类型可以根据具体应用需要进行选取,在此不进行具体限定。
另外,存储器22作为资源存储的载体,可以是只读存储器、随机存储器、磁盘或者光盘等,其上所存储的资源可以包括操作系统221、计算机进程222等,存储方式可以是短暂存储或者永久存储。
其中,操作系统221用于管理与控制电子设备20上的各硬件设备以及计算机进程222,其可以是Windows Server、Netware、Unix、Linux等。计算机进程222除了包括能够用于完成前述任一实施例公开的由电子设备20执行的缺页异常处理方法的计算机进程之外,还可以进一步包括能够用于完成其他特定工作的计算机进程。
进一步的,本申请实施例还公开了一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机进程,所述计算机进程被处理器加载并执行时,实现前述任一实施例公开的缺页异常处理方法步骤。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上对本发明所提供的一种缺页异常处理方法、装置、设备及存储介质进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
Claims (10)
1.一种缺页异常处理方法,其特征在于,包括:
在目标虚拟机的目标进程启动的过程中,判断当前是否触发缺页异常;
若当前触发所述缺页异常,则针对所述目标虚拟机是否使用标准大页的情况从不同的存储空间上获取空闲内存页,并判断所述空闲内存页是否设置有已清零标记;
如果所述空闲内存页已设置有所述已清零标记,则跳过内存页清零操作,并利用所述空闲内存页为所述目标进程的虚拟内存映射物理内存。
2.根据权利要求1所述的缺页异常处理方法,其特征在于,所述判断当前是否触发缺页异常之前,还包括:
针对所述目标虚拟机未使用标准大页的情况,利用Linux内核的空闲页跟踪机制按照第一预设周期对获取到的Buddy内存中的空闲内存页执行预清零操作,并在所述空闲内存页对应的目标标志位上设置相应的已清零标记;
相应的,所述针对所述目标虚拟机是否使用标准大页的情况从不同的存储空间上获取空闲内存页,并判断所述空闲内存页是否设置有已清零标记,包括:
针对所述目标虚拟机未使用标准大页的情况,若当前触发所述缺页异常,则从所述Buddy内存中获取所述空闲内存页,并判断所述空闲内存页对应的所述目标标志位上是否设置有所述已清零标记。
3.根据权利要求2所述的缺页异常处理方法,其特征在于,所述利用Linux内核的空闲页跟踪机制按照第一预设周期对获取到的Buddy内存中的空闲内存页执行预清零操作,包括:
基于Linux内核的空闲页跟踪机制注册空闲页清零处理函数;
通过所述空闲页跟踪机制按照第一预设周期获取Buddy内存中的空闲内存块对应的各空闲内存页;
利用所述空闲页清零处理函数对各所述空闲内存页执行预清零操作。
4.根据权利要求1至3任一项所述的缺页异常处理方法,其特征在于,所述判断当前是否触发缺页异常之前,还包括:
针对所述目标虚拟机使用标准大页的情况,通过创建的内核线程按照第二预设周期对获取到的大页内存池中的空闲大页内存执行预清零操作,并在所述空闲大页内存对应的目标标志位上设置相应的已清零标记;
相应的,所述针对所述目标虚拟机是否使用标准大页的情况从不同的存储空间上获取空闲内存页,并判断所述空闲内存页是否设置有已清零标记,包括:
针对所述目标虚拟机使用标准大页的情况,若当前触发所述缺页异常,则从所述大页内存池中获取所述空闲大页内存,并判断所述空闲大页内存对应的所述目标标志位上是否设置有所述已清零标记。
5.根据权利要求4所述的缺页异常处理方法,其特征在于,所述通过创建的内核线程按照第二预设周期对获取到的大页内存池中的空闲大页内存执行预清零操作,包括:
通过创建的内核线程按照第二预设周期判断当前大页内存池中是否存在空闲大页内存;
如果当前所述大页内存池中存在所述空闲大页内存,则获取所述空闲大页内存,并对所述空闲大页内存对应的各空闲内存页执行预清零操作。
6.根据权利要求5所述的缺页异常处理方法,其特征在于,所述通过创建的内核线程按照第二预设周期判断当前大页内存池中是否存在空闲大页内存之前,包括:
判断当前是否存在进程正在缺页异常中申请当前所述大页内存池中的大页内存;
如果当前不存在所述进程正在缺页异常中申请当前所述大页内存池中的所述大页内存,则触发执行所述通过创建的内核线程按照第二预设周期判断当前大页内存池中是否存在空闲大页内存的步骤;
如果当前存在所述进程正在缺页异常中申请当前所述大页内存池中的所述大页内存,则等待预设时间后重新执行所述判断当前是否存在进程正在缺页异常中申请当前所述大页内存池中的大页内存的步骤,直至当前不存在所述进程正在缺页异常中申请当前所述大页内存池中的所述大页内存。
7.根据权利要求5所述的缺页异常处理方法,其特征在于,所述获取所述空闲大页内存之后,还包括:
对所述空闲大页内存的目标状态设置为1;
相应的,所述对所述空闲大页内存对应的各空闲内存页执行预清零操作之后,还包括:
将所述空闲大页内存的所述目标状态设置为0。
8.一种缺页异常处理装置,其特征在于,包括:
第一判断模块,用于在目标虚拟机的目标进程启动的过程中,判断当前是否触发缺页异常;
空闲页获取模块,用于在当前触发所述缺页异常时,则针对所述目标虚拟机是否使用标准大页的情况从不同的存储空间上获取空闲内存页;
第二判断模块,用于判断所述空闲内存页是否设置有已清零标记;
内存清零控制模块,用于在所述空闲内存页已设置有所述已清零标记时,则跳过内存页清零操作,并利用所述空闲内存页为所述目标进程的虚拟内存映射物理内存。
9.一种电子设备,其特征在于,包括:
存储器,用于保存计算机进程;
处理器,用于执行所述计算机进程,以实现如权利要求1至7任一项所述的缺页异常处理方法的步骤。
10.一种计算机可读存储介质,其特征在于,用于存储计算机进程;其中,所述计算机进程被处理器执行时实现如权利要求1至7任一项所述的缺页异常处理方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211025832.XA CN115408105A (zh) | 2022-08-25 | 2022-08-25 | 一种缺页异常处理方法、装置、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211025832.XA CN115408105A (zh) | 2022-08-25 | 2022-08-25 | 一种缺页异常处理方法、装置、设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115408105A true CN115408105A (zh) | 2022-11-29 |
Family
ID=84160769
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211025832.XA Pending CN115408105A (zh) | 2022-08-25 | 2022-08-25 | 一种缺页异常处理方法、装置、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115408105A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN118093202A (zh) * | 2024-04-23 | 2024-05-28 | 上海芯联芯智能科技有限公司 | 一种访存异常的处理方法、计算设备、存储介质及程序产品 |
-
2022
- 2022-08-25 CN CN202211025832.XA patent/CN115408105A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN118093202A (zh) * | 2024-04-23 | 2024-05-28 | 上海芯联芯智能科技有限公司 | 一种访存异常的处理方法、计算设备、存储介质及程序产品 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9250969B2 (en) | Tagging a copy of memory of a virtual machine with information for fetching of relevant portions of the memory | |
US8949295B2 (en) | Cooperative memory resource management via application-level balloon | |
US20190220418A1 (en) | Memory Management Method and Apparatus | |
US9250943B2 (en) | Providing memory condition information to guest applications | |
US7376949B2 (en) | Resource allocation and protection in a multi-virtual environment | |
US7434003B2 (en) | Efficient operating system operation on a hypervisor | |
US7685376B2 (en) | Method to support heterogeneous memories | |
US8239610B2 (en) | Asynchronous page faults for virtual machines | |
US6671802B1 (en) | Performance optimization of computer system by dynamically and immediately updating a configuration setting based on detected change in preferred use | |
US8271989B2 (en) | Method and apparatus for virtual processor dispatching to a partition based on shared memory pages | |
US9164898B2 (en) | Administering thermal distribution among memory modules of a computing system | |
US7757034B1 (en) | Expansion of virtualized physical memory of virtual machine | |
GB2467435A (en) | Power management in virtual machine environment | |
CN104794069A (zh) | 一种cpu中缓存的用户态分配方法和系统 | |
US8751724B2 (en) | Dynamic memory reconfiguration to delay performance overhead | |
CN115408105A (zh) | 一种缺页异常处理方法、装置、设备及存储介质 | |
AU2019272434B2 (en) | Processor feature ID response for virtualization | |
CN117573419B (zh) | 一种页面异常处理方法及装置 | |
US10417121B1 (en) | Monitoring memory usage in computing devices | |
US9088569B2 (en) | Managing access to a shared resource using client access credentials | |
US20240143362A1 (en) | Migrating memory pages between non-uniform memory access (numa) nodes based on entries in a page modification log | |
US20040073907A1 (en) | Method and system of determining attributes of a functional unit in a multiple processor computer system | |
US20090031100A1 (en) | Memory reallocation in a computing environment | |
CN113703913A (zh) | 设备测试方法及装置 | |
US20080072009A1 (en) | Apparatus and method for handling interrupt disabled section and page pinning apparatus and method |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |