linux 提高進程優先級nice+ 進程調度CFS


http://www.cnblogs.com/wang_yb/archive/2012/09/04/2670564.html
http://liwei.life/2016/04/07/linux%E7%9A%84%E8%BF%9B%E7%A8%8B%E4%BC%98%E5%85%88%E7%BA%A7/
http://www.cnblogs.com/imapla/p/4234258.html
http://blog.csdn.net/peimichael/article/details/5218335
nice: 更改優先級 nice
-n 10 bash 如果是超級用戶,則-n后面的值可以為負數:-20<=x<=19 renice: 如果您正好啟動了一個進程,但意識到它應該以不同的優先級運行,那么有一種方法可以在啟動之后對其進行更改,即使用 renice命令。您可以為進程指定一個絕對優先級(不是調整值) renice +x PID x指的是一個數字,PID為需要指定的進程的PID值

  用top或者ps命令會輸出PRI/PR、NI、%ni/%nice這三種指標值,這些到底是什么東西?先給出大概的解釋如下:

  PRI :進程優先權,代表這個進程可被執行的優先級,其值越小,優先級就越高,越早被執行;

  NI :進程Nice值,代表這個進程的優先值;

  %nice :改變過優先級的進程的占用CPU的百分比。

  PRI是比較好理解的,即進程的優先級,或者通俗點說就是程序被CPU執行的先后順序,此值越小進程的優先級別越高。那NI呢?就是我們所要說的nice值了,其表示進程可被執行的優先級的修正數值。如前面所說,PRI值越小越快被執行,那么加入nice值后,將會使得PRI變為:PRI(new)=PRI(old)+nice。由此看出,PR是根據NICE排序的,規則是NICE越小PR越前(小,優先權更大),即其優先級會變高,則其越快被執行。如果NICE相同則進程uid是root的優先權更大。

  在LINUX系統中,Nice值的范圍從-20到+19(不同系統的值范圍是不一樣的),正值表示低優先級,負值表示高優先級,值為零則表示不會調整該進程的優先級。具有最高優先級的程序,其nice值最低,所以在LINUX系統中,值-20使得一項任務變得非常重要;與之相反,如果任務的nice為+19,則表示它是一個高尚的、無私的任務,允許所有其他任務比自己享有寶貴的CPU時間的更大使用份額,這也就是nice的名稱的來意。

  進程在創建時被賦予不同的優先級值,而如前面所說,nice的值是表示進程優先級值可被修正數據值,因此,每個進程都在其計划執行時被賦予一個nice值,這樣系統就可以根據系統的資源以及具體進程的各類資源消耗情況,主動干預進程的優先級值。在通常情況下,子進程會繼承父進程的nice值,比如在系統啟動的過程中,init進程會被賦予0,其他所有進程繼承了這個nice值(因為其他進程都是init的子進程)。

  對nice值一個形象比喻,假設在一個CPU輪轉中,有2個runnable的進程A和B,如果他們的nice值都為0,假設內核會給他們每人分配1k個cpu時間片。但是假設進程A的為0,但是B的值為-10,那么此時CPU可能分別給A和B分配1k和1.5k的時間片。故可以形象的理解為,nice的值影響了內核分配給進程的cpu時間片的多少,時間片越多的進程,其優先級越高,其優先級值(PRI)越低。%nice,就是改變過優先級的進程的占用CPU的百分比,如上例中就是0.5k/2.5k=1/5=20%。

  由此可見,進程nice值和進程優先級不是一個概念,但是進程nice值會影響到進程的優先級變化。

  參考資料:
  [1] http://blog.csdn.net/longdel/article/details/7317511

 

[root@server1 ~]# chrt

chrt - manipulate real-time attributes of a process.

Set policy:
  chrt [options] <policy> <priority> {<pid> | <command> [<arg> ...]}

Get policy:
  chrt [options] {<pid> | <command> [<arg> ...]}


Scheduling policies:
  -b | --batch         set policy to SCHED_BATCH
  -f | --fifo          set policy to SCHED_FIFO
  -i | --idle          set policy to SCHED_IDLE
  -o | --other         set policy to SCHED_OTHER
  -r | --rr            set policy to SCHED_RR (default)

Options:
  -h | --help          display this help
  -p | --pid           operate on existing given pid
  -m | --max           show min and max valid priorities
  -v | --verbose       display status information
  -V | --version       output version information



[root@server1 ~]# chrt -f 1 bash
[root@server1 ~]# chrt -p $$
pid 6496's current scheduling policy: SCHED_FIFO
pid 6496's current scheduling priority: 1

http://blog.sina.com.cn/s/blog_65373f1401017jqx.html

1
.什么是CFS CFS(Completely Fair Scheduler)是Linux 2.6.23中引入的,針對普通進程(linux中除了普通進程之外還有實時進程,實時進程有專門的實時調度器,其實現在kernel/sched_rt.c)的一個調度器。它的實現在kernel/sched_fair.c。 CFS的設計原則是,盡力保證CPU資源在所有可運行進程之間平均划分——假如系統中一共有n個可運行進程,那么在任何時刻,每個可執行進程剛好使用了1/n的CPU資源。注意,紅色字體意味着這只能是一個理想化的模型,在某一時刻(甚至可以說在每一時刻)肯定會有人超過1/n,有人不足1/n,但是CFS會以此模型為目標盡力去做到。 2. vruntime CFS通過為每個可運行進程維護一個虛擬運行時間vruntime來實現它的目標。vruntime記錄了一個可執行進程到當前時刻為止執行的總時間(需要以進程總數n進行歸一化,並且根據進程的優先級進行加權)。CFS每次挑選新進程投入運行的時候,采用的策略超級簡單:挑選vruntime最小的可運行進程p投入運行,當運行了一段時間dt之后,進程p的vruntime相應增加Dt(vruntime+=Dt),然后CFS重新選擇擁有最小vruntime的進程p'投入運行。 需要注意的是,上文中vruntime的增加值Dt並不一定等於dt,Dt的計算需要根據進程的優先級也就是nice值進行加權,並對可執行進程總數n進行歸一化。例如對同樣的dt,高優先級進程的Dt比低優先級進程的Dt小。也就是說高優先級進程的vruntime增加較慢,所以就有更多的機會獲得CPU。 在理想的情況下,CFS應該把時間粒度划分的無限小。當一個可運行進程投入運行時,只運行無限小的時間就交出CPU。這樣就可以滿足任意時刻每個可運行進程的vruntime都相等的理想目標。實際中當然不可能做到無限小,每個進程的運行時間的最小粒度默認是1ms,再小的話,上下文切換的開銷就相當巨大了。 3. 可運行進程的維護 CFS如何快速挑選最小vruntime的可運行進程呢?答案是紅黑樹。紅黑樹是一種准平衡二叉排序樹,也是一種自平衡二叉樹,它的search/insert/delete操作的時間復雜度都是O(log(n)),並具有良好地動態特性(相比AVL樹)。CFS將所有可運行進程組織成一個紅黑樹(rbtree),紅黑樹的key就是進程的vruntime。通過這個rbtree,CFS可以在O(log(n))時間內找到最小vruntime的進程——也就是最左邊的樹節點(leftmost)。並且,CFS會將leftmost節點cache起來,以便加速下一次查找。 在每一次調度中,CFS從rbtree中挑中leftmost進程投入運行,運行完之后增加這個進程的vruntime值,並將其重新insert到rbtree里(如果這個進程沒有被阻塞,即仍然是可運行的)。隨着系統不斷運行,可運行進程會不斷地從rbtree的最左邊delete,再被insert到右邊,是一個很有趣的過程。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM