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

2021-05-23 07:22:20 字數 1275 閱讀 8073

看到一篇文章,大概給總結了下,**就不貼了。

現在很多伺服器都是多核伺服器了,linux作業系統會自動把任務分配到不同的處理器上,並盡可能的保持負載均衡。

linux多核cpu上負載均衡兩個問題:

1. 何時檢查並調整負載情況?

2. 如何調整負載?

第乙個問題,可以定時調整負載,這種方法雖然簡單,但不高效。實際上,2.6.20版linux kernel的確使用軟中斷來定時調整多cpu上的壓力(呼叫函式run_rebalance_domains),每秒1次。每秒1次還不夠,kernel需要緊跟程序的變化來調整,所以核心在程序睡眠和醒來這兩個時間點檢查cpu們的負載。

第二個問題,調整負載的策略就是將任務從最繁忙的cpu上遷移到空閒的cpu上。linux在實現上更多的考慮了cpu的結構。多核處理器都是片上多核,然後有多個處理器。就是乙個chip上有多個cpu,即片上多核。同乙個chip上的cpu共享l2快取記憶體。所以linux為了在調整負載時繼續利用快取,也就為了避免快取失效,盡量在乙個chip內遷移程序。

smp負載均衡檢查或調整在兩個核心函式裡發生:

1. schedule()。當程序呼叫了sleep、usleep、poll、epoll、pause時,也就是呼叫了可能睡去的操作時都會轉為核心**裡對schedule()函式的呼叫。

2. try_to_wake_up() 。說白了就是程序剛才睡了,現在要醒來,那醒來以後跑在哪個cpu上呢?這個選擇cpu的過程,也就是負載均衡的過程。

具體的實現就是針對當前cpu所屬的每個domain(從子到父),找到該sched_domain裡最忙的sched_group,再從該group裡找出最忙的執行佇列,最後從該「最忙」執行佇列裡挑出幾個程序到當前cpu的執行佇列裡。順序就是core cpu->processor從子到父的順序。

具體遷移多少程序也是有限制的,這個就可以不用太關注了。

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

詳細可以參考鏈結

其實這個實現策略因為考慮了硬體上效能和特點,這樣實現簡單而且效率比較好。關於分布式系統的負載均衡技術還需要多關注。

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

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

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

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

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

假如現在是 core 3 在執行idle balance,則先在domain 1裡找最忙的group,找到第二忙的group是core 0 core 4不在domain 1裡,所以不會找到它 再從core 0裡找最忙的runqueue 執行佇列 core 0就乙個執行佇列,所以直接就是它對應的run...