linux在多核處理器上的負載均衡原理 2

2021-07-06 11:39:28 字數 2214 閱讀 9352

假如現在是 core 3 在執行idle_balance,則先在domain 1裡找最忙的group,找到第二忙的group是core 0(core 4不在domain 1裡,所以不會找到它),再從core 0裡找最忙的runqueue(執行佇列),core 0就乙個執行佇列,所以直接就是它對應的runqueue了,然後從該runqueue裡挪出幾個任務到core 3,這一層domain的均衡做完了。

接著是domain 

1的父domain,即 cpu_domain,下圖的domain 0:

這個domain 0包含了兩個group,每個group對應乙個chip,即每個group對應了4個core。

在domain 0找最繁忙的group,顯然會找到processor1 對應的group(因為core 4超忙),那麼繼續在processor 1裡找最忙的runqueue,於是找到core 4,最後從core 4的runqueue裡挑出幾個任務挪到core 3,。

這樣,整個系統8個核都基本平衡了。

也許有人要問,為什麼是從子domain到父domain這樣遍歷,而不是倒過來,從父到子遍歷呢?這是因為子domain通常都是在乙個chip上,任務的很多資料在共享的l2 cache上,為了不讓其失效,有必要盡量讓任務保持在乙個chip上。

也許還有人要問:如果core 3本來就是最忙的core,它如果執行idle_balance,會發生什麼?答案是什麼也不會發生。因為在find_busiest_group函式裡,如果發現最忙的是「本cpu」,那麼就直接返回null,也就不再做任何事。

那core 3豈不永遠是最忙的了?呵呵,大家忘了,系統裡總有閒的cpu(哪怕是相對比較閒),它總會執行schedule(),就算它從不呼叫sleep從不睡眠,時鐘中斷也會迫使其程序切換,進而呼叫schedule,進而將繁忙cpu的任務攬一部分到自己身上。這樣,誰最閒,誰早晚會從忙人身上攬活兒過來,所以忙人不會永遠最忙,閒人也不會永遠最閒,所以就平等,就均衡了。

再看try_to_wake_up():

[kernel/sched.c --> try_to_wake_up()]

1398 static int try_to_wake_up(struct task_struct *p, unsigned int state, int sync)

1399

變數this_cpu和變數cpu有什麼區別?變數this_cpu是實際執行這個函式的處理器(「目標處理器」),而變數cpu是程序p在睡眠之前執行的處理器??為了方便我們暫且稱之為「源處理器」。當然,這兩個處理器也可能是同乙個,比如程序p在處理器a上執行,然後睡眠,而執行try_to_wake_up的也是處理器a,其實這樣就最好了,程序p在處理器a裡cache的資料都不用動,直接讓a執行p就行了??這就是1428行的邏輯。

如果this_cpu和cpu不是同乙個處理器,那麼**繼續:

1447     if (this_sd)

1483         }

計算出「目標處理器」和「源處理器」各自的負載(

1453行和1454行),再計算「目標處理器」上的每任務平均負載 

tl_per_task,最後進行判斷:如果「目標處理器」的負載小於「源處理器」的負載且兩處理器負載相加都比 tl_per_task小的話,喚醒的程序轉為「目標處理器」執行。還有一種情況就是1474行的判斷,如果「目標處理器」的負載加上被喚醒的程序的負載後,還比「源處理器」的負載(乘以imbalance後)的小的話,也要把喚醒的程序轉為「目標處理器」執行。如果兩個因素都不滿足,那還是由p程序原來呆的那個cpu(即」源處理器「)繼續來處理吧。

有點兒繞,是吧?其實**雖繞,用意是簡單的:

1472行-1473行其實是這樣乙個用意:如果「目標處理器」的負載很小,小得即使把壓力全給到「源處理器」上去也不會超過「源處理器」上的平均任務負載,那麼這「目標處理器」的負載是真的很小,值得把p程序挪過來。

1474行的用意則是:如果我們真的把p程序挪到「目標處理器」以後,「目標處理器」的壓力也不比「源處理器」大多少,所以,還是值得一挪。

說來說去,還是那個笨原則:把任務從最忙的cpu那兒轉到很閒的cpu這兒。

我們已經看過了睡眠和醒來時的核心函式,那麼軟中斷裡的

run_rebalance_domains又幹了些什麼呢?其實也很簡單,它呼叫了load_balance函式,而這個函式和load_balance_newidle實現上基本一樣,就不累述了。

linux在多核處理器上的負載均衡原理

現在網際網路公司使用的都是多cpu 多核 的伺服器了,linux作業系統會自動把任務分配到不同的處理器上,並盡可能的保持負載均衡。那linux核心是怎麼做到讓各個cpu的壓力均勻的呢?做乙個負載均衡機制,重點在於 1.何時檢查並調整負載情況?2.如何調整負載?先看第乙個問題。如果讓我這樣的庸俗程式設...

linux在多核處理器上的負載均衡原理

現在網際網路公司使用的都是多cpu 多核 的伺服器了,linux作業系統會自動把任務分配到不同的處理器上,並盡可能的保持負載均衡。那linux核心是怎麼做到讓各個cpu的壓力均勻的呢?做乙個負載均衡機制,重點在於 1.何時檢查並調整負載情況?2.如何調整負載?先看第乙個問題。如果讓我這樣的庸俗程式設...

linux多核處理器上的負載均衡原理

看到一篇文章,大概給總結了下,就不貼了。現在很多伺服器都是多核伺服器了,linux作業系統會自動把任務分配到不同的處理器上,並盡可能的保持負載均衡。linux多核cpu上負載均衡兩個問題 1.何時檢查並調整負載情況?2.如何調整負載?第乙個問題,可以定時調整負載,這種方法雖然簡單,但不高效。實際上,...