Priority 與 Nice 值(鳥哥的私房菜)

我們知道 CPU 一秒鐘可以運行多達數 G 的微命令次數,透過核心的 CPU 排程可以讓各程序被 CPU 所切換運行, 因此每個程序在一秒鐘內或多或少都會被 CPU 運行部分的命令碼。如果程序都是集中在一個對列中等待 CPU 的運行,而不具有優先順序之分。如下圖所示:


圖 3.3.1、沒有優先順序的程序隊列示意圖

上圖中假設 pro1, pro2 是緊急的程序, pro3,pro4 是一般的程序,在這樣的環境中,由於不具備優先權次序, 因此pro1, pro2要繼續等待。如果 pro3, pro4 的工作太長!那麼緊急的 pro1, pro2 就得要等待ro3, pro4完成才能夠完成!所以我們想要將程序分優先順序!如果優先序較高則運行次數可以較多次, 而不需要與較慢優先的程序搶位置!我們可以將程序的優先順序與 CPU 排程進行如下圖的解釋:


圖 3.3.2、具有優先順序的程序佇列示意圖

如上圖所示,具高優先權的 pro1, pro2 可以被取用兩次,而較不重要的 pro3, pro4 則運行次數較少。 如此一來 pro1, pro2 就可以較快被完成!要注意,上圖僅是示意圖,並非較優先者一定會被運行兩次!爲了要達到上述的功能,我們 Linux 給予程序一個所謂的優先運行序(priority, PRI), 這個 PRI 值越低代表越優先的意思。不過這個 PRI 值是由核心動態調整的, 使用者無法直接調整 PRI 值的。先來瞧瞧 PRI 曾在哪裏出現:

 

 

[root@www ~]# ps -l

F S   UID   PID PPID  C PRI  NI ADDR SZ WCHAN  TTY         TIME CMD

4 S     0 1862518623  2 75   0 -  1514 wait  pts/1    00:00:00 bash

4 R     0 1865318625  0 77   0 -  1102 -     pts/1    00:00:00 ps

由於PRI 是核心動態調整的,我們使用者也無權去幹涉 PRI !那如果你想要調整程序的優先運行序時,就得要透過 Nice 值了!Nice 值就是上表的NI 啦!一般來說, PRI 與 NI 的相關性如下:

PRI(new) = PRI(old) + nice

不過你要特別留意到,如果原本的 PRI 是 50 ,並不是我們給予一個nice = 5 ,就會讓 PRI 變成 55 喔!因爲 PRI 是系統『動態』決定的,所以,雖然 nice 值是可以影響 PRI ,不過, 最終的 PRI 仍是要經過系統分析後纔會決定的。另外, nice 值是有正負的,而既然 PRI 越小越早被運行, 所以,當 nice 值爲負值時,那麼該程序就會降低 PRI 值,亦即會變的較優先被處理。此外,你必須要留意到:

  • nice 值可調整的範圍爲 -20 ~ 19 ;
  • root 可隨意調整自己或他人程序的 Nice 值,且範圍爲     -20 ~ 19 ;
  • 一般使用者僅可調整自己程序的 Nice 值,且範圍僅爲 0 ~ 19 (避免一般用戶搶佔系統資源);
  • 一般使用者僅可將     nice 值越調越高,例如本來 nice 爲 5 ,則未來僅能調整到大與 5;

這也就是說,要調整某個程序的優先運行序,就是調整該程序的 nice 值!那麼如何給予某個程序 nice 值呢?有兩種方式,分別是:

  • 一開始運行程序就立即給予一個特定的 nice 值:用 nice 命令;
  • 調整某個已經存在的     PID 的 nice 值:用 renice 命令。

 


  • nice :新運行的命令即給予新的     nice 值

 

[root@www ~]# nice [-n 數字] command

選項與參數:

-n  :後面接一個數值,數值的範圍 -20 ~ 19。

 

範例一:用 root 給一個nice 值爲 -5 ,用於運行 vi ,並觀察該程序!

[root@www ~]# nice -n -5 vi &

[1] 18676

[root@www ~]# ps -l

F S   UID   PID PPID  C PRI  NI ADDR SZ WCHAN  TTY         TIME CMD

4 S     0 1862518623  0 75   0 -  1514 wait  pts/1    00:00:00 bash

4 T     0 1867618625  0 72  -5 -  1242 finish pts/1    00:00:00 vi

4 R     0 1867818625  0 77   0 -  1101 -     pts/1    00:00:00 ps

# 原本的 bash PRI 爲 75  ,所以 vi 默認應爲 75。不過由於給予 nice  爲 -5 ,

# 因此 vi 的 PRI 降低了!但並非降低到70 ,因爲核心還會動態調整!

 

[root@www ~]# kill -9 18676 <==測試完畢將 vi 關閉

就如同前面說的, nice 是用來調整程序的運行優先順序! 通常什麼時候要將 nice 值調大呢?舉例來說,系統的背景工作中, 某些比較不重要的程序執行:例如備份工作!由於備份工作相當的耗系統資源,這個時候就可以將備份的命令之 nice 值調大一些,可以使系統的資源分配的更爲公平!


  • renice :已存在程序的     nice 重新調整

[root@www ~]# renice [number] PID

選項與參數:

PID :某個程序的 ID 啊!

 

範例一:找出自己的 bash PID ,並將該 PID 的 nice 調整到 10

[root@www ~]# ps -l

F S   UID   PID PPID  C PRI  NI ADDR SZ WCHAN  TTY         TIME CMD

4 S     0 1862518623  0 75   0 - 1514 wait   pts/1    00:00:00 bash

4 R     0 1871218625  0 77   0 -  1102 -     pts/1    00:00:00 ps

 

[root@www ~]# renice 10 18625

18625: old priority 0, new priority 10

 

[root@www ~]# ps -l

F S   UID   PID PPID  C PRI  NI ADDR SZ WCHAN  TTY         TIME CMD

4 S     0 1862518623  0 85  10 -  1514 wait  pts/1    00:00:00 bash

4 R     0 1871518625  0 87  10 -  1102 -     pts/1    00:00:00 ps

如果要調整的是已經存在的某個程序的話,那麼就得要使用 renice 了。使用的方法很簡單, renice 後面接上數值及 PID 即可。因爲後面接的是 PID ,所以你務必要以 ps 或者其他程序觀察的命令去找出 PID 才行啊!

由上面這個範例當中我們也看的出來,雖然修改的是 bash 那個程序,但是該程序所觸發的 ps 命令當中的 nice 也會繼承而爲 10 喔!瞭解了吧!整個 nice 值是可以在父程序 --> 子程序之間傳遞的呢! 另外,除了 renice 之外,其實那個top 同樣的也是可以調整 nice 值的!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章