プロセス優先度の制御 - niceとreniceの仕組み
この記事で達成できること
- nice 値とカーネルの優先度(PRI)の関係を説明できる
niceでコマンドを低優先度で起動できるreniceで実行中プロセスの優先度を変更できるtop/psで優先度を正確に確認できる- 試験頻出の「一般ユーザーは nice 値を下げられない」を根拠付きで答えられる
LPIC-1 主題 103.6「プロセスの実行優先度を変更する」の中核。CPU を多く使うバックグラウンド処理を、対話作業を妨げずに走らせる技術。
nice 値の判断
nice 値は -20(最高優先度)から 19(最低優先度)の整数。値が小さいほど CPU を優先的に得る。
| nice 値 | 優先度 | 典型用途 |
|---|---|---|
-20 〜 -1 |
高(root のみ設定可) | リアルタイム性が必要な処理 |
0 |
標準(デフォルト) | 通常のコマンド |
1 〜 19 |
低 | バックアップ・バッチ・ビルド等の重い処理 |
「バックアップが対話作業を重くする」なら nice -n 19 で低優先度起動。一般ユーザーは nice 値を上げる(数値を大きく=優先度を下げる)方向にしか変更できない。これが試験頻出ポイント。
手順
Step 1: 現在の nice 値を確認する
ps -o pid,ni,comm -p $$ nice
PID NI COMMAND 2451 0 bash 0
NI 列が nice 値。引数なしの nice は現在のシェルの nice 値を表示する。デフォルトは 0。
Step 2: nice でコマンドを低優先度起動する
nice -n 19 tar czf backup.tar.gz /var/www & ps -o pid,ni,comm -C tar
PID NI COMMAND 3120 19 tar
nice -n 19 cmd は nice 値 19(最低優先度)でコマンドを起動する。CPU が空いているときだけ処理が進むため、対話作業への影響を最小化できる。
Step 3: renice で実行中プロセスを変更する
renice -n 10 -p 3120 ps -o pid,ni,comm -p 3120
3120 (process ID) old priority 19, new priority 10 PID NI COMMAND 3120 10 tar
renice -n 10 -p PID は実行中プロセスの nice 値を変更する。-u user でユーザーの全プロセス、-g group でグループ単位の変更も可能。
Step 4: top で優先度を監視する
top -o NI
PID USER PR NI VIRT RES %CPU COMMAND 3120 user 30 10 118000 4200 2.3 tar 2451 user 20 0 12000 3800 0.1 bash
top の NI 列が nice 値、PR がカーネル内部の優先度。PR = 20 + NI(通常プロセス)の関係。top 内で r キーを押すと対話的に renice もできる。
Step 5: 一般ユーザーの制約を確認する
renice -n -5 -p 3120 sudo renice -n -5 -p 3120
renice: failed to set priority for 3120 (process ID): Permission denied 3120 (process ID) old priority 10, new priority -5
一般ユーザーは nice 値を負(高優先度)にできず Permission denied になる。優先度を上げるには root 権限(sudo)が必要。
なぜ一般ユーザーは優先度を上げられないのか
nice 値を負にすると、そのプロセスが他ユーザーのプロセスより CPU を優先的に奪う。もし誰でも自由に優先度を上げられれば、悪意あるユーザーやバグのあるプログラムがシステム全体を占有でき、マルチユーザー環境の公平性が崩壊する。そのため Linux は「優先度を下げる(譲る)操作は誰でも可、優先度を上げる(奪う)操作は root のみ」という非対称な権限設計を採用している。
nice の語源は「他プロセスに親切(nice)に CPU を譲る」こと。デフォルトの 0 から数値を上げるほど「より親切に譲る」=低優先度になる。この方向性を把握すれば nice 値の符号で混乱しなくなる。なお nice はあくまでスケジューラへのヒントであり、CPU が空いていれば低 nice 値のプロセスも処理は進む。
トラブルシューティング
症状: renice で Permission denied になる
原因: 一般ユーザーが nice 値を下げよう(負方向)としている、または他人のプロセスを変更しようとしている
確認:
ps -o pid,user,ni -p PID
対処: 優先度を上げるには sudo renice を使う。他ユーザーのプロセス変更も root 権限が必要。
症状: nice -n 19 にしても処理が遅くならない
原因: nice は相対的なヒントで、競合するプロセスがなければフル CPU を使える
確認:
top -o %CPU
対処: nice は CPU 競合時にのみ効果が出る正常な挙動。I/O 優先度を下げたい場合は別途 ionice を使う。
症状: バックグラウンドのビルドが対話作業を重くする
原因: ビルドプロセスがデフォルト nice 値 0 で CPU を対等に奪っている
確認:
ps -o pid,ni,comm -C make
対処: renice -n 19 -p PID で実行中プロセスを最低優先度に下げる。今後は nice -n 19 make で起動する。
作業完了チェックリスト
- [ ]
ps -o pid,ni,commで現在の nice 値を確認した - [ ]
nice -n 19で低優先度起動した - [ ]
renice -n -p PIDで実行中プロセスを変更した - [ ]
topの NI 列で優先度を監視した - [ ] 一般ユーザーが優先度を上げられない制約を確認した
まとめ
| 場面 | コマンド | 目的 |
|---|---|---|
| 起動時設定 | nice -n 19 cmd |
重い処理を低優先度で開始 |
| 実行中変更 | renice -n 10 -p PID |
動作中プロセスの優先度調整 |
| ユーザー単位 | renice -n 5 -u user |
全プロセス一括変更 |
| 確認 | ps -el / top |
NI・PRI の監視 |
| 優先度上げ | sudo renice -n -5 |
root のみ可能 |
プロセス優先度は CPU リソース管理の基礎。LPIC-1 のプロセス管理範囲を一通り押さえたら、シェル環境やリンク機構と合わせて運用知識が完成する。