プロセスの実行優先度を変更する方法|niceとreniceの使い方とPRI・NIの違い

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)【Linux入門】初心者のための基礎知識・講座 > プロセスの実行優先度を変更する方法|niceとreniceの使い方とPRI・NIの違い
「特定のプロセスがCPUを食って他の処理が遅い。優先度を下げたいけど、niceとreniceのどっちを使えばいいのか毎回迷う」
「nice -n -15 と指定したつもりが反映されていない、PRIとNIの違いが分からない」
Linuxサーバーを運用していると、必ず一度はこの場面にぶつかります。

この記事では、Linuxのプロセスの実行優先度を nicerenice コマンドで制御する手順を解説します。
ナイス値(NI)と優先度(PRI)の関係、起動前に指定する nice と既存プロセスに掛ける renice の使い分け、rootと一般ユーザーの権限差、よくある勘違いと対処までを実例つきでまとめました。

この記事のポイント

・ナイス値(NI)は -20~19 の整数で、小さいほどCPU優先度が高い
・起動と同時に指定するなら nice -n 値 コマンド
・既に動いているプロセスは renice -n 値 -p PID で変更
・優先度を「上げる」(負値・小さくする)操作はroot権限が必須


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

プロセスの実行優先度とは(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

PRI=90、NI=10 が標準的な状態です(環境によりPRIの基準値は異なります)。

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

PR=20(NI=0 のときのカーネル内部値)、NI=0 が一般プロセスのデフォルトです。

3. nice コマンド単独で現在のNIを確認する

nice を引数なしで実行すると、現在のシェルが持っているナイス値が表示されます。

$ nice 0

ここから子プロセスとして起動されるコマンドは、このNI値を継承します。

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

PID 1930 の top が NI=-5、PRI=75 で起動しました。
注意したいのは 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

NI=19(最低優先)で 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 です

ユーザー pakira が動かしているすべてのプロセスがナイス値 -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

これはマルチユーザー環境で1人のユーザーがリソースを独占するのを防ぐためのカーネルレベルの制限です。
業務上どうしても必要な場合は sudo/etc/security/limits.confnice ハードリミット緩和を検討します。

応用・実務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 と組み合わせてバッチ処理に流す

ログアウト後も走らせ続けたいバッチは、nohupnice を組み合わせるのが定番です。

$ nohup nice -n 19 ./long_batch.sh > batch.log 2>&1 &

バックグラウンド + 低優先度 + ログアウト耐性が、この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 コマンド

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。