Linux的進程優先級(6)

發表于:2016-05-10來源:測試窩作者:鄒立巍點擊數: 標簽:linux
新進程的VRUNTIME值 CFS是通過vruntime最小值來選擇需要調度的進程的,那么可以想象,在一個已經有多個進程執行了相對較長的系統中,這個隊列中的vrunti

  新進程的VRUNTIME值

  CFS是通過vruntime最小值來選擇需要調度的進程的,那么可以想象,在一個已經有多個進程執行了相對較長的系統中,這個隊列中的vruntime時間紀錄的數值都會比較長。如果新產生的進程直接將自己的vruntime值設置為0的話,那么它將在執行開始的時間內搶占很多的CPU時間,直到自己的vruntime追趕上其他進程后才可能調度其他進程,這種情況顯然是不公平的。所以CFS對每個CPU的執行隊列都維護一個min_vruntime值,這個值紀錄了這個CPU執行隊列中vruntime的最小值,當隊列中出現一個新建的進程時,它的初始化vruntime將不會被設置為0,而是根據min_vruntime的值為基礎來設置。這樣就保證了新建進程的vruntime與老進程的差距在一定范圍內,不會因為vruntime設置為0而在進程開始的時候占用過多的CPU。

  新建進程獲得的實際vruntime值跟一些設置有關,比如:

  這個文件是fork之后是否讓子進程優先于父進程執行的開關。0為關閉,1為打開。如果這個開關打開,就意味著子進程創建后,保證子進程在父進程之前被調度。另外,在源代碼目錄下的kernel/sched/features.h文件中,還規定了一系列調度器屬性開關。而其中:

  這個參數規定了新進程啟動之后第一次運行會有延時。這意味著新進程的vruntime設置要比默認值大一些,這樣做的目的是防止應用通過不停的fork來盡可能多的獲得執行時間。子進程在創建的時候,vruntime的定義的步驟如下,首先vruntime被設置為min_vruntime。然后判斷START_DEBIT位是否被值為true,如果是則會在min_vruntime的基礎上增大一些,增大的時間實際上就是一個進程的調度延時時間,即上面描述過的calc_delta_fair()函數得到的結果。這個時間設置完畢之后,就檢查sched_child_runs_first開關是否打開,如果打開(值被設置為1),就比較新進程的vruntime和父進程的vruntime哪個更小,并將新進程的vruntime設置為更小的那個值,而父進程的vruntime設置為更大的那個值,以此保證子進程一定在父進程之前被調度。

  IO消耗型進程的處理

  根據前文,我們知道除了可能會一直占用CPU時間的CPU消耗型進程以外,還有一類叫做IO消耗類型的進程,它們的特點是基本不占用CPU,主要行為是在S狀態等待響應。這類進程典型的是vim,bash等跟人交互的進程,以及一些壓力不大的,使用了多進程(線程)的或select、poll、epoll的網絡代理程序。如果CFS采用默認的策略處理這些程序的話,相比CPU消耗程序來說,這些應用由于絕大多數時間都處在sleep狀態,它們的vruntime時間基本是不變的,一旦它們進入了調度隊列,將會很快被選擇調度執行。對比O1調度算法,這種行為相當于自然的提高了這些IO消耗型進程的優先級,于是就不需要特殊對它們的優先級進行“動態調整”了。

  但這樣的默認策略也是有問題的,有時CPU消耗型和IO消耗型進程的區分不是那么明顯,有些進程可能會等一會,然后調度之后也會長時間占用CPU。這種情況下,如果休眠的時候進程的vruntime保持不變,那么等到休眠被喚醒之后,這個進程的vruntime時間就可能會比別人小很多,從而導致不公平。所以對于這樣的進程,CFS也會對其進行時間補償。補償方式為,如果進程是從sleep狀態被喚醒的,而且GENTLE_FAIR_SLEEPERS屬性的值為true,則vruntime被設置為sched_latency_ns的一半和當前進程的vruntime值中比較大的那個。sched_latency_ns的值可以在這個文件中進行設置:

  因為系統中這種調度補償的存在,IO消耗型的進程總是可以更快的獲得響應速度。這是CFS處理與人交互的進程時的策略,即:通過提高響應速度讓人的操作感受更好。但是有時候也會因為這樣的策略導致整體性能受損。在很多使用了多進程(線程)或select、poll、epoll的網絡代理程序,一般是由多個進程組成的進程組進行工作,典型的如apche、nginx和php-fpm這樣的處理程序。它們往往都是由一個或者多個進程使用nanosleep()進行周期性的檢查是否有新任務,如果有責喚醒一個子進程進行處理,子進程的處理可能會消耗CPU,而父進程則主要是sleep等待喚醒。這個時候,由于系統對sleep進程的補償策略的存在,新喚醒的進程就可能會打斷正在處理的子進程的過程,搶占CPU進行處理。當這種打斷很多很頻繁的時候,CPU處理的過程就會因為頻繁的進程上下文切換而變的很低效,從而使系統整體吞吐量下降。此時我們可以使用開關禁止喚醒搶占的特性。

原文轉自:http://www.testwo.com/article/659

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97