Page 346 - 《软件学报》2020年第9期
P. 346

赵姗  等:S-Bridge:性能非对称多核处理器下负载均衡代理机制                                               2967


         同 CPU 核配置和 IPC 组成的性能矩阵作为线程分配和迁移的依据.文献[13,14]通过指令执行由于访存被阻塞
         的时间建立栈模型,通过大小核的加速比模型作为调度的依据.
             文献[15,24]针对动态异构多核处理器,根据应用的运行时状态进行处理器参数的动态调整.文献[15]基于
         CFS 提出新的 HFS(heterogeneity-aware fair scheduler)算法,增加集中式任务队列支持逻辑核的快速分配和调
         整,同时,进行公平性决策时增加核计算性能的因素,实现在利用异构多核性能优势的基础上保证公平性.但是
         文献[15]没有考虑不同特征应用计算资源的需求,而且异构的适配需要在 CFS 算法的基础上进行修改.其余工
         作主要针对静态性能非对称异构多核处理器,以下主要针对性能优化目标的工作进行分析.文献[16]提出基于
         稳定匹配算法的调度技术,维护动态的线程任务和核的优先级表,作为调度的依据.文献[17]提出一种迭代启发
         式调度算法,在满足功耗线程的情况下提高吞吐量.
             以上工作主要是针对调度算法本身,程序分析和调度决策本身具有较强的耦合度,缺乏通用性.而且 HASS
         虽然对于有稳定执行状态的负载,尤其是异构度明显的负载有较好的效果,但最主要的限制是无法感知程序变
         化的执行阶段,而且无法考虑运行状态(比如共享内存状态)的影响.文献[7,19]都是 IPC 驱动的动态调度算法,需
         要通过 IPC 采样获取在不同核上的性能数据,信息获取依赖于不同微架构的硬件支持,而且随着核类型的增加,
         可扩展性也比较差.文献[11]的性能预测模型从 PMC 单元无法直接获取,需要增加额外硬件支持.同时,文献[7]
         虽然通过很少的代码修改可以在多数 Linux 调度器上实现,但是仅对负载均衡时任务选择的策略进行改进和增
         强.文献[25]虽然是负载均衡算法的优化,但是需要通过修改 Linux 内核的负载均衡算法加入处理器利用率信
         息,使动态调频和负载均衡更好地协同工作.而不同于以上工作提出或者优化具体调度算法的方法,本文从另外
         一个角度提供一种代理机制,为各种调度算法提供异构的支持.这种机制跟以上工作最显著的不同是不需要直
         接修改调度算法本身,而是基于运行时信息形成规则影响负载均衡决策,同时提供架构无关的接口与调度器进
         行交互,适配不同的调度器,可以做到平台无关性和通用性.
             同时,HMP(heterogeneous multi  processing)是 Linaro 针对 big.LITTLE 架构开发的异构感知的调度算法,在
         实现上与 CFS 调度算法具有相同的入口,重新定义调度域为大小核两个域,在此基础上改进负载均衡策略,将负
         载重的任务迁移到大核域内执行,将负载轻的任务迁移到小核域内执行,采用任务处于可运行状态所占用 CPU
         时间比率作为负载轻重的依据.由于 HMP 这套机制在 2014 年后的成功商业化,目前大部分 big.LITTLE 设计的
         移动终端设备上(比如三星 Exynos5430 和 5433 等)都采用了 HMP 机制.因此,本文实验部分将优化工作与此主
         流的异构调度器进行比对.由于 HMP 调度器在 Linux 内核原有负载计算方法上扩展,对于任务特性的感知在
         HMP 中没有考虑,将通过本文的工作对 HMP 进行扩展.

         2    异构多核处理器下的负载均衡问题

         2.1   传统负载均衡的设计

             在主流的 Linux 操作系统中,调度器中的负载平衡针对同构多核系统(SMP)设计,目标是通过在各个核之间
         均匀分配负载,使各个核之间处于平衡的状态.传统负载均衡的实现采用 pull 和 push 两种方式进行负载均衡,
         以 pull 方式为例:当前 CPU 运行队列为空的时候,触发负载均衡,调度器将找到负载最重的 CPU,并移动该 CPU
         运行队列中的任务到空闲核上.其中,所有 CPU 都被对称对待,默认具有相同的处理能力(sched_capacity_scale).
         每个 CPU 工作负载是指运行队列(runqueue)中所有的线程负载的总和.每个线程负载的度量方法随着调度算法
         的发展而不断演化,最初定义为线程的负载权重(根据线程的优先级定义权重值),后来发展为负载跟踪度量标
         准(load track  metric) [28] ,根据历史负载的衰减来跟踪负载,但是基础的负载依然是线程的负载权重.该度量方法
         主要基于线程的优先级和平均 CPU 利用率统计线程的负载.传统的负载均衡主要基于 CPU 对称性和任务对称
         性的假设,在 CFS 调度算法中,假定相同优先级的任务具有相同的基础负载权重,而不会考虑任务属性.对于相
         同优先级而且一直占用 CPU 的任务,将具有相同的负载、但是优先级相同的任务由于对 CPU 资源需求的不同
         (比如计算密集型和内存密集型),在负载均衡的过程中,如果被选择迁移,不能一视同仁地分配在所有不同类型
         的目标核上.因此在异构多核环境下,CPU 的处理能力和任务特性不同对 CPU 造成的负载不同且变化.
   341   342   343   344   345   346   347   348   349   350   351