高端文 | CPU负载均衡实现
扫描二维码
随时随地手机看文章
负载不均衡
问题,如下图所示:(图1)最极端的情况是,一个 CPU 的可运行进程队列拥有非常多的进程,而其他 CPU 的可运行进程队列为空,这就是著名的 一核有难,多核围观
,如下图:(图2)为了避免这个问题的出现,Linux 内核实现了 CPU 可运行进程队列之间的负载均衡。接下来,我们将会介绍 CPU 间的负载均衡的实现原理。本文使用的内核版本为:Linux-2.6.23
CPU 间负载均衡原理
CPU 间负载不均衡的根本原因就是,CPU 的可运行进程队列中的进程数量不均衡导致的。所以,要解决 CPU 间负载不均衡的方法就是:将最繁忙的 CPU 可运行进程队列的一些进程迁移到其他比较空闲的 CPU 中,从而达到 CPU 间负载均衡的目的。当然,在 2.6.0 版本的内核的确是这样实现的,我们可以看看其实现代码:static void
load_balance(runqueue_t *this_rq, int idle, cpumask_t cpumask)
{
int imbalance, idx, this_cpu = smp_processor_id();
runqueue_t *busiest;
prio_array_t *array;
struct list_head *head, *curr;
task_t *tmp;
// 1. 找到最繁忙的 CPU 运行队列
busiest = find_busiest_queue(this_rq, this_cpu, idle,