调度域
调度域就是CPU拓扑中某一层级里面,与某个逻辑CPU关联(该CPU 称为主权CPU)的所有逻辑CPU的集合;
调度组
某一层级调度域中所包括的下级实体(一个逻辑CPU的集合)。
调度域和调度组的区别:
- 调度域允许重叠交叉,调度组不允许重叠交叉。
- 一个调度域包含一个或多个调度组,一个调度组从属于一个或多个调度域。
- 同属于一个逻辑CPU的各级调度域通过parent/child指针组织成双向链表,同一级调度域的所有调度组通过next指针形成一个单向链表。
一句话概括:从一个主权CPU出发,该CPU在每个拓扑层级拥有一个调度域(每个调度域覆盖一个目标CPU集合),该调度域拥有若干个调度组(每个调度组包含一个目标CPU集合)。
调度域和调度组的设计主要是用于CPU负载均衡。
CPU负载均衡的含义是最大化全局性能,使各个CPU的负载维持在一个基本相同的水平。负载均衡的时候必然牵涉到进程迁移
(从相对繁忙的逻辑CPU迁移到相对空闲的逻辑CPU),而进程迁移是有代价的,这种代价就是性能损失。逻辑CPU之间共享的资源越少,迁
移的代价就越大。也就是说,线程组内的迁移代价最小(共享流水
线、高速缓存和内存通道),多核组内的迁移代价次之(共享高速缓
存和内存通道),封装组内再次(共享内存通道),而跨NUMA节点的
代价通常是很大的。于是,负载均衡时优先考虑低级调度域内部的均
衡(在同一级调度域的各个调度组之间比较负载,如果负载相差过大
就迁移进程),然后再逐级往上用同样的方式操作每一级调度域,直到最终达到全局的负载均衡。
原文作者:精通Linux内核
原文链接:Linux进程管理之调度域与调度组 - 知乎(版权归原文作者所有,侵权留言联系删除)