一种虚拟化环境下面向任务并行编程模型的优化方法
【技术领域】
[0001] 本发明属于虚拟化与并行程序优化技术领域,更具体地,涉及一种虚拟化环境下 面向任务并行编程模型的优化方法。
【背景技术】
[0002] 随着处理器内核数量的增加,计算机编程模式由传统串行编程模式向新型并行编 程模式转变,以发挥出于内核数量的增长一致的实际效果;近年来,任务并行编程模型被广 泛用于开发并行应用,旨在简化并行编程和提高多核利用率。
[0003] 任务并行编程模型的核心技术是任务窃取调度,即每个处理器核对应一个线程, 每个线程维护一个双端队列,该队列的尾部用于压入准备好的任务或弹出已经执行完的任 务;当一个线程的双端队列为空时,该线程会转化为小偷线程,然后随机选择一个线程为受 害线程,并试图从该受害线程的双端队列头部窃取任务来执行。若窃取失败,则随机选择另 一个线程来窃取,如此反复,直到成功窃取到任务或本地队列非空为止。
[0004] 当前,随着虚拟化技术的发展,越来越多的并行应用运行在虚拟机中,并且单台物 理机通常被多个虚拟机共享。如果任务并行编程模型中的一个小偷线程持续窃取任务失 败,执行该线程的虚拟CPU会浪费计算资源。现有的任务并行编程模型,如Cilk++、TBB和 BWS等,在减少小偷线程对计算资源浪费的方面,缺乏针对虚拟化环境的优化。所以,任务并 行编程模型在虚拟化环境下面临着性能低下的问题。
【发明内容】
[0005] 针对现有技术的以上缺陷或改进需求,本发明提供了一种虚拟化环境下面向任务 并行编程模型的优化方法,其目的在于,利用运行小偷线程的虚拟CPU时间片,加速运行有 用线程的虚拟CPU,由此减少运行小偷线程的虚拟CPU对计算资源的浪费,有效降低运行有 用线程的虚拟CPU的调度延时,从而最大化地将多核资源投入到有效计算中,提升任务并 行编程模型的性能。
[0006] 为实现上述目的,按照本发明的一个方面,提供了一种虚拟化环境下面向任务并 行编程模型的优化方法,具体如下:
[0007] (1)获取任务并行编程模型中失败的窃取操作,读取失败的窃取操作对应的受害 线程在任务并行编程模型中维护的运行状态和双端队列信息;
[0008] 其中,双端队列是指每个线程维护的一个队列,该队列的尾部用于压入相应线程 准备好的任务或弹出已经执行完的任务;受害线程是指被小偷线程试图窃取任务的线程; 小偷线程是指自己的双端队列不存在准备好的任务,试图从其它线程的双端队列头部窃取 任务来执行的线程;
[0009] (2)根据受害线程的运行状态,判断受害线程是否为执行任务的有用线程,如果 是,进入步骤(3);否则,结束本次优化;其中,有用线程是指拥有可执行任务的线程;
[0010] ⑶判断受害线程的双端队列是否为空,如果是,进入步骤⑷;否则,结束本次优 化;
[0011] ⑷通过自定义的系统功能调用,将小偷线程的标识符和受害线程的线程标识符, 分别作为系统功能调用的第一个参数和第二个参数,发送给客户操作系统的内核层;
[0012] (5)客户操作系统的内核层,根据小偷线程的标识符和受害线程的标识符,查找内 核中代表小偷线程和受害线程的数据结构,并从中获取受害线程在内核层的运行状态,以 及小偷线程和受害线程所在虚拟CPU的标识符;
[0013] (6)根据受害线程在内核层的运行状态,判断受害线程是否已被客户操作系统抢 占,如果是,结束本次优化;否则,进入步骤(7);
[0014] (7)将运行小偷线程的虚拟CPU角色定义为加速发起者,运行受害线程的虚拟CPU 角色定义为被加速候选者,并通过自定义的超级调用,将加速发起者的虚拟CPU标识符和 被加速候选者的虚拟CPU标识符,分别作为超级调用的第一个参数和第二个参数,发送给 虚拟机监控器;
[0015] (8)虚拟机监控器接收来自客户虚拟机的虚拟CPU标识符,查找虚拟机监控器中 代表加速发起者和被加速候选者的虚拟CPU数据结构,并从中读取它们的运行状态和所在 物理CPU的信息;
[0016] (9)根据加速发起者和被加速候选者所在物理CPU的信息以及运行状态,判断是 否执行加速,如果是,进入步骤(10);否则,结束本次优化;本步骤中,决定是否执行加速的 过程具体如下:
[0017] (9-1)根据加速发起者和被加速候选者所在物理CPU的信息,判断它们是否属于 相同NUMA节点,如果是,进入步骤(9-2);否则,决定不执行加速;
[0018] 其中,NUM节点是指NUM系统中几个CPU通过内存总线与一块内存相连构成的 一个组;因为一个NUM系统拥有多条内存总线,所以被分为若干个NUM节点,并且处于相 同NUM节点的CPU访问本地内存的速度,远快于访问其它NUM节点的内存;
[0019] (9-2)根据被加速候选者的运行状态,判断被加速候选者是否已被虚拟机监控器 抢占,如果是,进入步骤(9-3);否则,决定不执行加速;
[0020] (9-3)根据加速发起者的运行状态,计算它在当前调度的剩余时间片,判断剩余时 间片的长度是否大于零,如果是,决定执行加速;否则,决定不执行加速;
[0021] (10)利用加速发起者的剩余时间片,加速被加速候选者的执行;本步骤具体包括 以下子步骤:
[0022] (10-1)暂停执行加速发起者;
[0023] (10-2)保留被加速候选者在当前物理CPU运行队列中的位置,并将被加速候选者 迀移到加速发起者所在的物理CPU;
[0024] (10-3)调度被加速候选者,且调度时间片等于加速发起者的剩余时间片;
[0025] (10-4)当被加速候选者被虚拟机监控器抢占(例如:时间片耗尽或被阻塞)时, 如果被加速候选者还处于可运行状态,则将它迀移回原本所在的物理CPU运行队列中的位 置,恢复其原本的调度路径;这样不仅降低了被加速候选者的调度延时,还使其获得了额外 的调度机会,以至于达到被加速的效果;
[0026] (10-5)结束本次加速。
[0027] 总体而言,通过本发明所构思的以上技术方案与现有技术相比,能够取得下列有 益效果:
[0028] (1)高效利用计算资源:本发明提供的优化方法弥补了现有任务并行编程模型缺 少针对虚拟化环境优化的不足,不仅能够减少运行小偷线程的虚拟CPU对计算资源的浪 费,还能有效降低运行有用线程的虚拟CPU的调度延时,从而最大化地将多核资源投入到 有效计算中;
[0029] (2)透明性:本发明提供的优化方法针对任务并行编程模型的优化过程涉及到获 取任务并行编程模型中失败的窃取操作,客户虚拟机和虚拟机监控器之间的通信等,这些 过程对用户来说是完全透明的,用户不需要参与其中;
[0030] (3)低开销:本发明提供的优化方法针对任务并行编程模型的优化过程涉及到获 取小偷线程失败的窃取操作,客户虚拟机和虚拟机监控器之间的通信等,这些过程仅对运 行基于任务并行编程模型的应用的虚拟机进行操作;每次加速执行涉及的加速发起者只是 把原本属于自己的时间片提供给被加速候选者,并且加速发起者和被加速候选者来自相同 虚拟机,故不会破坏虚拟机使用计算资源的公平性;因此,采用本发明提供的优化方法不会 对运行其它类型应用的虚拟机产生影响。
【附图说明】
[0031] 图1是本发明的方法所基于的虚拟CPU调度系统的体系结构图;
[0032] 图2是本发明实施例1的流程图;
[0033] 图3是本发明实施例1步骤(9)的细化流程图;
[0034] 图4是本发明实施例1步骤(10)的细化流程图;
[0035] 图5是本发明实施例1与现有技术在性能上的对比示意图。
【具体实施方式】
[0036] 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对 本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并 不用于限定本发明。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要 彼此之间未构成冲突就可以相互组合。
[0037] 本发明的方法所基于的虚拟CPU调度系统的体系结构如图1所示,服务器上有N 台客户虚拟机,由虚拟机监控器负责管理,本发明虚拟化环境下面向任务并行编程模型的 优化方法分为前后端两个部分,两个部分相互交互共同完成整体操作;前端监控部分位于 客户虚拟机中,负责获取任务并行编程模型中小偷线程失败的窃取操作,将运行小偷线程 的虚拟CPU角色定义为加速发起者,运行有用线程的虚拟CPU角色定义为被加速候选者,并 将它们的标识符以及相关角色信息发送给虚拟机监控器;
[0038] 后端加速部分位于虚拟机监控器中,负责根据加速发起者和被加速候选者的运行 状态和所在物理C