简介
- 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
架构以及通信路径来进行的。