1. 程式人生 > >linux下如何修改程序優先順序

linux下如何修改程序優先順序

Linux 與其他現代作業系統一樣,也可以執行多個程序。它在多個程序之間共享 CPU 和其他資源。如果一個程序佔用了 100% 的 CPU,那麼其他程序將無法響應。

如果執行 top 命令,預設將按照 CPU 使用量的降序顯示程序,如清單 1 所示。在上一篇文章 “學習 Linux,101:建立、監控和終止程序” 中,我們展示了一個簡易的數字時鐘指令碼,它每 30 秒在控制檯列印,其他時間不執行任何操作。如果我們執行該程序,它可以不會出現在 top 的輸出列表上,因為該程序大部分時間不使用 CPU。

清單 1. Linux 工作站上 top 命令的典型輸出
top - 08:00:52 up 1 day, 10:20,  5 users,  load average: 0.04, 0.08, 0.04
Tasks: 172 total,   1 running, 171 sleeping,   0 stopped,   0 zombie
Cpu(s):  3.7%us,  0.3%sy,  0.0%ni, 95.6%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st
Mem:   4057976k total,  1777976k used,  2280000k free,   225808k buffers
Swap: 10241428k total,        0k used, 10241428k free,   655796k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
11220 ian       20   0  555m 106m  27m S    8  2.7  36:06.16 firefox            
    7 root      15  -5     0    0    0 S    1  0.0  10:59.36 ksoftirqd/1        
10849 ian       20   0  212m  15m  10m S    0  0.4   0:08.11 gnome-terminal     
    1 root      20   0 19584 1888 1196 S    0  0.0   0:00.83 init               
    2 root      15  -5     0    0    0 S    0  0.0   0:00.01 kthreadd           
    3 root      RT  -5     0    0    0 S    0  0.0   0:00.02 migration/0        
    4 root      15  -5     0    0    0 S    0  0.0   0:01.08 ksoftirqd/0        
    5 root      RT  -5     0    0    0 S    0  0.0   0:00.00 watchdog/0         
    6 root      RT  -5     0    0    0 S    0  0.0   0:00.03 migration/1

您的系統可能有很多命令都會佔用大量 CPU。比如視訊編輯工具、轉換不同圖片格式的程式或者音訊編碼轉換程式(如將 mp3 轉換為 ogg)等。

如果您只有一個 CPU 或者 CPU 的數量有限,那麼必須決定如何在幾個計算程序之間共享這些有限的 CPU 資源。通常的做法是,選擇一個要執行的程序,並讓它在短時間內執行(這個時間稱為時間片),或者一直執行到它需要等待的一些事件,如要完成的 IO 等。為了確保重要的程序能夠得到 CPU,這種選擇是基於排程優先順序 程序的。清單 1 中的 NI 列展示了排程優先順序或者說每個程序的 niceness。niceness 的範圍一般從 -20 到 19,-20 表示排程優先順序最高,19 表示優先順序最低。

使用 ps 檢視 niceness

除了 top 命令之外,您還可以使用 ps 命令顯示 niceness 值。您可以按照從文章 “學習 Linux,101:建立、監控和終止程序” 中學到的方式自定義輸出,也可以使用 -l 選項獲取長清單。ps -l 的結果如清單 2 所示。如果使用 top 命令,請在 NI 列中檢視 niceness 值。

清單 2. 使用 ps 檢視 niceness
[email protected]:~$ ps -l
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000 26502 26501  0  80   0 -  5368 wait   pts/4    00:00:00 bash
0 R  1000 27046 26502  0  80   0 -  1684 -      pts/4    00:00:00 ps

niceness 的預設值

從清單 1 和清單 2 中我們可以猜測出,常規使用者所啟用程序的 niecess 的預設值是 0。在當前的 Linux 系統中通常是這樣。您可以執行 nice 命令且不帶任何引數,以此驗證您的 shell 和系統中的該值,如清單 3 所示。

清單 3. 檢視預設 niceness
[email protected]:~$ nice
0

設定優先順序

在檢視如何設定或更改 niceness 值之前,我們先構建一個 CPU 密集型小指令碼,演示 niceness 的工作方式。

CPU 密集型指令碼

我們將建立一個小指令碼,它佔用較多的 CPU,但執行的操作很簡單。該指令碼有兩個輸入:計數和標籤。它列印標籤以及當前的日期和時間,然後旋轉,遞減計數,直到它到達 0,最後再次列印標籤和日期。該指令碼如清單 4 所示,它沒有任何錯誤檢查機制,也不是非常穩定,但是它足以滿足我們的演示需要。

清單 4. CPU 密集型指令碼
[email protected]:~$ echo 'x="$1"'>count1.sh
[email protected]:~$ echo 'echo "$2" $(date)'>>count1.sh
[email protected]:~$ echo 'while [ $x -gt 0 ]; do x=$(( x-1 ));done'>>count1.sh
[email protected]:~$ echo 'echo "$2" $(date)'>>count1.sh
[email protected]:~$ cat count1.sh
x="$1"
echo "$2" $(date)
while [ $x -gt 0 ]; do x=$(( x-1 ));done
echo "$2" $(date)

如果在系統上執行該指令碼,它的輸出將類似於清單 5。您可能需要增加計數值以檢視時間的不同,具體取決於您系統的速度。該指令碼將佔用大量 CPU,等會我們就會看到這一點。如果您的預設 shell 不是 Bash,如果您的指令碼無法執行,那麼可以使用下文所示的第二種呼叫形式。如果您使用的不是自己的工作站,執行指令碼前請確保佔用大量 CPU 不會導致不良影響。

清單 5. 執行 count1.sh
[email protected]:~$ sh count1.sh 10000 A
A Wed Jan 20 08:34:16 EST 2010
A Wed Jan 20 08:34:16 EST 2010
[email protected]:~$ bash count1.sh 99000 A
A Wed Jan 20 08:34:20 EST 2010
A Wed Jan 20 08:34:22 EST 2010

到目前為止一切順利。現在讓我們建立一個在後臺執行的指令碼,並啟動 top 命令檢視指令碼所用 CPU 的命令清單(請參見之前的文章 “學習 Linux,101:Linux 命令列” 瞭解最新的命令清單)。命令清單如清單 6 所示,top 的輸出見清單 7。

清單 6. 執行 count1.sh 和 top
[email protected]:~$ (sh count1.sh 5000000 A&);top
清單 7. 佔用大量 CPU
top - 15:41:15 up 1 day, 17:59,  6 users,  load average: 0.20, 0.06, 0.02
Tasks: 169 total,   2 running, 167 sleeping,   0 stopped,   0 zombie
Cpu(s): 52.1%us,  0.7%sy,  0.0%ni, 47.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   4057976k total,  1393772k used,  2664204k free,   235596k buffers
Swap: 10241428k total,        0k used, 10241428k free,   662592k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
26756 ian       20   0  4004  588  496 R  100  0.0   0:03.53 sh
11220 ian       20   0  555m 101m  27m S    5  2.6  57:58.07 firefox
26757 ian       20   0 19132 1364  980 R    0  0.0   0:00.03 top
    1 root      20   0 19584 1888 1196 S    0  0.0   0:00.89 init
    2 root      15  -5     0    0    0 S    0  0.0   0:00.01 kthreadd

不錯。我們只使用了一個簡單的指令碼就佔用了系統中一個 CPU 100% 的資源。如果希望佔用多個 CPU,您可以在命令清單中新增對 count1.sh 的呼叫。如果執行過類似的作業,您會發現我們將無法在系統上執行其他工作(其他使用者也是如此)。

使用 nice 設定優先順序

現在我們可以讓 CPU 持續忙碌一段時間,我們瞭解如何設定程序的優先順序。目前我們學到的內容總結如下:

  • Linux 和 UNIX® 系統使用有 40 個優先順序的優先順序系統,範圍從 -20(最高優先順序)到 19(最低優先順序)。
  • 常規使用者啟動的程序優先順序一般是 0。
  • ps 命令可以使用 -l 選項顯示優先順序(例如,nice 或 NI、level)。
  • nice 命令顯示我們的預設優先順序。

nice 命令還可以用來啟動具有不同優先順序的程序。使用 -n 或 (--adjustment) 選項時帶一個負值可以增加優先順序值,帶一個正值將減少優先順序值。記住,具有最低優先順序值的程序執行時有最高排程優先順序,因此可以這樣記憶,增加優先順序值對於其他程序而言更好(nice)。注意,您必須是超級使用者(根使用者)才能調低優先順序值。換句話說,常規使用者通常只能增加它們的優先順序值。

為了演示如何使用 nice 設定優先順序,首先同時在不同的 subshell 中啟動兩個 count1.sh 指令碼的副本,但是將其中一個的 nice 值設定為最大值 19。一會兒之後,我們使用 ps -l 顯示程序狀態,包括 niceness。最後,我們新增任意 30 秒的休眠時間,確保兩個 subshell 完成之後命令序列完成。這樣一來,我們在等待輸出時不會得到新的提示。結果如清單 8 所示。

清單 8. 使用 nice 設定一對程序的優先順序
[email protected]:~$ (sh count1.sh 2000000 A&);(nice -n 19 sh count1.sh 2000000 B&);\
> sleep 1;ps -l;sleep 10
A Thu Jan 21 14:38:39 EST 2010
B Thu Jan 21 14:38:39 EST 2010
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 R  1000   946     1 99  80   0 -  1001 -      pts/3    00:00:01 sh
0 R  1000   948     1 99  99  19 -  1001 -      pts/3    00:00:01 sh
0 R  1000   952 32408  0  80   0 -  1684 -      pts/3    00:00:00 ps
0 S  1000 32408 32407  0  80   0 -  5368 wait   pts/3    00:00:02 bash
A Thu Jan 21 14:38:45 EST 2010
B Thu Jan 21 14:38:45 EST 2010

您對兩個作業同時完成感到奇怪嗎?我們的優先順序設定怎麼了?記住,指令碼佔用了一個 CPU。這個系統執行在 AMD Athlon™ 7750 雙核處理器上,它的負載很輕,每個核心執行一個程序,不需要進行優化。

那麼,讓我們使用 4 個不同的 niceness 水平(0、6、12、18)啟動 4 個程序檢視會發生什麼情況。我們將增加每個程序的忙碌計數引數使之執行的時間更長一些。檢視清單 9 之前,請根據您瞭解的內容,預期一下會發生什麼情況。

清單 9. 使用 nice 設定 4 個程序的屬性
[email protected]:~$ (sh count1.sh 5000000 A&);(nice -n 6 sh count1.sh 5000000 B&);\
> (nice -n 12 sh count1.sh 5000000 C&);(nice -n 18 sh count1.sh 5000000 D&);\
> sleep 1;ps -l;sleep 30
A Thu Jan 21 16:06:00 EST 2010
C Thu Jan 21 16:06:00 EST 2010
D Thu Jan 21 16:06:00 EST 2010
B Thu Jan 21 16:06:00 EST 2010
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 R  1000  1422     1 94  80   0 -  1001 -      pts/3    00:00:00 sh
0 R  1000  1424     1 42  86   6 -  1001 -      pts/3    00:00:00 sh
0 R  1000  1427     1 56  92  12 -  1001 -      pts/3    00:00:00 sh
0 R  1000  1431     1 14  98  18 -  1001 -      pts/3    00:00:00 sh
0 R  1000  1435 32408  0  80   0 -  1684 -      pts/3    00:00:00 ps
0 S  1000 32408 32407  0  80   0 -  5368 wait   pts/3    00:00:02 bash
A Thu Jan 21 16:06:14 EST 2010
B Thu Jan 21 16:06:17 EST 2010
C Thu Jan 21 16:06:26 EST 2010
D Thu Jan 21 16:06:30 EST 2010

使用 4 個不同的優先順序我們發現,每個作業按照優先順序順序完成。請自行嘗試不同的 nice 值演示各種可能的情況。

使用 nice 啟動程序最後要注意的一點是:使用 nohup 命令時,不能使用命令清單或管道作為 nice 的引數。

更改優先順序

renice

如果您正好啟動了一個程序,但意識到它應該以不同的優先順序執行,那麼有一種方法可以在啟動之後對其進行更改,即使用 renice 命令。您可以為程序指定一個絕對優先順序(不是調整值),程序的更改如清單 10 所示。

清單 10. 使用 renice 更改優先順序
[email protected]:~$ sh count1.sh 10000000 A&
[1] 1537
[email protected]:~$ A Thu Jan 21 16:17:16 EST 2010
sh count1.sh 1renice 1 1537;ps -l 1537
1537: old priority 0, new priority 1
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY        TIME CMD
0 R  1000  1537 32408 99  81   1 -  1001 -      pts/3      0:13 sh count1.sh 100
[email protected]:~$ renice +3 1537;ps -l 1537
1537: old priority 1, new priority 3
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY        TIME CMD
0 R  1000  1537 32408 99  83   3 -  1001 -      pts/3      0:18 sh count1.sh 100

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

另一種修改執行程序優先順序方法:

top命令

先鍵入top命令,top執行後,鍵入r,提示PID to renice:  如下圖:

鍵入所需修改優先順序的PID,提示"Renice PID  to value:" ,鍵入niceness值,完成優先順序修改。

Attention: 您必須是超級使用者才能為程序指定更高的排程優先順序,或者說讓它們的 nice 值更低。

相關推薦

linux如何修改程序優先順序

Linux 與其他現代作業系統一樣,也可以執行多個程序。它在多個程序之間共享 CPU 和其他資源。如果一個程序佔用了 100% 的 CPU,那麼其他程序將無法響應。 如果執行 top 命令,預設將按照 CPU 使用量的降序顯示程序,如清單 1 所示。在上一篇文章 “學習 L

Linux設定程序執行優先順序

Linux系統下提升執行中程序優先順序的方法 Linux系統程序的優先順序取值:-20 到 19,數越大優先順序越低。 可以通過top命令來檢視,NI那一列。 改變程序的優先順序的方法有兩種:(需要

Linux環境提高程序優先順序

在嵌入式Linux系統中,大多都是跑一個核心的業務,在資料吞吐量大的時候,會大量佔用CPU,導致資料處理不過來,常規辦法是優化程式或者更換更高效能的平臺來解決,但是如果程式已經優化到極限和平臺無法更換的情況下,可以通過提高業務程序的優先順序來提高業務資料的吞吐量,例如

linux修改文件後戳

linux 後戳 文件1、使用rename修改文件後戳修改前:[[email protected]/* */ ]# ll total 2548 -rw-r--r--. 1 root root 1282047 Jun 20 10:15 stu1.doc -rw-r--r--. 1 root ro

linux修改rm命令防止誤刪除

寫上 linu rm -rf 目錄權限 執行權限 一個 remove 但是 bsp 前言:相信很多朋友都遇到過在linux下用rm命令誤刪除文件的時候,此刻的心中仿佛有無數的羊駝在奔騰。那麽怎麽防止這種情況發生呢?當然是有方法的,我們可以寫一個shell腳本,改變一下rm命

Linux修改.bash_profile 文件改變PATH變量的值

oot 兩個 超級用戶 pat 設置 inux 需要 其中 lin Linux中含有兩個重要的文件 /etc/profile和$HOME/.bash_profile 每當系統登陸時都要讀取這兩個文件,用來初始化系統所用到的變量,其中/etc/profile是超級用戶所用,$

Linux修改/設置環境變量JAVA_HOME

linux下修改/設置環境變量java_hom1. 永久修改,對所有用戶有效 # vi /etc/profile //按鍵盤[Shift + g], 在profile文件最後添加下面的內容:JAVA_HOME=/usr/local/java/jdk1.7.0_25 JRE_HOME=$JAVA_H

Linux修改Tomcat默認端口

目錄 var shutdown 修改端口 sta server star 保存 檢索 假設tomcat所在目錄為/usr/local/apache-tomcat/ 1、打開tomcat配置文件#vi /usr/local/apache-tomcat/conf/server.

修改密碼】Linux修改Mysql的用戶(root)的密碼

exit 用戶 mysql use 操作 -- 原來 都沒有 註意 修改的用戶都以root為列。一、擁有原來的myql的root的密碼;方法一:在mysql系統外,使用mysqladmin# mysqladmin -u root -p password "test123"E

linux部署程序,tomcat啟動正常,但網頁無法訪問

tom 環境部署 firewalld png 開啟 但是 system emctl 圖片 問題背景:測試環境部署程序,之前是可以的。但是在安裝rabbitmq的時候,再來打開網頁的時候就出現一直轉圈圈,網頁無法打開。 經過檢查發現是由於開啟了防火墻。 系統是cento

linux修改apt下載源

TP CP sta AC itl .com nload 科大 data 很多時候使用apt install命令會出現Unable to fetch somearchives的錯誤,我們需要運行以下apt update,可是經常會出現下載速度很慢的情況 這裏就記一下將apt的

Linux修改Mysql密碼的三種方式,測試過效果,能正常使用

密碼 root mysq cat 服務 方法 方式 運行 mysql密碼 個人分類: mysql修改密碼linux修改mysql密碼軟件編程 有時我們會忘記Mysql的密碼,或者想改一個密碼,以下將對這兩種情況修改密碼的三種解決方法做個總結 本文都以用戶為 root 為例;

Linuxmysql程序死掉,InnoDB: mmap(137363456 bytes) failed; errno 12解決方法

這個問題一直困擾了我很久,在網上查找了很多資料一直沒解決我的問題,mysql解除安裝一次又裝一次還是會有這個問題. 問題還原:mysql啟動時是SUCCESS!但是過了一段時間,程序就死掉了,遠端連線失敗,重啟mysql會報錯,錯誤資訊如下: Starting MySQL../usr/loc

Linux程序通訊方式: 管道通訊詳解

管道是單向的、先進先出的、無結構的位元組流,它把一個程序的輸出和另一個程序的輸入連線在一起。 寫程序在管道的尾端寫入資料,讀程序在管道的首端讀出資料。資料讀出後將從管道中移走,其它讀程序都不能再讀到這些資料。 管道提供了簡單的流控制機制。程序試圖讀一個空管道時,在資料寫入管道前,程序將一直阻塞。

Linux建立程序的三種方式及特點

在Linux中主要提供了fork、vfork、clone三個程序建立方法。  在linux原始碼中這三個呼叫的執行過程是執行fork(),vfork(),clone()時,通過一個系統呼叫表對映到sys_fork(),sys_vfork(),sys_clone(),再在這三個函式中去呼叫d

Linux修改tomcat埠

假設tomcat所在目錄為/usr/local/apache-tomcat/ 1、開啟tomcat配置檔案 vi /usr/local/apache-tomcat/conf/server.xml 2、開啟Tomcat配置檔案之後按 /8080 快速檢索 3、將8080 修

Linux修改mysql的root密碼

下面是具體步驟 一、知道原來的myql資料庫的root密碼; 1、 在終端命令列輸入  mysqladmin -u root -p password "新密碼" 回車 ,Enter password: 【輸入原來的舊密碼】 2、 登入mysql系統

【轉】Linuxjava程序CPU佔用率高分析方法

文章轉載的地址: https://blog.linuxeye.cn/343.html   在工作當中,肯定會遇到由程式碼所導致的高CPU耗用以及記憶體溢位的情況。這種情況發生時,我們怎麼去找出原因並解決。 一般解決方法是通過top命令找出消耗資源高的執行緒id,利用strace命令檢視該執行緒

linux修改安裝版jenkins預設埠號

網上找的基本都是war版修改的方法,注意本文是針對安裝版的jenkins客戶端,war版的可以丟到tomcat裡面啟動個人覺得也沒修改的必要,jenkins預設埠號為8080,因為tomcat預設埠號也是8080,為了避免衝突,安裝版jenkins埠號一般都需要改變。   #

Linux應用程序消失原因分析

應用部署在Linux環境下,如果出現未知原因導致應用程序被殺(應用日誌中沒有任何異常現象,日誌出現中斷現象),如果對於程序消失原因沒有特別明確的方向,可以考慮從系統日誌方面查詢原因。 命令參考 dmesg | egrep -i -B100 'killed process' ##