1.本发明涉及通信及云计算技术领域,尤其涉及一种虚拟机内存迁移方法、装置、设备及存储介质。
背景技术:2.内存写密集型负载是指虚拟机所承载的业务需频繁的向内存写入数据的负载类型,此类负载通常写脏内存速度很快,在进行虚拟机迁移时,会产生大量需要重复传输的内存脏页。由此导致的迁移失败或较长的停机时间通常会造成较为严重的后果。
3.虚拟机预拷贝(pre-copy)迁移方法是虚拟机迁移的主要方式之一,预拷贝迁移方法通过一个循环,将内存数据发送至迁移目的虚拟机,循环第一轮发送所有内存数据,接下来每一轮发送上一轮预拷贝过程中的脏页。最后一轮是停机拷贝阶段,源主机被挂起,停止内存更新,将脏页整体拷贝到目的虚拟机上。
4.预拷贝迁移方法通过多轮迭代的方式将虚拟机内存页从源节点传输到目的节点。预拷贝迁移的主要目标是缩短停机时间,从而使用户及上层应用几乎察觉不到迁移的发生。然而,当需要迁移的虚拟机内运行的业务是内存写密集型负载类型时,预拷贝迁移就遇到了较大的挑战,原因是此类负载不仅通常占据了很大的系统内存空间,而且写脏内存的速度也很快,由此产生的大内存量脏页在预拷贝迁移过程中需要被频繁地进行传输,从而导致了较大的数据传输量和较长的迁移时间。较长的迁移时间常常会导致延误和错失最佳的迁移时机,从而使得预期达到的负载均衡、系统维护等目标无法实现。此外,内存写密集型负载产生脏页的速度甚至可能会大于迁移进程可以使用的网络带宽,尤其是在网络源不够丰富的迁移场景下,在此情况下,预拷贝迁移过程便无法收敛进入最后的停机拷贝阶段,因此迁移也就无法通过预期的停机时间来完成,当面对这种困难局面时,数据中心内的管理员常常不得不强行结束迁移过程,而这常常会导致长达若干秒甚至几十秒的停机时间。另外,过长的停机时间还会导致其他一些严重的问题,比如tcp连接的中断以及对系统一致性造成影响等等。然而,如果不通过该延长停机时间的方式以完成迁移,而是取消迁移操作或者迁移失败则会对数据中心带来更为严重的损失。
技术实现要素:5.有鉴于此,本发明提供一种虚拟机内存迁移方法、装置、设备及存储介质,用于提高虚拟机内存迁移效率。
6.基于本发明实施例的一方面,本发明提供了一种虚拟机内存迁移方法,该方法应用于虚拟机的宿主机,该方法包括:
7.在预拷贝迭代阶段的第一轮迭代中,进行全量内存页的迁移,在迁移传送每一个内存页时,为该内存页计算哈希值并记录该内存页的哈希值;
8.进行下一轮预拷贝迭代并在每轮预拷贝迭代过程中,通过比对内存页当前和历史哈希值剔除脏页位图标记的假脏页;
9.当满足停机拷贝时间条件时,执行停机拷贝。
10.进一步地,所述方法还包括:
11.当不满足停机拷贝时间条件时,判断是否满足迁移切换条件;
12.在满足迁移切换条件时,执行虚拟机迁移的后拷贝阶段。
13.基于本发明实施例的另一方面,本发明还提供一种虚拟机内存迁移装置,该装置包括:
14.预拷贝迭代模块,用于执行预拷贝迭代;其中,在预拷贝迭代阶段的第一轮迭代中,进行全量内存页的迁移,在迁移传送每一个内存页时,为该内存页计算哈希值并记录该内存页的哈希值;在后续每轮预拷贝迭代过程中,通过比对内存页当前和历史哈希值剔除脏页位图标记的假脏页,仅迁移真脏页;
15.停机判断模块,用于判断是否满足停机拷贝时间条件;
16.停机模块模块,用于在满足停机拷贝时间条件时,执行停机拷贝。
17.进一步地,所述装置还包括:
18.切换判断模块,用于在不满足停机拷贝时间条件时,判断是否满足迁移切换条件;
19.后拷贝模块,用于在满足迁移切换条件时,执行虚拟机迁移的后拷贝阶段。
20.进一步地,在本发明一实施例中,所述迁移切换条件为:本轮预拷贝迭代过程中新产生的脏页数量不大于上一轮传输的脏页数量。
21.进一步地,在本发明一实施例中,所述迁移切换条件为:本轮预拷贝迭代过程中新产生的脏页数量不大于上一轮传输的脏页数量,且本轮预拷贝迭代过程中新产生的脏页数量是预设的预拷贝迭代滑动窗口中的最小值。
22.为了提高承载内存写密集型负载的虚拟机的迁移效率,本发明在预拷贝迭代的过程中,通过内存页的哈希值识别假脏页,避免传输假脏页,并进一步将预拷贝迭代、停机拷贝和后拷贝过程结合使用,预设优化的预拷贝迁移迭代阶段到后拷贝阶段的切换条件,满足预设的切换条件后自动执行切换。本发明能够避免过多无用的预拷贝迭代,能够最大限度地缩短迁移持续时间,减小带宽占用,提高虚拟机内存数据的迁移效率。
附图说明
23.为了更加清楚地说明本发明实施例或者现有技术中的技术方案,下面将对本发明实施例或者现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据本发明实施例的这些附图获得其他的附图。
24.图1为采用粗粒度的脏页追踪机制的预拷贝迭代第一轮迭代产生假脏页的示意图;
25.图2为本发明一实施例提供的虚拟机内存迁移方法的步骤流程示意图;
26.图3为本发明一实施例提供的用于实现本发明实施例提出的虚拟机内存迁移方法的电子设备结构示意图。
具体实施方式
27.在本发明实施例使用的术语仅仅是出于描述特定实施例的目的,而非限制本发明
实施例。本发明实施例中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其它含义。本发明中使用的术语“和/或”是指包含一个或多个相关联的列出项目的任何或所有可能组合。
28.应当理解,尽管在本发明实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本发明实施例范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,此外,所使用的词语“如果”可以被解释成为“在
……
时”或“当
……
时”或“响应于确定”。
29.发明人通过实验和分析发现,在预拷贝迁移过程所传输的内存脏页中存在一定数量的“假脏页”,且部分负载所含假脏页的比例很高。重复传输此类假脏页不仅没有必要,而且浪费了大量的网络资源。产生“假脏页”的一个主要原因是计算机系统中存在大量“写而不脏”的写请求发送到内存中,而这些写请求则是由广泛存在的静默存储(silent store)指令引起的。
30.以kvm和xen等虚拟化平台为例,这些虚拟化平台都采用了相似的机制来追踪并记录在虚拟机迁移过程中产生的内存脏页,它们都采用了脏页位图来标记脏页,在预拷贝迁移的初始化阶段,所有虚拟机的内存页都会被设置为只读模式,因此在接下来的迁移过程中,当系统将一个写操作发送到某个内存页时,便会触发一次页面写错误。操作系统在监测到针对内存页的写操作时,会在脏页位图中将这些脏页对应比特位置位以标记出这些内存页发生过写操作。所有通过脏页位图被标记为脏页的内存页都需要在下一轮迭代中再次进行传输。然而,一个被脏页位图标记了的内存页并不一定发生了内容上的改变,也即发送到一个内存页的写请求并不一定真正修改了该页面的数据,这样就会产生很多“写而不脏”的“假脏页”,这是在迁移过程中产生绝大部分“假脏页”的主要原因。
31.产生“假脏页”的另一个原因是虚拟机迁移过程中使用的脏页追踪机制存在一定的缺陷,其进行脏页记录的粒度较粗。以kvm结合qemu(一种快速虚拟化模拟器)架构的虚拟化平台为例,虚拟化平台主要由kvm内核模块和位于用户空间的qemu虚拟化模拟器两部分所组成的。在虚拟机迁移的过程中,内核空间和用户空间都各自维护了一个脏页位图。内核空间所维护的脏页位图(内核脏页位图)负责追踪操作系统发送到内存页上的写请求,并将这些内存页所对应脏页位图的比特位置为1,它记录了在一轮预拷贝迭代过程中所有被操作系统写过的内存页。在一轮迭代过程的结束,qemu会通过kvm所提供的“ioctl”系统调用接口将内核空间中的脏页位图同步到自身所维护的脏页位图(简称用户脏页位图)中,脏页位图的同步操作同时会对内核脏页位图进行重置,从而开始记录下一轮迭代中产生的脏页。而在下一轮迭代中,迁移线程会利用已同步到用户空间的脏页位图来进行脏页的传输。从以上描述可以看出,迁移过程所使用的脏页追踪机制的粒度是较大的,该粒度是一轮预拷贝的迭代。而正是这种较粗粒度的脏页追踪机制也导致了假脏页的产生。
32.图1为采用粗粒度的脏页追踪机制的预拷贝迭代第一轮迭代产生假脏页的示意图,从以上描述可以看出,迁移过程所使用的脏页追踪机制的粒度是较大的,该粒度是一轮预拷贝的迭代。而正是这种较粗粒度的脏页追踪机制也导致了假脏页的产生。以下结合该图以预拷贝的第一轮迭代为例来解释说明产生“假脏页”的原因,其他各轮迭代则原理与之相似。
33.在迁移过程的第一轮迭代过程中,迁移线程会将客户机地址空间中的每一个内存页按照从低到高的地址顺序依次进行传输。假设当指示传输位置的游标从地址p移动到p’的这段时间内,有abcd四个内存页面接收到了系统发送的写请求,所以这4个页面会在内核空间的脏页位图中被标记为脏。假设这4个页面都不是之前所讨论的写而不脏的内存页,也即这些写请求修改了这4个内存页的数据内容。尽管如此,在上述过程中,只有页面a和b是真正的脏页,而页面c和d却是“假脏页”,原因是页面a和b在该轮迭代中是在传输之后被写脏的,而页面c和d是在该轮迭代中对它们进行传输之前被写脏的,所以当页面c和d被传输到目的端节点时,所传输的内容是新的被写脏后的内存数据,除非页面c和d在这次传输后被再次写脏,因此对于下一轮迭代来说,内存页c和d是“假脏页”。
34.基于上述对承载内存写密集型负载的虚拟机的迁移过程的分析可以发现,在虚拟机迁移的预拷贝迁移过程中所传输的内存脏页中存在一定数量的“假脏页”,且有些内存写密集型负载业务产生的假脏页的比例很高,在迁移过程中重复传输此类假脏页降低了迁移效率,浪费了大量的网络资源。
35.为了提高承载内存写密集型负载的虚拟机的迁移效率,本发明提出了一种虚拟机内存迁移方法,该方法在预拷贝迭代的过程中,通过内存页的哈希值识别假脏页,避免传输假脏页,并进一步将预拷贝迭代、停机拷贝和后拷贝过程结合使用,预设优化的预拷贝迁移迭代阶段到后拷贝阶段的切换条件,满足预设的切换条件后自动执行切换。本发明能够避免过多无用的预拷贝迭代,能够最大限度地缩短迁移持续时间,减小带宽占用,提高虚拟机内存数据的迁移效率。
36.图2为本发明一实施例提供的虚拟机内存迁移方法的步骤流程示意图,本发明提供的虚拟机迁移方法分为两个阶段,第一个阶段为预拷贝迭代阶段,第二个阶段为后拷贝阶段。预拷贝迭代阶段根据业务负载情况通常由若干轮预拷贝迭代过程组成,当达到预设的切换条件时,由预拷贝迭代阶段切换到后拷贝迁移阶段。该方法包括:
37.步骤201.在预拷贝迭代阶段的第一轮迭代中,进行全量内存页的迁移,在迁移传送每一个内存页时,为该内存页计算哈希值并记录该内存页的哈希值。
38.本发明采用内存页哈希值来判断内存页是否在两次预拷贝迭代过程之间发生内容变化,利用计算和比较哈希值的方法可以识别出哪些内存页是假脏页,从而避免在下一次迭代时传输假脏页。同内存数据的逐字节比较相比,通过哈希值来判断内存页的内容是否发生变化的方式具有一个明显的优势,即存储哈希值带来的内存开销不大。以sha1哈希为例,对于一个4kb大小的内存页而言,其sha1哈希值的长度只有20个字节,因此存储sha1哈希值所需的内存开销仅为虚拟机内存空间的1/200,内存开销较小。
39.步骤202.进行下一轮预拷贝迭代,在每轮预拷贝迭代过程中,通过比对内存页当前和历史哈希值剔除脏页位图标记的假脏页,仅迁移真脏页;
40.在根据脏页位图进行内存页的迁移之前,再次计算脏页位图标记的脏页的哈希值,判断被标记的脏页是否为假脏页,如果哈希值未发生改变,则说明该内存页的内容也没有发生改变,表明这是一个假脏页,因此当前的预拷贝迭代过程将跳过该页面而不进行传送。如果哈希值不同,则表面该内存页发生了变化,是一个真正的脏页,需要将该内存页传送到迁移目的虚拟机,传送完成后,需使用新计算的哈希值替换掉旧的哈希值,因为在接下来的迭代中可能还需要再次对比。在完成每轮预拷贝迭代后,将脏页位图重置。
41.步骤203.判断是否满足停机拷贝时间条件,若不满足执行步骤204,否则执行步骤206;
42.在预拷贝迭代过程结束后,会执行停机拷贝来完成最终的迁移过程。在停机拷贝阶段,源主机会被挂起,停止内存更新,迁移程序会将脏页整体拷贝到目的虚拟机上。
43.预拷贝迭代不能无限循环下去,因此需要配置停机拷贝时间条件,通常停机时间是一个很小的时间参数,用户可能都会感知不到。
44.步骤204.判断是否满足迁移切换条件,若满足,执行步骤205;否则继续执行下一轮预拷贝迭代即执行步骤202;
45.根据前面对内存写密集型负载的虚拟机内存迁移过程的分析可知,内存写密集型负载经常会导致无法在预设的停机时间内完成虚拟机内存迁移。通过对内存页记录哈希值进行哈希比对的方法虽然可以提升此类负载的迁移性能,但并不能够保证所有负载都可以成功完成迁移。因此,为了保证迁移过程的成功完成,本发明提出了将预拷贝迭代过程和后拷贝过程(post-copy)结合的虚拟机内存迁移方法,通常由若干轮预拷贝迭代加上一个后拷贝阶段构成。将两种方法结合的迁移方法可将大部分的内存数据在预拷贝迁移阶段进行传输,从而可以减少后拷贝迁移阶段所需要传输的内存数据量。结合拷贝迁移方法一方面保证了迁移过程可以在有限的时间内完成,另一方面也缩短了后拷贝迁移阶段的持续时间。
46.本发明一实施例中,将本轮预拷贝迭代过程中新产生的脏页数量不大于上一轮传输的脏页数量作为预拷贝迭代阶段到后拷贝阶段的迁移切换条件,即在每一轮预拷贝迭代过程结束时,对比该轮预拷贝迭代过程期间新产生的脏页数量和上一轮预拷贝迭代过程中传输的脏页数量,当新产生的脏页数量不再大于上一轮预拷贝迭代过程中传输的脏页数量时,就表明出现了剩余脏页数量增长趋势的转折点,当拐点出现时,将预拷贝迭代过程切换到后拷贝阶段。
47.然而,在统计实际迁移过程中的脏页数量的随机波动表明,多进行若干轮预拷贝迭代可能会使新产生的脏页数量趋于稳定范围,从而使后拷贝阶段再得到一定的缩短,同时总迁移时间也会有相应的延长。因此在该转折点出现之后,本发明另一实施例中,对迁移切换条件进行了进一步改进,该实施例中,在前述转折点出现以后,会继续进行预拷贝迭代,在后续每轮预拷贝迭代结束时,如果本轮预拷贝迭代过程中新产生的脏页数量在预设的预拷贝迭代滑动窗口中为最小值,则满足迁移切换条件,那么迁移过程就于此时切换进入后拷贝阶段。在具体实现时可根据实际情况设置预拷贝迭代滑动窗口的大小,例如可将滑动窗口的大小设置为3。
48.步骤205.执行虚拟机迁移的后拷贝阶段即post-copy;
49.后拷贝阶段所执行的操作包括:先把虚拟机现有的cpu state,registers and,optionally,non-pageable memory(内存中不会进行交换或者移动的内存)等信息传输到目的虚拟机,不管脏页(dirty page),并迅速把虚拟机在目的服务器启动起来。同时,源服务器也会动态的把剩余的内存(memory)推送到目的服务器上。但是当虚拟机运行调用到还没传输过来的memory时,会触发page-fault。
50.postcopy基于linux内核提供的userfaultfd
′
kernel(用户态缺页处理机制)机制处理这些page-fault(缺页)的。userfaultfd可以让迁移的目的虚拟机在用户空间
(userspace)通过文件描述符fd获得page fault的信息。简单的说就是当目的虚拟机在目的服务器上调用到这些还未传输完成的内存时,userfaultfd可以到源服务器上把这些内存信息取出,并传输到目的服务器上,让虚拟机继续运行。
51.post-copy算法流程也可以分为三步:
52.(1)源主机复制传送包括vcpu等系统状态在内的能使虚拟机在目的主机上运行的最小数据集到目的主机;
53.(2)源主机暂停虚拟机的运行,目的主机收到虚拟机可以运行的最小数据集后便恢复虚拟机的运行
54.(3)目的主机通过网络从源主机获取需要的内存页面。
55.步骤206.执行停机拷贝阶段。
56.至此,本发明提供的虚拟机内存迁移方法的处理步骤结束。通过上述内容可知,本发明针对内存写密集型负载由于脏页产生速度较快而难以迁移的问题,提出了一种能够剔除假脏页且将预拷贝迭代和后拷贝方法结合的混合拷贝迁移方法。在虚拟机预拷贝迁移过程中,此类负载中的一部分拥有比例较高的假脏页,重复传输假脏页会浪费网络带宽资源,本发明通过记录内存页的哈希值并进行哈希值比对的方法避免假脏页的传输,通过记录脏页数量在接近最优的时刻自动地将迁移过程从预拷贝阶段切换进入后拷贝阶段,尽量缩短后拷贝阶段的持续时间且不进行过多无用的预拷贝迭代。本发明显著提升了运行内存写密集型负载的虚拟机的迁移性能,混合拷贝迁移方法不仅保证了所有负载的成功迁移,而且显著地缩短了后拷贝迁移阶段的持续时间,从而减轻了后拷贝算法的固有缺陷对迁移带来的负面影响。
57.图3为本发明一实施例提供的用于实现本发明实施例提出的虚拟机内存迁移方法的电子设备结构示意图,该设备300包括:诸如中央处理单元(cpu)的处理器310、通信总线320、通信接口340以及存储介质330。其中,处理器310与存储介质330可以通过通信总线320相互通信。存储介质330内存储有计算机程序,当该计算机程序被处理器310执行时即可实现本发明提供的虚拟机内存迁移方法中的一个或多个步骤的功能。
58.其中,存储介质可以包括随机存取存储器(random access memory,ram),也可以包括非易失性存储器(non-volatile memory,nvm),例如至少一个磁盘存储器。另外,存储介质还可以是至少一个位于远离前述处理器的存储装置。处理器可以是通用处理器,包括中央处理器(central processing unit,cpu)、网络处理器(network processor,np)等;还可以是数字信号处理器(digital signal processing,dsp)、专用集成电路(application specific integrated circuit,asic)、现场可编程门阵列(field-programmable gate array,fpga)或其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
59.应当认识到,本发明的实施例可以由计算机硬件、硬件和软件的组合、或者通过存储在非暂时性存储器中的计算机指令来实现或实施。所述方法可以使用标准编程技术,包括配置有计算机程序的非暂时性存储介质在计算机程序中实现,其中如此配置的存储介质使得计算机以特定和预定义的方式操作。每个程序可以以高级过程或面向对象的编程语言来实现以与计算机系统通信。然而,若需要,该程序可以以汇编或机器语言实现。在任何情况下,该语言可以是编译或解释的语言。此外,为此目的该程序能够在编程的专用集成电路上运行。此外,可按任何合适的顺序来执行本发明描述的过程的操作,除非本发明另外指示
或以其他方式明显地与上下文矛盾。本发明描述的过程(或变型和/或其组合)可在配置有可执行指令的一个或多个计算机系统的控制下执行,并且可作为共同地在一个或多个处理器上执行的代码(例如,可执行指令、一个或多个计算机程序或一个或多个应用)、由硬件或其组合来实现。所述计算机程序包括可由一个或多个处理器执行的多个指令。
60.进一步,所述方法可以在可操作地连接至合适的任何类型的计算平台中实现,包括但不限于个人电脑、迷你计算机、主框架、工作站、网络或分布式计算环境、单独的或集成的计算机平台、或者与带电粒子工具或其它成像装置通信等等。本发明的各方面可以以存储在非暂时性存储介质或设备上的机器可读代码来实现,无论是可移动的还是集成至计算平台,如硬盘、光学读取和/或写入存储介质、ram、rom等,使得其可由可编程计算机读取,当存储介质或设备由计算机读取时可用于配置和操作计算机以执行在此所描述的过程。此外,机器可读代码,或其部分可以通过有线或无线网络传输。当此类媒体包括结合微处理器或其他数据处理器实现上文所述步骤的指令或程序时,本发明所述的发明包括这些和其他不同类型的非暂时性计算机可读存储介质。当根据本发明所述的方法和技术编程时,本发明还包括计算机本身。
61.以上所述仅为本发明的实施例而已,并不用于限制本发明。对于本领域技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。