美文网首页
Linux多核系统的负载均衡策略

Linux多核系统的负载均衡策略

作者: 蟹蟹宁 | 来源:发表于2021-06-23 15:12 被阅读0次

如下一个NUMA的架构,共有两个CPU结点,每个CPU上有4个物理core,每个core上有两个超线程,即:2个CPU、8个物理core、16个逻辑core。

Linux将上述结构组为调度域和调度组:
调度组:定义比较难表达,调度组是组成调度域的基本单位。在最小的调度域中一个超线程是一个调度组,在最大的调度域中,一个NUMA结点内的所有超线程组成一个调度组。
调度域:上述结构中有3个调度域
  • D0,整个系统,包括所有CPU组成一个调度域,D0调度域仅有一个,其包括两个调度组,即两个NUMA结点。
  • D1,两个NUMA结点分别独立组成一个调度域,D1域的调度组是每个CPU上的物理core,即每个D1拥有4个调度组。
  • D2,每个物理core构成最小的调度域,D2域的组是每个超线程。

负载均衡的完整过程:

  1. 每次时钟中断会执行schedule_tick()函数,每个CPU都有一个周期次数Ncpu,当tick的次数达到Ncpu时会触发软中断。
  2. 软中断的处理函数会检查当前CPU的所在的3个调度域(D0、D1、D2),每个调度域同样拥有自己的Ndomain(显然,调度域越大,此值越大),当tick次数达到某一调度域的Ndomain时,触发该域的Load Balance。
  3. 首先检查当前CPU是否是该调度域上其所在调度组的空闲CPU或第一个CPU(调度组的CPU有排序),若不是,则放弃LB操作。
  4. 若是,则找出该调度域中当前调度组之外的负载最重的调度组(如调度组有一个状态标签空闲,刚好超载等,仅对超载的组进行LB),比较此组是否比当前组更重,若不是,停止LB。
  5. 若是,则寻找此组中任务最重的CPU,然后将其runable_list上的task分担到当前CPU中。

当前进程刚产生或唤醒时,也需要对进程进行任务的放置,此时也有LB的考虑:

  1. 确定可调度的调度域
    针对每一种情况,如fork、wake up等内核中有一个flag标识此方式产生进程的可调域的级别。默认都是D0域的调度级别,也就是在整个系统的所有core上都可调度。
  2. 在调度域上寻找最空闲调度组,然后一直递归下去,直到最空闲的CPU。

相关文章

网友评论

      本文标题:Linux多核系统的负载均衡策略

      本文链接:https://www.haomeiwen.com/subject/gsspyltx.html