天天看點

CFS排程器的藝術--虛拟時鐘從實體HZ中分離

如果你覺沒有從cfs中看到什麼,那麼最簡單我告訴你,就是提高了響應速度,為何呢?在shell下執行vmstat,觀察cs字段,也就是1秒内程序切換的次數,然後盡量滿載系統,觀察cs和誰有關,它的值和程序的數量,程序的優先級有關,當程序的優先級很大的時候,cs的值就會減少,反之cs值會增加,我們看看這是為什麼,O(1)排程器中,時間片的配置設定是絕對的配置設定,也就是說排除程序饑餓和核心搶占,每個程序運作的時間片是絕對的,是按照它的nice值計算出來的,如果說有變動,那也隻是由于優先級動态調整導緻的變化,那時的時間片隻和程序的優先級有關,優先級變化幅度不大,時間片調整的也不多,是以我們不考慮優先級調整,一旦系統負載增加,排程完整個系統的所有程序的時間就會很長,活動程序數量越多,這一段時間就會越長,O(1)排程器中的時間片是固定的,那麼cfs中的呢?

cfs中的時間片是動态配置設定的,是按照比例配置設定的而不是按照優先級固定配置設定的,其精髓就是系統擁有一個可配置的系統排程周期,在該周期内運作完所有的程序,如果系統負載高了,那麼每一個程序在該周期内被配置設定的時間片都會減少,将這些程序減少的部分累積正好就是新程序的時間片,其實完全可以實作一個更簡單的cfs版本,按照固定的順序運作程序,就是将紅黑樹退化成一個先入先出的隊列,每個程序都排入程序,然後運作完按比例配置設定給它的動态時間片之後排入隊列最後,然後繼續下一個程序,如此反複,但是這樣實作的話很不靈活,很難實作核心的實時搶占和新程序的搶占以及程序喚醒後的補償,于是紅黑樹完美的解決了這一個問題,于是就出現了虛拟時鐘的概念,每一個程序都有一個虛拟時鐘,按照不同的速率在每一個實體時鐘節拍内向前推進,越高權值的程序的推進速率越慢,這樣它就可以運作更多的實體時間。cfs排程器選擇目前最慢的虛拟時鐘進行推進,做到了公平。

cfs排程器中配置設定的動态時間片和HZ沒有關系,它隻和程序的權值以及目前紅黑樹程序的總權值還有排程周期有關,它本質上是一個相對的概念而不像以前是一個絕對的概念,相對的概念就是比絕對的概念要靈活,比如用相對目錄的程式就比用絕對目錄的程式擁有更好的移植性。cfs排程器将時間片的概念進行了相對了,抽象出了虛拟時鐘的概念,如此一來1秒鐘内的程序切換次數就不再和程序優先值有關了,而是和排程周期和程序數量有關,理論上就是(程序數量)*(1秒/排程周期)次,當然加上搶占和新程序建立就不是這麼理想了,經過試驗,和理論資料差别不大,在同一負載下,提高或者降低多個程序的優先級在O(1)排程器下會引起vmstat中cs的變化,但是在cfs中vmstat中的cs值卻不會受到影響

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1274133