Linux nice 指令:設定優先順序、用 renice 變更,實測爭用 CPU 時分到的份額
Linux nice 指令是用來設定 nice 值(-20~19)的指令,nice 值決定程式執行時要把多少 CPU 讓給其他工作。在 AlmaLinux 9 伺服器上把兩個工作綁在同一個 CPU 核心,並一邊變更 nice 值一邊測量,結果只有在爭用 CPU 時才會分份額,nice 19 的工作只用了 1.4%。
已在執行的程序用 renice 變更,磁碟方面的讓出則由 ionice 負責。三個指令都直接用 root 帳號和一般帳號執行,並照原樣列出輸出。
1️⃣ Linux nice 指令:值的範圍與爭用 CPU 時的份額
nice 值是決定分配 CPU 時間時讓出多少的數字,可以設定 -20 到 19。一般程式以 0 執行,-20 最先處理,19 讓出最多。
很容易以為數字越大越先處理,但 nice 值正好相反。Linux 排程器替每個 nice 值訂出權重,並依這個比例分配 CPU 時間:nice 0 是 1024,10 是 110,19 是 15。
只有在爭用 CPU 時才會讓出。有閒置的 CPU 時,nice 19 的工作也不必等待就能執行。就像公車上的博愛座,空著時誰都能坐,只有擁擠時才讓座。
權重表是 Linux 核心原始碼 [kernel/sched/core.c] 中的 [sched_prio_to_weight] 陣列,設計成 nice 值每增加 1,CPU 時間就減少約 10%。
2️⃣ nice 基本用法:省略數字時 +10,以及超出範圍的值
在 nice 後面接指令,會以變更後的 nice 值執行那個指令;不接指令直接輸入 nice,則會輸出目前 shell 的 nice 值。
nice0下面的例子是讓執行的 bash 用 [ps -o ni=] 輸出自己 nice 值的指令。不加 -n 執行時會在目前的值加上 10,-n 5 則加上 5。
nice bash -c 'ps -o ni= -p $$' 10nice -n 5 bash -c 'ps -o ni= -p $$' 5超出範圍的值不會報錯,而是調整為邊界值,-n 50 會以 19 執行。
nice -n 50 bash -c 'ps -o ni= -p $$' 19用負值往前提只有 root 帳號能做。一般帳號會出現 [cannot set niceness] 警告,指令照樣以 nice 0 執行。
# 一般帳號
nice -n -5 bash -c 'ps -o ni= -p $$'nice: cannot set niceness: Permission denied
0# root 帳號
nice -n -5 bash -c 'ps -o ni= -p $$' -5用 nice 執行的指令再啟動的子程序,也會以相同的 nice 值執行。
nice -n 7 bash -c 'sleep 1 & ps -o ni= -p $!' 7所以用 nice 執行一個指令碼時,裡面的所有指令都會一起讓出。
3️⃣ renice:變更執行中程序的 nice 值
nice 只在啟動時設定值,所以已在執行的程序要用 renice 變更。請先用 top 的 NI 欄或 ps 確認 PID 與目前的值。
ps -o pid,ni,cmd -p 201643 PID NI CMD
201643 5 sleep 600renice -n 10 -p 201643201643 (process ID) old priority 5, new priority 10如輸出所示,renice -n 不是在目前的值上相加,而是設成指定的值,所以結果是 10,而不是 5 加 10 的 15。這不像按冷氣遙控器的 ▲ 鍵往上調一格,而像是把設定溫度直接指定為 24 度。
util-linux 官方文件也把 -n 說明為絕對值,相加的方式則由新版的 [--relative] 選項負責。測試的 util-linux 2.37.4 還沒有這個選項。
一般帳號只能調高自己程序的值,一旦調高就無法再調低。
# 一般帳號
renice -n 10 -p 201649201649 (process ID) old priority 0, new priority 10renice -n 5 -p 201649renice: failed to set priority for 201649 (process ID): Permission deniedroot 帳號也可以調低,在同一次測試中直接把 10 改成了 3。
🔲 nice · renice 模擬器
在下方以一般帳號登入的模擬器中,可以自己輸入 nice 和 renice,確認 nice 值的變化。
4️⃣ 實測爭用 CPU 時的份額:nice 0 vs 0·10·19
調高 nice 值不代表那個工作一定會變慢。只有在和其他工作爭用同一個 CPU 時,份額才會減少。
把兩個工作綁在一個 CPU 核心上(taskset),同時執行下面這個在 5 秒內一個一個往上數的指令碼。數到的數字越大,代表用掉的 CPU 時間越多。
#!/bin/bash
end=$((SECONDS+5)); n=0
while [ $SECONDS -lt $end ]; do n=$((n+1)); done
echo $n指令碼會把 n 每次加 1,直到經過 5 秒,再輸出最後的值。
兩個 nice 0 各分一半,nice 10 約用 10%,nice 19 只用 1.4%。這和用核心權重算出的比例(1024 : 110 為 90.3 : 9.7,1024 : 15 為 98.6 : 1.4)一致。
在同一個核心上單獨執行 nice 19 時,5 秒內大約數了 65 萬~114 萬次。沒有需要讓出的對象時,nice 19 也會完整使用 CPU;測試期間伺服器負載(load average)為 3~5。
5️⃣ ionice:磁碟方面的讓出與確認排程器
nice 只決定 CPU 份額,所以像備份這種長時間讀寫磁碟的工作,要用 ionice 讓出磁碟順序。以 -c3(idle)執行時,只有在其他程式都沒用磁碟時才會處理。
ionice -c3 bash -c 'ionice -p $$'idleionice -p $$none: prio 0沒有指定任何設定的程序會顯示為 [none],依核心文件,它會以 best-effort 等級處理,優先順序由 CPU 的 nice 值算出。
ionice 等級只有在磁碟排程器支援時才有效,核心文件把 bfq 和 mq-deadline 列為支援的排程器。以中括號標示的就是目前使用中的排程器。
cat /sys/block/nvme0n1/queue/scheduler[none] mq-deadline kyber bfq測試伺服器的 NVMe 磁碟是 [none],依官方文件,指定 ionice 也可能沒有效果,效果並未另外測量。磁碟名稱可用 lsblk 確認。
6️⃣ nice 用在哪裡:備份·cron·wp-cli
替花時間但不急的工作加上 nice。備份壓縮會同時用到 CPU 和磁碟,所以 nice 和 ionice 要一起指定。
nice -n 19 ionice -c3 tar czf backup.tgz /home/example已在執行的工作讓伺服器變慢時,先在 top 確認 PID,再用 renice 調高值;每天執行的 cron 工作則在指令前面加上 nice。
0 3 * * * nice -n 10 /usr/local/bin/backup.sh在 WordPress 伺服器上,用 nice -n 10 執行搜尋取代或重新產生圖片這類大型 wp-cli 工作時,CPU 忙碌時就會由處理訪客請求的 php-fpm 先使用 CPU。
nice -n 10 wp media regenerate --yes反過來說,不要調高 php-fpm 或網頁伺服器本身的 nice 值。處理訪客回應的程序一旦讓出,CPU 忙碌時頁面回應就會變慢。
🔢 FAQ & 推薦內容









ℹ️ 聯盟行銷說明
本站內容包含聯盟行銷連結。訪客透過這些連結購買商品或服務時,本站會從賣家獲得佣金。在這個過程中,購買者支付的金額(遇到活動折扣時金額會降低↓)並不會因此提高。刊登的價格、折扣與庫存資訊以撰寫當時為準,可能與實際情況不同,購買前請向賣家做最後確認。商品的挑選與評價依本站自訂的標準撰寫,是否支付佣金不會影響介紹順序或評價內容。
