NUMA级别下rebalance_domains同步机制及全忙时负载均衡疑问
关于Linux调度域负载均衡的核心疑问
核心场景与初始问题
假设所有CPU均处于忙碌状态,每个调度域(sched_domain)的负载均衡由哪个CPU负责?即should_we_balance会返回什么结果?
原有认知与矛盾点
我此前一直认为,每个调度域的负载均衡由首个组的首个CPU负责,以此避免两个CPU竞争从最繁忙组窃取任务的竞态问题。
但这一认知存在矛盾,因此我怀疑:不同CPU视角下,同一个调度域的“首个组”可能不同。以如下两级拓扑结构为例:
{0, 1, 2, 3} Node {0, 1} {2, 3} SMP 0 1 2 3 CPUs
若所有CPU均忙碌,顶级调度域的负载均衡应该由CPU 0和2共同负责,而非仅CPU 0——因为从CPU 2、3的视角来看,{2,3}是顶级调度域的首个组。
新判断带来的疑问
上述判断解决了原有认知的矛盾,但又引出新的问题:
- 内核注释多次提到
sd->last_balance的修改仅对本地CPU可见,因为sched_domain是每个CPU独有的。那为何在rebalance_domains中遍历域拓扑时需要RCU锁? - 从引入
SD_SERIALIZE的提交可知,仅在NUMA级别做序列化的逻辑是:NUMA级别的均衡耗时较长,而更低级别均衡速度快,竞态概率极低。但我对此存疑:如果CPU 0和2无法看到彼此对sd->last_balance的修改,他们的均衡间隔很可能同步,这不会引发问题吗?
总结疑问
简言之,我想明确:全忙场景下哪些CPU负责负载均衡、均衡频率是怎样的,以及他们的均衡频率(即sd->last_balance)是相互影响还是彼此独立?
内容的提问来源于stack exchange,提问作者user401445
相关产品推荐
相关产品推荐

