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 為例;
Linux下mysql程序死掉,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系統
【轉】Linux下java程序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' ##