CFS排程的總結 (單rq vs 多rq)

2021-06-04 08:17:11 字數 2172 閱讀 6215

近來和乙個師兄談到了cfs排程演算法,我以前一直以為cfs的任務就緒佇列是全域性的,即有全域性唯一的rq,但是師兄說是per-cpu的,於是回來又仔細分析了下**,發現果然是per-cpu的。由這個簡單的問題先來說說我為啥認為rq是全域性唯一的,然後總結下cfs排程演算法的一些關鍵點。

一、per-cpu的rq和全域性唯一的rq

在linux-2.6核心時代,為了更好的支援多核,linux排程器普遍採用了per-cpu的run queue,從而克服了多cpu系統中,全域性唯一的run queue由於資源的競爭而成為了系統瓶頸的問題,因為在同一時刻,乙個cpu訪問run queue時,其他的cpu即使空閒也必須等待,大大降低了整體的cpu利用率和系統效能。當使用per-cpu的run queue之後,每個cpu不再使用大核心鎖,從而大大提高了並行處理的排程能力。

採用per-cpu的run queue所帶來的好處會被追求公平性的load balance**所抵消。在目前的cfs排程器中,每顆cpu只維護本地run queue中所有程序的公平性,為了實現跨cpu的排程公平性,cfs必須定時進行 load balance,將一些程序從繁忙的cpu的run queue中移到其他空閒的run queue中。這個load balance的過程需要獲得其他run queue的鎖,這種操作降低了多執行佇列帶來的並行性,並且在複雜情況下,這種因 load balance而引入的footprint 將非常可觀。

當然,load balance引入的加鎖操作依然比全域性鎖的代價要低,這種代價差異隨著cpu個數的增加而更加顯著。但請您注意,假若系統中的cpu個數有限時,多run queue的優勢便不明顯了。而採用單一佇列之後,每乙個需要排程的新程序都可以在全域性範圍內查詢最合適的cpu,而無需cfs那樣等待load balance**來決定,這減少了多cpu之間裁決的延遲,最終的結果是更小的排程延遲。

其次,為了維護多cpu上的公平性,cfs採用了負載平衡機制,這些複雜**抵消了per cpu queue曾帶來的好處。

下面的資料是新墨西哥大學的 taylor groves, je knockel, eric schulte對採用per-cpu的run queue和全域性唯一的run queue做的乙個響應時間的試驗。

從上圖可以看出採用全域性唯一單佇列的bfs排程演算法的響應時間明顯優於採用多per-cpu佇列的cfs排程演算法,說明cfs更適於互動式系統,即桌面系統。(當然,並不是說bfs就優於cfs,畢竟不同的應用場景各有優勢,但是cfs考慮的確實太多了,想支援各種情況- cfs 的目標是支援從桌面到高階伺服器的所有應用場景,這種大而全的設計思路導致其必須做一些實現上的折中)。

二、cfs關鍵點總結

1. 虛擬執行時間(vruntime)變化公式

vruntime +

= delta *

(1024/se.load.weight)

;/*delta:程序實際增加的執行時間,即從排程實體被選擇獲得cpu到排程實體放棄cpu這段時間*/

結論:在實際執行時間相同的情況下,排程實體權重越大,vruntime增加的越慢。

2. 程序的理想執行時間計算公式

ideal_time = slice *

(se.load.weight/cfs_rq.load.weight)

;/*slice為cfs執行佇列中所有程序執行一遍所需要的時間*//

*slice的經驗計算公式如下:*/if

(cfs_rq-

>nr_running > 5)

slice = 4 * cfs_rq-

>nr_running;

else

slice = 20;

/*單位ms*/

3. cfs排程時機

在有了上面幾個計算公式之後,就可以總結出cfs排程演算法的幾個排程時機:

(1) 排程實體的狀態轉換的時刻:程序終止、程序睡眠等,廣義上還包括程序的建立(fork);

(2) 當前排程實體的時機執行時間大於理想執行時間(delta_exec > ideal_runtime),這一步在時鐘中斷 處理函式中完成;

(3) 排程實體主動放棄cpu,直接排程schedule函式,放棄cpu

(4) 排程實體從中斷、異常及系統呼叫返回到使用者態時,回去檢查是否需要排程;

CFS排程的總結 (單rq vs 多rq)

近來和乙個師兄談到了cfs排程演算法,我以前一直以為cfs的任務就緒佇列是全域性的,即有全域性唯一的rq,但是師兄說是per cpu的,於是回來又仔細分析了下 發現果然是per cpu的。由這個簡單的問題先來說說我為啥認為rq是全域性唯一的,然後總結下cfs排程演算法的一些關鍵點。一 per cpu...

CFS排程演算法的思想和細節

今天在郵件列表裡面有位朋友問了乙個問題,問題表述如下 在喚醒程序的時候,發現在check preempt wakeup 中.會將 cfs rq next設定為喚醒的程序,cfs rq last設定為當前的執行程序.然後將要喚醒的程序重新入列,即 enqueue task 在pick next tas...

CFS排程演算法的思想和細節

今天在郵件列表裡面有位朋友問了乙個問題,問題表述如下 在喚醒程序的時候,發現在check preempt wakeup 中.會將 cfs rq next設定為喚醒的程序,cfs rq last設定為當前的執行程序.然後將要喚醒的程序重新入列,即 enqueue task 在pick next tas...