nice 與 ionice:程序優先級調整 文章首圖

nice 與 ionice:程序優先級調整

nice 與 ionice:程序優先級調整

在 Linux 系統中,當多個應用程式同時執行時,系統資源(特別是 CPU 和 I/O)的分配往往成為瓶頸。雖然現代 Linux 核心具備完善的排程機制,但在高負載情境下,我們仍可能需要手動介入,調整特定程序的優先級,以確保關鍵服務不受影響,或是讓背景批次處理不干擾使用者體驗。這就是 niceionice 兩個指令存在的意義。

雖然它們都屬於「優先級調整」的工具,但作用的層級截然不同:nice 負責 CPU 資源的分配,而 ionice 則專注於 I/O(輸入/輸出)頻寬的控制。

CPU 優先級:nice 指令解析

nice 指令用於設定程序啟動時的 CPU 優先級,或調整正在執行中程序的優先級。Linux 核心使用一個範圍為 -20 到 19 的數值來表示優先級。

  • 數值越小,優先級越高:-20 為最高優先級,19 為最低優先級。
  • 預設值:一般使用者啟動的程序,其 nice 值預設為 0。
  • 權限限制:只有 root 或具有 CAP_SYS_NICE 權限的使用者才能設定負值(提高優先級)。一般使用者只能增加 nice 值(降低優先級),且不能將優先級調高至比啟動它的程序更高。

基本用法

1. 啟動新程序時設定優先級

假設我們要在背景執行一個耗時的編譯作業,並希望它不要佔用太多 CPU 資源,可以將 nice 值設為 10(最高允許的一般使用者值):

nice -n 10 make -j4

這裡 -n 選項指定了 nice 值。執行後,該 make 進程的 CPU 權重會比一般程序低,系統會優先處理 nice 值較低(數值較小)的程序。

2. 調整已存在程序的優先級

對於已經在執行的程序,我們可以使用 renice 指令來修改其 nice 值。這對於正在執行且突然變得「太吵」的進程非常有用。

首先,我們用 ps 找到目標進程的 PID:

ps aux | grep python

假設我們發現 PID 為 12345 的 Python 腳本佔用了過多 CPU,我們可以將其優先級調低:

sudo renice -n 15 -p 12345

執行結果通常會顯示:

12345: old priority 0, new priority 15

實際範例與觀察

為了直觀感受 nice 值的影響,我們可以開啟兩個終端視窗。

視窗 A(高優先級):

nice -n -5 sh -c "while true; do :; done"

(註:此處需 root 權限才能設定負值,若為一般使用者請改用 5)

視窗 B(低優先級):

nice -n 19 sh -c "while true; do :; done"

在另一個視窗中執行 top 並按下 f 進入欄位選擇,加入 PR (Priority) 或 NI (Nice) 欄位,你會發現視窗 A 的進程會獲得更多的 CPU 時間片。

I/O 優先級:ionice 指令解析

如果 CPU 不是瓶頸,而是磁碟 I/O 才是問題所在(例如大量讀寫小檔案),那麼調整 CPU nice 值就無效了。此時需要 ionice

ionice 將 I/O 優先級分為三個類別(Class):

  1. idle (3):僅當系統沒有任何其他 I/O 需求時才執行。
  2. best-effort (2):預設類別,根據優先級數值分配頻寬。
  3. realtime (1):最高優先級,通常不建議一般使用者使用,以免阻塞系統。

每個類別下又有 1-8 的優先級數值(1 最高,8 最低)。

基本用法

1. 設定 I/O 類別與優先級

假設我們要執行一個大型資料庫備份,不希望它影響網頁伺服器的響應速度,可以將其 I/O 優先級設為最低:

ionice -c 2 -n 7 mysqldump --all-databases > backup.sql

這裡 -c 2 指定為 best-effort 類別,-n 7 表示在該類別中屬於較低的優先級(7 或 8 通常被視為低優先級)。

2. 使用 idle 類別

對於非關鍵性的背景同步任務,可以使用 idle 類別,確保它完全不會干擾其他程序的 I/O:

ionice -c 3 rsync -av /data /backup

觀察 ionice 效果

使用 iotop 工具可以清楚看到 I/O 優先級的效果。安裝並執行 sudo iotop 後,觀察 IO 欄位。當執行 ionice -c 3 的進程時,即使它正在寫入大量數據,其 I/O 權重也會遠低於其他 best-effort 的進程。

常見問題

Q1: nice 值設為負數會導致系統當機嗎?

答: 不會直接當機,但極度不建議一般使用者隨意設定負值。設定負值(高優先級)會導致該程序搶佔更多 CPU 資源,可能讓其他正常程序(如 SSH、GUI 介面)變得遲鈍甚至無響應。此外,只有 root 可以設定負值,一般使用者若嘗試執行 nice -n -5 會收到 Permission denied 錯誤。

Q2: ionice 的 idle 類別是否意味著完全不會使用磁碟?

答: 並非完全不使用,而是「有空檔才用」。idle 類別的進程只有在系統磁碟控制器沒有任何其他排程請求時,才會被調度執行。這意味著如果系統其他部分正在進行大量 I/O,你的 ionice -c 3 進程會處於等待狀態,直到 I/O 佇列清空。這對於非關鍵性的背景任務(如日誌輪轉、緩存更新)非常合適。

小結

niceionice 是 Linux 系統管理中不可或缺的調優工具。nice 解決 CPU 競爭問題,適合調整計算密集型任務;ionice 解決 I/O 競爭問題,適合調整讀寫密集型任務。

在日常管理中,建議養成以下習慣:

  1. 對於非關鍵的批次任務,預設使用 nice -n 19ionice -c 3
  2. 對於關鍵服務(如 Web Server、Database),確保其 nice 值為 0 或負數(若需最高優先級),並避免被低優先級任務干擾。
  3. 善用 tophtopiotop 等監控工具,結合 nice/ionice 進行動態調整。

透過合理運用這兩個指令,你可以讓 Linux 系統在多工環境下運作得更加平穩與高效。