Linux内核中进程的负载均衡

2022-08-17 13:16:15 浏览数 (1)

简介

  • Linux内核中进程调度的核心是选择哪个任务在哪个CPU上运行,解决各个进程之间能够公平的共享CPU资源,同时需要确认进程需要占用CPU时间,确定下一个需要运行的进程。负载均衡的核心是各个CPU之间空闲和繁忙不均衡,提供系统整体的计算吞吐量。
  • 每个CPU上会运行一个进程的调度队列,在系统运行过程中可能会出现一个CPU上的任务多,另外一个CPU上的任务少的情况,这就需要将繁忙的CPU将任务转移到空间处理器上从而避免某些CPU负载不够的情况.
  • 一个NUMA计算机可以拥有多个Node,一个Node可以有多个Core,一个Core如果启用了超线程技术则变为多个Logical Processor逻辑处理器。一个NUMA计算机是按照Node->Core->Logical Processor层次呈现。

负载均衡成本开销

  • 首先需要了解下CPU核心之间的数据流通信原理,这样就能大概知道CPU中的Core之间的进程迁移之间的开销
  • 由于NUMA是以层次关系呈现,因此在执行进程的负载均衡也会呈现不同的成本开销。进程在同一个物理Core上的逻辑Core之前迁移开销最小;如果在不同的物理Core之间迁移,如果每个物理Core拥有私有的L1 Cache,共享L2 Cache,进程迁移后就无法使用原来的L1 Cache,进程迁移到新的Core上缺失L1 Cache数据,这就需要进程的状态数据需要在CPU Core之间进行通信获取这些数据,根据上图CPU的通信模式可以了解,成本代价是蛮大的。
  • 内核采用调度域解决现代多CPU多核的问题,调度域是具有相同属性和调度策略的处理器集合,任务进程可以在它们内部按照某种策略进行调度迁移。进程在多CPU的负载均衡也是针对调度域的,调度域根据超线程、多核、SMP、NUMA等系统架构划分为不同的等级,不同的等级架构通过指针链接在一起,从而形成树状结构;在进程的负载均衡过程中,从树的叶子节点往上遍历,直到所有的中的负载都是平衡的。目前内核进程调度按照如下的原则进行,这些原则都是按照cpu架构以及通信路径来进行的。

0 人点赞