在《一文讀懂 | 進(jìn)程怎么綁定 CPU》這篇文章中介紹過,在 Linux 內(nèi)核中會(huì)為每個(gè) CPU 創(chuàng)建一個(gè)可運(yùn)行進(jìn)程隊(duì)列,由于每個(gè) CPU 都擁有一個(gè)可運(yùn)行進(jìn)程隊(duì)列,那么就有可能會(huì)出現(xiàn)每個(gè)可運(yùn)行進(jìn)程隊(duì)列之間的進(jìn)程數(shù)不一樣的問題,這就是所謂的?負(fù)載不均衡?問題,如下圖所示:(圖1)最極端的情況是,一個(gè) CPU 的可運(yùn)行進(jìn)程隊(duì)列擁有非常多的進(jìn)程,而其他 CPU 的可運(yùn)行進(jìn)程隊(duì)列為空,這就是著名的?一核有難,多核圍觀,如下圖:(圖2)為了避免這個(gè)問題的出現(xiàn),Linux 內(nèi)核實(shí)現(xiàn)了 CPU 可運(yùn)行進(jìn)程隊(duì)列之間的負(fù)載均衡。接下來,我們將會(huì)介紹 CPU 間的負(fù)載均衡的實(shí)現(xiàn)原理。
本文使用的內(nèi)核版本為:Linux-2.6.23
CPU 間負(fù)載均衡原理
CPU 間負(fù)載不均衡的根本原因就是,CPU 的可運(yùn)行進(jìn)程隊(duì)列中的進(jìn)程數(shù)量不均衡導(dǎo)致的。所以,要解決 CPU 間負(fù)載不均衡的方法就是:將最繁忙的 CPU 可運(yùn)行進(jìn)程隊(duì)列的一些進(jìn)程遷移到其他比較空閑的 CPU 中,從而達(dá)到 CPU 間負(fù)載均衡的目的。當(dāng)然,在 2.6.0 版本的內(nèi)核的確是這樣實(shí)現(xiàn)的,我們可以看看其實(shí)現(xiàn)代碼: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;