「nice -n -15 と指定したつもりが反映されていない、PRIとNIの違いが分からない」
Linuxサーバーを運用していると、必ず一度はこの場面にぶつかります。
この記事では、Linuxのプロセスの実行優先度を
nice/renice コマンドで制御する手順を解説します。ナイス値(NI)と優先度(PRI)の関係、起動前に指定する
nice と既存プロセスに掛ける renice の使い分け、rootと一般ユーザーの権限差、よくある勘違いと対処までを実例つきでまとめました。この記事のポイント
・ナイス値(NI)は -20~19 の整数で、小さいほどCPU優先度が高い
・起動と同時に指定するなら nice -n 値 コマンド
・既に動いているプロセスは renice -n 値 -p PID で変更
・優先度を「上げる」(負値・小さくする)操作はroot権限が必須
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
プロセスの実行優先度とは(PRIとNIの関係)
Linuxではマルチタスク環境で多数のプロセスが同時に動きます。CPUは一度に1つの命令しか処理できないため、カーネルが時間を細切れにして各プロセスに割り当てます。
このとき「どのプロセスに長くCPU時間を渡すか」を決める基準が 実行優先度(プライオリティ) です。
実装上、優先度には2つの値が関わります。
・PRI(Priority):カーネルが内部で使う実際の優先度。値が小さいほど高優先
・NI(Nice):ユーザーが指定するヒント値。-20(最高優先)~19(最低優先)
PRIはカーネルがNIと過去のCPU使用実績から動的に計算するため、ユーザーが直接いじることはできません。
ユーザーがコントロールできるのは NI(ナイス値) です。
名前が「nice(譲る)」なのは、ナイス値を大きくすると「他のプロセスに譲る=自分の優先度を下げる」という意味合いから来ています。
現在の優先度を確認する
1. ps -l で PRI と NI を見る
プロセスの優先度を確認する一番手軽な方法がps -l(long format)です。PRI 列と NI 列が表示されます。[root@Tiger ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1901 1611 0 90 10 - 2138 - pts/0 00:00:00 su 4 S 0 1902 1901 0 90 10 - 1549 - pts/0 00:00:00 bash 4 R 0 1929 1902 0 90 10 - 1453 - pts/0 00:00:00 ps
2. top コマンドでリアルタイムに確認する
top を起動すると、各プロセスのPRとNIが常時表示されます。CPU負荷の高いプロセスを順に並べたい場面では
top のほうが便利です。$ top PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2345 pakira 20 0 165432 8932 2345 R 98.0 0.4 0:12.45 stress 1234 root 20 0 23456 4321 1234 S 1.0 0.2 0:01.23 systemd
3. nice コマンド単独で現在のNIを確認する
nice を引数なしで実行すると、現在のシェルが持っているナイス値が表示されます。$ nice 0
nice コマンドで起動時に優先度を指定する
1. 基本書式
プロセスを起動する瞬間にナイス値を指定するのがnice コマンドです。# nice -n ナイス値 実行したいコマンド
-n の後にナイス値を、その後ろに実行したいコマンドを書きます。ナイス値の有効範囲は -20 から 19 までで、小さいほど優先度が高くなります。
2. 優先度を高くして起動する例
ここではtop コマンドをナイス値 -15 で起動します。[root@Tiger ~]# nice -n -15 top& ←ナイス値を-15にしてtopコマンドを実行します。 [root@Tiger ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1901 1611 0 90 10 - 2138 - pts/0 00:00:00 su 4 S 0 1902 1901 0 90 10 - 1549 - pts/0 00:00:00 bash 4 T 0 1930 1902 0 75 -5 - 623 - pts/0 00:00:00 top 4 R 0 1931 1902 0 90 10 - 1455 - pts/0 00:00:00 ps
注意したいのは NI=-15 を指定したのに、表示上は NI=-5 になっている 点です。
これは、元のシェルが NI=10 で動いていたため、そこからの相対値として「-15 を加える」と解釈されたケース(古い
/bin/nice の挙動)です。最近のディストリビューションでは
nice -n -15 は絶対値として扱われるのが標準ですが、ロケールやシェル組み込みコマンドの違いで挙動が分かれます。意図通りに反映されているかは、必ず起動後に
ps -l で実測してください。3. 優先度を下げてバックグラウンド処理を走らせる
バッチ処理やバックアップなど「重いけど急がない」処理は、ナイス値を上げて他の処理を妨げないようにします。$ nice -n 19 tar czvf /backup/data.tar.gz /var/lib/data & $ ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 0 S 1000 2345 1234 0 99 19 - 4567 - pts/0 00:00:00 tar
tar が走り、他の対話処理を遅らせずバックアップが進みます。renice コマンドで稼働中プロセスの優先度を変える
1. PIDを指定して変更する
すでに動いているプロセスの優先度を変更するにはrenice を使います。最も基本的な書式は「PID指定」です。
[root@Tiger ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1901 1611 0 90 10 - 2138 - pts/0 00:00:00 su 4 S 0 1902 1901 0 90 10 - 1581 - pts/0 00:00:00 bash 4 T 0 1930 1902 0 75 -5 - 623 - pts/0 00:00:00 top 4 R 0 2202 1902 0 90 10 - 1454 - pts/0 00:00:00 ps [root@Tiger ~]# renice -10 1930 ←優先度-10に変更します。 1930: 古い優先度は -5、新たな優先度は -10 です
renice 値 PID の形式で、PID 1930 のナイス値を -10 に変更しました。古い書式と新しい書式(
renice -n 値 -p PID)の両方が動くディストリビューションが多いです。2. ユーザー単位で一括変更する
-u オプションで、特定ユーザーが起動した全プロセスをまとめて変更できます。[root@Tiger ~]# renice -5 -u pakira 500: 古い優先度は 0、新たな優先度は -5 です
共有サーバーで特定ユーザーの作業を一時的に優先したいときに便利です。
3. グループ単位での変更(-g)
グループGIDを指定して、そのグループに属するプロセスをまとめて変更することもできます。# renice -n 10 -g webdev
root と一般ユーザーの権限差
ナイス値の変更には明確な権限ルールがあります。・root:すべての方向(高優先・低優先)に変更できる。-20~19 の全範囲を指定可能
・一般ユーザー:自分のプロセスのみ、かつ 優先度を下げる方向(NIを大きくする方向) のみ変更可能
一般ユーザーが優先度を上げようとすると以下のエラーが出ます。
$ renice -5 -p 2345 renice: failed to set priority for 2345 (process ID): Permission denied
業務上どうしても必要な場合は
sudo や /etc/security/limits.conf の nice ハードリミット緩和を検討します。応用・実務Tips
1. CPU使用率が高いプロセスを即座に絞る手順
本番サーバーで暴走気味のプロセスを見つけたとき、いきなりkill せず、まず renice で優先度を最低まで下げて様子を見るのが安全策です。$ ps -eo pid,ni,%cpu,cmd --sort=-%cpu | head PID NI %CPU CMD 4567 0 95.2 /usr/bin/myapp --batch 3456 0 2.1 /usr/sbin/sshd $ sudo renice -n 19 -p 4567 4567 (process ID) old priority 0, new priority 19
2. nohup と組み合わせてバッチ処理に流す
ログアウト後も走らせ続けたいバッチは、nohup と nice を組み合わせるのが定番です。$ nohup nice -n 19 ./long_batch.sh > batch.log 2>&1 &
3. ionice もセットで覚えておく
CPU優先度を扱うnice に対して、ディスクI/Oの優先度を扱うのが ionice です。バックアップなど「CPUは食わないがI/Oが重い」処理には
ionice のほうが効きます。$ ionice -c 3 tar czvf /backup/data.tar.gz /var/lib/data
-c 3 は「idle class」で、他のI/Oが落ち着いてからアクセスする最低優先度です。「Permission denied」が出た時の対処法
renice でよく出るエラーと対処を整理します。1. 一般ユーザーが優先度を上げようとした
前述のとおり、一般ユーザーは負のナイス値を指定できません。sudo renice -n -5 -p PID のように sudo 経由で実行するか、root のシェルで作業します。2. 他人のプロセスを変えようとした
一般ユーザーは 自分のUIDで動いているプロセスしか変更できません。他人のプロセスを変えるには root 権限が必要です。
ps -eo pid,user,cmd で対象プロセスのオーナーを確認してから実行します。3. NI値の範囲外を指定した
renice -25 -p PID のように -20 を超える値を指定しても、自動的に -20 に丸められて警告が出ます。実害はありませんが、スクリプトでNI値を計算して渡す場合は範囲チェックを入れておくと安心です。
本記事のまとめ
プロセスの優先度制御は、サーバー1台あたりの安定運用を支える地味だが重要なテクニックです。特に「バッチを走らせると対話処理が重くなる」「CPU 100%張り付きのプロセスを一時的に抑えたい」というシーンで効きます。
| やりたいこと | コマンド |
|---|---|
| 現在の優先度を確認する | ps -l |
| topでリアルタイムに優先度を見る | top |
| 起動時にナイス値を指定する | nice -n 19 コマンド |
| 稼働中プロセスの優先度を変更(PID指定) | renice -n 10 -p PID |
| ユーザー単位で一括変更 | renice -n 5 -u ユーザー名 |
| グループ単位で一括変更 | renice -n 10 -g グループ名 |
| nohup + 低優先度でバッチ実行 | nohup nice -n 19 ./batch.sh > batch.log 2>&1 & |
| ディスクI/Oの優先度を下げる | ionice -c 3 コマンド |
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:ルートファイルシステムとは|FHS標準と/ディレクトリの構成・パーティション設計
- 前のページへ:リダイレクトの使い方|>・>>・<・2>&1・/dev/nullの全パターン実践例
- この記事の属するカテゴリ:【Linux入門】初心者のための基礎知識・講座へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます