曾少慧,邱 彬
(汕头职业技术学院计算机系,广东 汕头 515078)
虚拟化技术在提高资源利用率的同时,也带来运算量不断的增加,特别虚拟机迁移时大量运算加重了通信负担,造成性能的巨额开销.如何改善通信机制减少数据传输量、缩短迁移时间成为虚拟机实时迁移中迫切需要解决的问题.
虚拟机的迁移主要涉及存储、网络和内存三种信息[1],其中以内存的迁移最为关键.由于虚拟机的迁移是一个动态的过程,在此过程中内存始终处于被读写状态,其存放的资源一直在不断变化,且内存迁移性能对虚拟机迁移时间和停机时间的影响十分突出[2];同时,由于内存迁移无法使用NFS 等技术,只能通过网络进行,所以合理有效的内存迁移算法能减少虚拟机总迁移时间、停机时间和网络带宽,对提高整个迁移性能起明显作用.
目前虚拟机内存迁移应用得最广泛的是预拷贝(Pre-Copy)算法[3].它的机制是:首先进入迭代拷贝阶段,首轮迭代必须传递所有内存页到目的虚拟机,之后每轮迭代只传递有变化的内存页,每次迭代完成后,判断是否满足执行停机拷贝的条件,当迭代次数到达一定量或传递页面小于一定量时,就进入停机拷贝阶段,停机拷贝阶段将剩余的脏页和未被拷贝但已经更改的内存页传递到目的虚拟机,同时检测源虚拟机和目的虚拟机内存页面是否同步,若是,则源虚拟机停止工作,进入等待状态,最后启动目的虚拟机并销毁源虚拟机.虚拟机动态迁移机制如图1 所示.
图1 虚拟机动态迁移机制
近年来,许多专家学者对基于预拷贝的虚拟机内存迁移机制进行了详细的分析和研究,取得了若干研究成果[4-8].文献[4]中对脏页拷贝策略进行改进,将频繁修改的脏页在停机拷贝阶段进行传输,从而有效地缩短总迁移时间.文献[5]中,作者根据局部性原理提出了一种基于脏页率预测的预拷贝机制,对虚拟机内存页的脏页率做出预测,优先传输脏页率低的内存页,避免高脏页的重传.在保证迁移过程中可接受范围内QoS,同时减少迭代拷贝阶段的持续时间,文献[6]提出一种针对网络负载型虚拟机的智能停机预拷贝迁移策略.文献[7]提出了虚拟机的实时迁移对未来网络中海量计算和存储的有效性.文献[8]研究了无线网络环境下虚拟机在线迁移过程中的传输性能具有较低的延迟性.虽然上述研究成果对缩短虚拟机迁移总时间和减少总传输数据量起到一定作用,但对迁移过程中脏页的判断不足,传输策略的优化不明显,同时没有考虑虚拟机内存变化对停机时间的影响等因素.
本文利用马尔科夫模型保存脏页当前的修改状态,通过当前的数据预测脏页下次变脏的概率,同时兼顾了预测概率时脏页的变化情况,得到有效的变脏率,由此实现对高脏页传送的有效控制,节省了总迁移时间.
内存预拷贝算法在中、低负载环境下表现不错,但在高负载环境中,也就是面向内存密集型业务时可能会失效[9],随着迭代轮数的增加,传送的内存页反而增加,造成更大的开销.针对以上问题,本文对判断脏页的算法进行优化,当内存页在进行迭代拷贝时无需拷贝所有脏页,因为当脏页率比较高时,在后面的迭代拷贝过程中,脏页很可能再次被修改,这样就会提高脏页重复传输的概率.另外,原工作集测定算法只关心脏页上一次传送的修改情况,判定周期短,无法较准确测定脏页的变脏率.预测内存页变脏率优化算法的思路是收集脏页最近n 次的修改情况,对这n 个数据进行分析,计算出该脏页下次传送时再次变脏的概率,选择概率低的即比较稳定的脏页进行传送.对概率高的即高脏页则不予传送,从而降低内存页迁移数量.
高脏页的反复传送增加了迁移数据量,降低了迁移性能[10].如果每次传送前都能判断哪些页属于高脏页,并且在下次传送可能又会发生变化,则可以跳过本轮传送,使迁移数据量降低,提高迁移性能.为了更准确地测定工作集,本文将内存页分为几类,见表1.
表1 内存页类别
原虚拟机内存预拷贝只有两种内存页状态,本文算法增加为3 种状态,见表2.
表2 内存页状态
增加了脏页预测后,对工作集的测定实现流程如图2 所示.
具体步骤如下:
(1)预迁移阶段,当虚拟机接收到迁移信号后,开始对所有内存页的修改情况进行监控,并把数据记录到C-table 中;
(2)当迁移正式开始后,先对C-table 进行更新,判断该内存页是否属于第一次传送,若是,则计算C-table 中所有内存页变脏的概率;
(3)对D-table 进行更新,把当前再次变脏的内存页信息传送给Pro-table0,同时清空D-table 的数据;
(4)根据C-table 的状态,计算Pro-table0 的脏页再次变脏的概率;
(5)把上述脏页和变脏率等信息存放在Pro-table 中,将变脏率大于等于预定概率阀值Pmax的脏页设定为工作集;小于Pmax的脏页设定为准备传送的内存页,存放在Se-table里,同时清空Pro-table 的数据;
(6)再次更新D-table 的数据,并将其脏页信息复制到Sk-table 中;
(7)跳过Se-table 和Sk-table 中相同的内存页,将Se-table 剩下的内存页进行迁移,并清空Sk-table 的数据;
(8)最后,判断是否满足结束迭代传送的条件.若满足,则冻结源虚拟机,复制剩下的内存页以及上次迭代产生的脏页;若不满足,则返回步骤(2)继续判断.
图2 优化后的工作集预测流程图
上述变脏率的计算依据为脏页现在的修改情况和贝叶斯条件概率.设定S1 表示内存页没有被读写,S2 表示内存页只读,S3 表示内存页被修改.默认迁移开始前内存页状态为S1.使用的公式是:
(1)状态转移概率矩阵[11]:假定内存页有n 种可能的状态,即S1,S2,…,Sn,本文中设定了3 种状态,即n=3.Pij 表示内存页状态从Si 变成Sj 的状态转移概率.状态转移概率矩阵为:
(2)状态概率[12]:表示内存页初始状态己知,转移了k 次后变为状态Sj 的概率,且:
由马尔科夫(Markov)假设和贝叶斯的条件概率公式,有以下状态概率的公式:
马尔科夫预测模型首先记录了脏页最近N 次的修改状态,然后依据这N 次的数据预测脏页下次变脏的概率,并且还兼顾了预测概率时脏页的变化情况,对这些数据进行统计分析,从而比较可信地得到变脏率.该模型简易且参数少,不会造成太大的网络开销,容易实现并有重要的应用价值,因此,在虚拟机动态迁移过程中,提前对脏页的状态转移状况进行预测是非常有必要的,降低了脏页的反复传送,节省了总传送时间.
本文构建一个小型局域网作为实验环境,且在这个局域网中配置了一个同构的测试环境.硬件配置上,使用三台2.4 GHz 双核Intel 处理器,2 GB 内存的PC,分别做为虚拟机迁移的源主机和目的主机,以及NFS 服务器,并通过一台100 M 的交换机连接起来.软件配置上,所有PC 机上装的操作系统为Linux 的版本Ubuntu 14.04.虚拟平台为Xen 4.4.2.
实验环境的构建由以下几部分组成:
(1)在Host A、Host B 上安装修改过源码的Xen 4.4.2.实验过程中,可用vi 编辑Xen的源文件,然后通过编写make file 重新编译并安装Xen;
(2)开启Xen 的动态迁移功能,并设置虚拟机动态迁移的迁移端口,通过更改目录/etc/xen/下面的配置文件xend-config,设置后重启该进程;
(3)Host C 无需安装和编译Xen 4.4.2 源码,将它作为NFS 服务器,存储虚拟机的img镜像.采用virt-install 命令在NFS 服务器上创建虚拟机,开启NFS 服务,并把Host A、Host B 挂载到NFS 目录下,目录输出到/mnt/images 上;
(4)在Host A 上编写mount 安装的虚拟机配置文件,并将镜像文件存放到/mnt/images 下.通过配置文件可以修改虚拟机环境包括磁盘、网卡、内存大小、CPU 个数等信息.
分别在低脏页率和高脏页率环境下[13],对比原算法和优化算法前后的实验数据.低负载环境中进行低脏页率实验,做法是不运行任何程序,在空负载下做实验;高负载环境中进行高脏页率实验,做法是选择在内核编译时进行.设置的内存大小分别是256 MB,512 MB,1 024 MB 和2 048 MB.在系统目录下的日志文件中,读取每次迁移的数据记录,主要包括迭代次数、停机时间和总迁移时间.每个实验经过反复20 次的测试,取其平均值作为实验结果,对于本文中提出的Pmax值,为表示判断内存页是否传送的预定概率阀值,其值随着迭代次数n 而线性增加.本文实验中预定概率阀值Pmax选取n的线性函数,即Pmax=P0/2+nP0/N.其中P0表示内存页被改写时变脏率的增量,N 表示脏页最近修改情况的次数,结果如表3 和表4 所示.
表3 原算法与优化算法在低负载环境下的迁移性能比较
表4 原算法与优化算法在高负载环境下的迁移性能比较
根据原算法和优化算法的实验结果,得出算法优化前后的IN 指标、DT 指标和TMT 指标比对情况,如图3、图4、图5 所示.
图3 优化前后的IN 指标对比
图4 优化前后的DT 指标对比
图5 优化前后的TMT 指标对比
图3 显示了不同负载环境下优化前后的迭代次数的比较,可以看到,低负载的IN很少,优化后IN 甚至比原算法略增,这是因为低负载中要传送的内存页本来就少,而优化算法本身也要消耗一定的CPU 资源,但在高负载下就不存在这个问题,高负载下脏页量多,优化算法的优势就体现出来了.图4 显示了不同负载环境下优化前后的停机时间的比较,随着内存增大,DT 的值并没有跟着改变,而不同负载环境下,DT 的值有明显增长,说明DT 主要受高脏页数量的影响,与虚拟机的内存没有明显关系.低负载下,优化前后的DT 值没有明显变化;高负载下,优化后的DT 略有减少.图5 显示了不同负载环境下优化前后的总迁移时间的比较,TMT 随着虚拟机内存的增大而增大,低负载下,TMT 变化不明显,因为TMT 受IN 和DT 影响,某种情况下,IN 和DT 两者成反比.高负载下,TMT 有明显减少,从表4 中数据可以看出,不同内存环境下虚拟机迁移时间降低的百分比都在10%左右.尽管优化算法会消耗一定的CPU 资源,但足以抵消高脏页反复传送带来的损耗,达到了优化迁移性能的目的.
内存迁移的合理性对虚拟机的总迁移时间和停机时间有很大影响,是当前研究虚拟机动态迁移的重点.高脏页的反复传送增加了迁移数据量,降低了迁移性能.针对内存迁移机制中传统算法对脏页判断的不足,本文提出脏页率预测优化算法,计算脏页下次传输时再次变脏的概率,将概率高的脏页留在停机阶段进行拷贝,这样可以避免在迭代阶段频繁重传高脏页.实验表明,本文算法在高负载环境下能使高脏页的无效传送次数明显减少,同时缩短了10%的虚拟机迁移时间,优化了迁移性能.