nice/renice 入門 - プロセス優先度を制御する
nice/renice とは何か?
nice と renice は 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 で確認する
top の NI 列が 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が適切)