Linux nice 指令:設定優先順序、用 renice 變更,實測爭用 CPU 時分到的份額

測試環境RHEL 系列AlmaLinux 9.8root · 一般使用者帳號2026-10-17 確認
程序 · 工作排程指令nicereniceionice

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 的工作也不必等待就能執行。就像公車上的博愛座,空著時誰都能坐,只有擁擠時才讓座。

🧭 CPU 有餘裕時與爭用時的 nice 值
說明圖解
🖥️ CPU
⚖️ 工作 B
🖥️ 有閒置的 CPU,每個工作各用一個核心🖥️ 兩個工作共用一個 CPU 核心
工作 Anice 0 · 權重 1024
100%50.0%90.3%98.6%
工作 Bnice 0 · 權重 1024nice 10 · 權重 110nice 19 · 權重 15
100%50.0%9.7%1.4%
CPU 有餘裕時沒有需要讓出的對象,所以不論 nice 值多少,工作 B 都能完整使用 CPU。
爭用同一個核心時,權重相同的兩個 nice 0 工作會各分一半 CPU 時間。
nice 10 的權重是 110,約為 nice 0(1024)的九分之一,CPU 時間大約以 90.3 : 9.7 分配。
nice 19 的權重是 15,爭用時工作 B 只用約 1.4% 的 CPU 時間。

權重表是 Linux 核心原始碼 [kernel/sched/core.c] 中的 [sched_prio_to_weight] 陣列,設計成 nice 值每增加 1,CPU 時間就減少約 10%。

2️⃣ nice 基本用法:省略數字時 +10,以及超出範圍的值

在 nice 後面接指令,會以變更後的 nice 值執行那個指令;不接指令直接輸入 nice,則會輸出目前 shell 的 nice 值。

nice
0

下面的例子是讓執行的 bash 用 [ps -o ni=] 輸出自己 nice 值的指令。不加 -n 執行時會在目前的值加上 10,-n 5 則加上 5。

nice bash -c 'ps -o ni= -p $$'
 10
nice -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 600
renice -n 10 -p 201643
201643 (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 201649
201649 (process ID) old priority 0, new priority 10
renice -n 5 -p 201649
renice: failed to set priority for 201649 (process ID): Permission denied

root 帳號也可以調低,在同一次測試中直接把 10 改成了 3。

🔲 nice · renice 模擬器

在下方以一般帳號登入的模擬器中,可以自己輸入 nice 和 renice,確認 nice 值的變化。

nice 指令模擬器nice 8.32 · renice 2.37.4
[root@server work]#
只在瀏覽器中運作,不會動到真正的程序。這是以一般帳號登入的虛擬伺服器,可以變更 nice 值執行指令,或用 renice 變更 backup.sh(PID 2481)的值,再用 ps -o pid,ni,cmd 確認。用鍵盤 ↑↓ 可以叫出之前輸入的指令。

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 秒,再輸出最後的值。

📊爭用一個 CPU 核心的 5 秒5 秒內數到的次數
前一個工作 nice 0後一個工作
nice 0 vs nice 0
權重相同的兩個工作。
025 萬50 萬75 萬100 萬
nice 0497,596 次48.8%
nice 0522,040 次51.2%
nice 0 vs nice 10
只有後一個工作以 nice 10 執行。
025 萬50 萬75 萬100 萬
nice 0979,971 次90.1%
nice 10107,671 次9.9%
nice 0 vs nice 19
只有後一個工作以 nice 19 執行。
025 萬50 萬75 萬100 萬
nice 0909,895 次98.6%
nice 1913,010 次1.4%
數字是 2026 年 10 月 17 日在 AlmaLinux 9 伺服器上,把兩個工作綁在一個 CPU 核心並同時各執行 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 $$'
idle
ionice -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 & 推薦內容

一般程序在 top 的 PR 會顯示為 20 加上 nice 值。以 nice 5 執行的程序顯示為 PR 25、NI 5,而 ps 的 PRI 欄計算方式不同,同一個程序顯示為 14。

nice 會把指定的值加到目前的 nice 值上。[nice -n 5 nice -n 3 nice] 會輸出 8,和設成指定值的 renice -n 是不同的方式。

在服務單元檔的 [Service] 區段寫上 [Nice=],就能決定該服務執行的程序的 nice 值。依 systemd.exec 官方文件,可以設定 -20 到 19。

🧭 程序與工作排程推薦內容 11 篇文章 · 4 個參考資料
🗂️ 程序與工作排程
📄 ps 指令 📄 top 指令 📄 Linux nice 指令 📄 kill 指令 📄 killall 指令 📄 背景&前景 📄 uptime 指令
📄 crontab 設定
📋 WP CLI:安裝與設定 📄 WP-Cron(wp-cron.php) 📄 尋找同步區塊版面配置:WP-CLI
📡 GNU Coreutils nice invocation 📡 renice(1) Linux manual page 📡 Block io priorities(核心文件) 📡 sched_prio_to_weight(核心原始碼)

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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Prove your humanity: 0   +   5   =