プロセス優先度の制御 - niceとreniceの仕組み

プロセス優先度の制御 - niceとreniceの仕組み

この記事で達成できること

  • nice 値とカーネルの優先度(PRI)の関係を説明できる
  • nice でコマンドを低優先度で起動できる
  • renice で実行中プロセスの優先度を変更できる
  • top / ps で優先度を正確に確認できる
  • 試験頻出の「一般ユーザーは nice 値を下げられない」を根拠付きで答えられる

LPIC-1 主題 103.6「プロセスの実行優先度を変更する」の中核。CPU を多く使うバックグラウンド処理を、対話作業を妨げずに走らせる技術。

nice 値の判断

nice 値は -20(最高優先度)から 19(最低優先度)の整数。値が小さいほど CPU を優先的に得る。

nice 値 優先度 典型用途
-20-1 高(root のみ設定可) リアルタイム性が必要な処理
0 標準(デフォルト) 通常のコマンド
119 バックアップ・バッチ・ビルド等の重い処理

「バックアップが対話作業を重くする」なら 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

topNI 列が 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 のプロセス管理範囲を一通り押さえたら、シェル環境やリンク機構と合わせて運用知識が完成する。

次に読む