nice/renice 入門 - プロセス優先度を制御する

nice/renice 入門 - プロセス優先度を制御する

nice/renice とは何か?

nicerenice は Linux でプロセスの CPU スケジューリング優先度 を制御するコマンド。優先度が高いプロセスほど CPU 時間を多く割り当てられる。

結論(実務の使いどころ)

  • 重い処理をバックグラウンドで動かしたいnice で起動時に優先度を下げる
  • 実行中のプロセスが重すぎるrenice で動的に優先度を下げる
  • 一般ユーザーは優先度を下げることしかできない(上げるには root 権限が必要)

nice 値とは何か?

nice 値は -20〜19 の整数で、数値が小さいほど優先度が高い。

nice 値 優先度 用途例
-20 最高 リアルタイム処理(root のみ)
0 通常(デフォルト) 一般プロセス
10 低め バックグラウンドバッチ
19 最低 アイドル時のみ実行

名前に反して「nice 値が高い(19)=他プロセスに優しい=自分の優先度が低い」という逆の関係になっている。

nice - 優先度を指定して起動する

基本構文

nice -n <nice値> <コマンド>

-n オプションで nice 値の増減量を指定する。省略するとデフォルトの +10 が適用される。

実例

# バックアップスクリプトを低優先度(nice値=10)で起動
nice -n 10 tar czf /backup/home.tar.gz /home/

# 最低優先度(nice値=19)で実行
nice -n 19 ./long-batch-job.sh

# オプション省略(デフォルトで+10)
nice ./heavy-script.sh

現在のプロセスの nice 値を確認する

nice
0

引数なしで実行すると、現在のシェルの nice 値を表示する。

renice - 実行中プロセスの優先度を変更する

基本構文

renice -n <nice値> -p <PID>
renice -n <nice値> -u <ユーザー名>
renice -n <nice値> -g <グループ名>

PID を指定して変更する

# PID 1234 の nice 値を 15 に変更
renice -n 15 -p 1234
1234 (process ID) old priority 0, new priority 15

ユーザーの全プロセスを変更する

# ユーザー「worker」の全プロセスを nice 値 10 に設定
renice -n 10 -u worker

pgrep と組み合わせると、プロセス名から PID を取得して直接変更できる。

renice -n 19 -p $(pgrep heavy-job)

プロセスの nice 値を確認する

top で確認する

topNI 列が nice 値を示す。PR 列は OS が計算したスケジューリング優先度(PR = 20 + NI)。

top
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 1234 user      30  10  102400  12000   8000 R  15.0   0.2   0:05.23 tar

ps で確認する

ps -eo pid,ni,comm
  PID  NI COMMAND
    1   0 systemd
 1234  10 tar
 5678   0 bash

権限のルール

優先度操作にはユーザー権限による制限がある。

操作 一般ユーザー root
優先度を下げる(nice 値を増やす)
優先度を上げる(nice 値を減らす) 不可
他ユーザーのプロセスを変更 不可

一般ユーザーが nice 値を下げようとするとエラーになる:

renice -n -5 -p 1234
renice: failed to set priority for 1234 (process ID): Permission denied

実務パターン

# サービスへの影響を最小化してバッチジョブを起動
nice -n 15 /opt/scripts/nightly-backup.sh &

# 実行中ジョブが重すぎる場合に動的に優先度を下げる
renice -n 19 -p $(pgrep heavy-job)

# バックグラウンドで圧縮しながら作業を継続
nice -n 10 gzip /var/log/large.log &

やってはいけないこと

  • root で nice -n -20 を本番サービスに適用(他のサービスが枯渇する)
  • nice だけで CPU 使用率を制限しようとする(cgroups / cpulimit が適切)

次に読む