基于虚拟机当前工作性质以及任务负载的虚拟机调度算法
【技术领域】
[0001] 本发明涉及系统虚拟化、虚拟机中断检测、虚拟机CPU使用率检测和虚拟机调度 器设计领域。具体地,涉及基于虚拟机当前工作性质以及任务负载的虚拟机调度算法,用于 解决由虚拟机调度器设计缺陷引起的I/O响应延迟、无法动态适应虚拟机负载变化以及1/ O性能较低的问题。
【背景技术】
[0002] 虚拟化技术已经以各种不同的形式存在了 50多年。抽象的说,虚拟化是各种可用 资源的逻辑表示,可以不受物理条件的限制。具体一点就是,虚拟化技术在系统中添加了一 层虚拟化层,能够把下层的物理资源抽象成虚拟资源,供上层的应用使用。它既可以从单个 物理资源中划分出多个虚拟资源,也可以把多个物理资源整合成一个虚拟资源。
[0003] 虚拟机监控器(Virtual Machine Monitor,VMM)是虚拟化技术中最重要的一部 分。它处于硬件层和虚拟机之间,运行在最高的特权级别。它的主要功能是抽象底层硬件 资源,使之成为虚拟资源,并提供给上层创建的虚拟机使用。虚拟机监控器的主要功能包括 虚拟环境的管理和物理资源的管理。
[0004] 目前业界主流的虚拟机监控器包括Xen、KVM、VirtualBox、Hyper_V、VMware等等。 其中Xen作为主流的开源虚拟机监控器,在实际应用以及学术研宄中占有很重要的地位。 Xen默认的调度算法为信用值调度算法(Credit Scheduler)。信用值调度算法把分配的时 间视为信用值,在每个信用值分配周期会为所有VCPU分配信用值,VCPU每运行一段时间就 会扣除与其运行时间相对应的信用值,信用值小于0后在这个调度周期内便不再运行。
[0005] 由于虚拟机监控器的引入,原本在传统操作系统中已经解决的问题会出现新的变 化,同时还会出现一些传统操作系统中不会出现的问题。其中一个很重要的问题就是I/O 响应延迟的问题。在传统操作系统中,当一个I/O请求来临时,操作系统会感知到这个请 求,并调度他的接收者,使其抢占当前运行的进程,处理I/O请求,从而使得I/O请求的延迟 变小。然而在虚拟化环境中,所有的I/O请求会由虚拟机监控器接收,然后转发给对应的虚 拟机,操作系统无法感知到具体哪个虚拟机是I/O请求的接收者,因此无法进行抢占。当几 个虚拟机共享一个物理CPU的时候,一个虚拟机就不得不等待其他的虚拟机使用完分配给 他们的时间之后才能处理自己的I/O请求。当有很多虚拟机共享同一个物理CPU的时候, 延迟会变得非常高,这么高的延迟对于一个I/O密集型的虚拟机来说是不可接受的。
[0006] 传统的调度器把调度的公平性放在第一位,把I/O任务和CPU任务等同对待,会导 致I/O任务效率低下。为了解决I/O效率低下的问题,学术界提出了多种优化方法,将I/O 任务与CPU任务区别对待,但是比较极端的把虚拟机分成两类:纯I/O操作和纯CPU计算, 并没有考虑分配给I/O请求足够的CPU时间去处理,没有考虑混合型的虚拟机,因此也会影 响I/O任务的效率。另一方面,以往的部分研宄中虚拟机的类型只能在系统启动时手动指 定,一个I/O密集型的虚拟机在系统运行时也可能会改变成为CPU密集型,当一个没有被标 注为I/O密集型的虚拟机接收到大量I/O请求时,调度器无法改变调度时间片,使得I/O响 应的延迟无法降低。因此这些方法在实际的系统当中有局限性。
[0007] 综上所述,传统的调度器中存在着I/O响应延迟较大的问题,现有的研宄提出的 方法虽然能在一定程度上减少延迟,但是不能适应虚拟机负载动态的变化并且没有考虑为 I/O请求提供充足的时间进行处理,同样也会影响I/O请求的性能。因此,本领域的技术人 员致力于开发一种基于虚拟机当前工作性质以及任务负载的虚拟机调度算法,解决这一问 题。
【发明内容】
[0008] 有鉴于现有技术的上述缺陷,本发明所要解决的技术问题是提供基于虚拟机当前 工作性质以及任务负载的虚拟机调度算法,在保证I/O请求能够被及时响应的同时,又有 足够的CPU时间用于处理I/O请求,权衡时间片的大小,使I/O性能最大化,在提升I/O性 能的同时,又对CPU密集型的虚拟机带来最少的额外开销。
[0009] 为实现上述目的,本发明提供了基于虚拟机当前工作性质以及任务负载的虚拟机 调度算法,该算法包含了中断监控模块,CPU监控模块和调度器模块这三个模块:
[0010] 中断监控模块运行在虚拟机监控器中,从事件通道获取虚拟机接收的中断请求。 根据中断请求携带的信息,识别出包括domainU发送请求,domainU接收请求,domainO发送 回复,domainO接收回复等操作在内的I/O操作,监控所有虚拟机的中断频率,用于判断各 个虚拟机的工作性质是CPU密集型还是I/O密集型。
[0011] CPU监控模块运行在虚拟机监控器中,监控虚拟机CPU的忙闲比,并计算出CPU使 用率,根据虚拟机的CPU使用率计算出虚拟机所需的调度时间片。在计算时间片时,CPU监 控模块会把CPU利用率从0%到100%映射到时间片的Ims到20ms区间内,为了保持时间 片的变化的稳定,减少性能的颠簸,只有在连续几个周期CPU使用率都处于某个范围的时 候才会修改时间片大小。该模块在计算CPU使用率时利用了老化算法,将一定时间范围内 的历史信息结合到当前的信息中进行计算。
[0012] 调度器模块在CREDIT调度器的基础上进行修改,修改调度器的数据结构使之能 够存储中断监控模块和CPU监控模块所反馈的信息。调度器算法中会维护两个队列,分别 称之为A队列和B队列。根据中断监控模块反馈的信息,将不同工作性质的虚拟机放到不 同的队列中。CPU密集型的虚拟机存放在A队列中,I/O密集型的虚拟机存放在B队列中, 在每个调度周期开始时,调度器会选取其中一个队列的队首元素作为下一个要运行的虚拟 机,具体的选取方法如下:
[0013] 步骤1、首先从B队列选取队首作为下一个要运行的虚拟机,然后将现在调度结束 的虚拟机插入与其工作性质类型相对应的队列的队尾。
[0014] 步骤2、直到B队列中所有的虚拟机都运行过一次或者B队列为空之后,挑选A队 列的队首作为下一个要运行的虚拟机。
[0015] 步骤3、重复步骤1和2,直到所有虚拟机用完了它们在这个周期所分配的时间片。
[0016] 步骤4、重新分配信用值和时间片,回到步骤1。
[0017] 在获取了下一个要运行的虚拟机之后,调度函数会从domain结构中取出中断监 控模块和CPU监控模块更新的信息,根据中断监控模块的信息对不同类型的虚拟机应用不 同的调度策略。根据CPU监控模块的信息,获得不同的时间片大小,并用这个时间片来设置 计时器,进行虚拟机的调度。
[0018] 基于虚拟机当前工作性质以及任务负载的虚拟机调度算法具有以下有益的技术 效果:
[0019] (1)中断监控模块会监控事件通道内的所有事件,截获domainO和domainU之间的 通信事件,统计各个虚拟机的中断频率,用作区分虚拟机类型的依据。该模块提供了虚拟机 工作性质的信息,将虚拟机划分为I/O密集型和CPU密集型两种类型,调度器会根据不同的 类型应用不同的调度算法。CPU密集型的虚拟机采用默认的Credit调度算法,I/O密集型 的虚拟机采用本发明提供的调度算法。
[0020] ⑵CPU监控模块会统计一定时间周期内虚拟机的忙闲次数,用忙次数与总调度次 数之间的比值作为虚拟机的CPU使用率。根据监测出的CPU使用率计算对于I/O密集型虚 拟机采用的调度算法所需的时间片。在时间片的计算中采用了线性映射,避免了时间片的 颠簸,还采用了老化算法,让一定时间范围内的CPU使用率对当前周期内的时间片计算提 供信息,使计算更加准确。
[0021] (3)调度器模块在原有的Credit调度器上进行修改,在一个调度周期内让CPU密 集型虚拟机运行较大的时间片,让I/O密集型虚拟机运行多个较小的时间片,同时优先调 度I/O密集型虚拟机,尽量减少I/O响应的延迟。I/O密集型的虚拟机所需的时间片由CPU 监控模块计算得来,尽量保证有足够的时间来处理I/O请求,进一步提升I/O性能。另一方 面,所有虚拟机在一个调度周期内获得的时间片是相等的,保证了调度的公平性。<