Linux nice コマンド:優先度の指定と renice での変更、CPU を奪い合うときの取り分を実測

Linuxのniceコマンドは、プログラムを実行するときにCPUをどれだけ譲るかを決めるnice値(-20〜19)を指定するコマンドです。AlmaLinux 9サーバーでCPUコア1つに2つのタスクを割り当て、nice値を変えながら測った結果、取り分はCPUを奪い合うときにだけ分かれ、nice 19のタスクは1.4%しか使いませんでした。
すでに実行中のプロセスはreniceで変更し、ディスク側の譲り合いはioniceが担います。3つのコマンドとも、rootユーザーと一般ユーザーで実際に実行した出力をそのまま載せています。
1️⃣ Linuxのniceコマンド:値の範囲とCPUを奪い合うときの取り分
nice値はCPU時間を分けるときにどれだけ譲るかを決める数値で、-20から19まで指定できます。通常のプログラムは0で実行され、-20が最も先に処理され、19が最も多く譲ります。
数値が大きいほど先に処理されると思いがちですが、nice値は逆です。Linuxのスケジューラーはnice値ごとに重みを決め、その比率でCPU時間を配分します。nice 0は1024、10は110、19は15です。
譲り合いはCPUを奪い合うときにだけ起こります。空いているCPUがあれば、nice 19のタスクも待たずに実行されます。バスの優先席が空いていれば誰でも座り、混んでいるときだけ席を譲るのと同じです。
重みの表はLinuxカーネルソース[kernel/sched/core.c]の[sched_prio_to_weight]配列で、nice値が1上がるごとにCPU時間が約10%ずつ減るように決められています。
2️⃣ niceの基本的な使い方:数値を省略すると+10、範囲外の値
niceの後ろにコマンドを付けると、そのコマンドのnice値を変えて実行し、コマンドなしで入力すると今のシェルのnice値を出力します。
nice0以下の例は、起動したbashが自分のnice値を[ps -o ni=]で出力するコマンドです。-nなしで実行すると今の値に10が足され、-n 5なら5が足されます。
nice bash -c 'ps -o ni= -p $$' 10nice -n 5 bash -c 'ps -o ni= -p $$' 5範囲を超えた値はエラーなしで端の値に合わせられ、-n 50は19で実行されます。
nice -n 50 bash -c 'ps -o ni= -p $$' 19負の値で優先度を上げられるのはrootユーザーだけです。一般ユーザーでは[cannot set niceness]という警告が出力され、コマンドはnice 0のまま実行されます。
# 一般ユーザー
nice -n -5 bash -c 'ps -o ni= -p $$'nice: cannot set niceness: Permission denied
0# rootユーザー
nice -n -5 bash -c 'ps -o ni= -p $$' -5niceで実行したコマンドがさらに起動する子プロセスも、同じnice値で実行されます。
nice -n 7 bash -c 'sleep 1 & ps -o ni= -p $!' 7そのため、スクリプトを1つniceで実行すると、その中のコマンド全体が譲ります。
3️⃣ renice:実行中のプロセスのnice値を変更
niceは実行するときにしか値を決めないので、すでに実行中のプロセスはreniceで変更します。まずtopのNI列やpsでPIDと今の値を確認します。
ps -o pid,ni,cmd -p 201643 PID NI CMD
201643 5 sleep 600renice -n 10 -p 201643201643 (process ID) old priority 5, new priority 10出力のとおり、renice -nは今の値に足すのではなく指定した値に合わせるので、5に10を足した15ではなく10になります。エアコンのリモコンの▲ボタンで1段上げるのではなく、設定温度を24度に指定するのと同じです。
util-linuxの公式ドキュメントも-nを絶対値として説明しており、足す方式は新しい版の[--relative]オプションが担います。テストしたutil-linux 2.37.4にはこのオプションがありませんでした。
一般ユーザーは自分のプロセスの値を上げることしかできず、一度上げた値を下げ直すことはできません。
# 一般ユーザー
renice -n 10 -p 201649201649 (process ID) old priority 0, new priority 10renice -n 5 -p 201649renice: failed to set priority for 201649 (process ID): Permission deniedrootユーザーは下げることもでき、同じテストで10を3にそのまま変更できました。
🔲 nice・reniceシミュレーター
一般ユーザーで接続した下のシミュレーターで、niceとreniceを直接入力し、nice値が変わる様子を確認できます。
4️⃣ CPUを奪い合うときの取り分を実測:nice 0 vs 0·10·19
nice値を上げたからといって、そのタスクがいつも遅くなるわけではありません。同じCPUを他のタスクと奪い合うときにだけ取り分が減ります。
CPUコア1つに2つのタスクを割り当て(taskset)、5秒間数を1つずつ数える下のスクリプトを同時に実行しました。数えた数が大きいほど、CPU時間を多く使ったことになります。
#!/bin/bash
end=$((SECONDS+5)); n=0
while [ $SECONDS -lt $end ]; do n=$((n+1)); done
echo $nスクリプトは5秒が過ぎるまでnを1ずつ増やし、最後の値を出力します。
nice 0同士は半分ずつ分け、nice 10は約10%、nice 19は1.4%しか使いませんでした。カーネルの重みで計算した比率(1024 : 110は90.3 : 9.7、1024 : 15は98.6 : 1.4)と同じ結果です。
同じコアでnice 19を単独で実行したときは、5秒間に約65万〜114万回数えました。譲る相手がいなければnice 19でもCPUをそのまま使います。テスト中のサーバー負荷(load average)は3〜5でした。
5️⃣ ionice:ディスク側の譲り合いとスケジューラーの確認
niceはCPUの取り分しか決めないので、バックアップのようにディスクを長く読み書きする作業はioniceでディスクの順番も譲ります。-c3(idle)で実行すると、ほかのプログラムがディスクを使っていないときだけ処理されます。
ionice -c3 bash -c 'ionice -p $$'idleionice -p $$none: prio 0何も指定していないプロセスは[none]と表示され、カーネルのドキュメントによるとbest-effortクラスとして扱われ、優先度はCPUのnice値から計算されます。
ioniceのクラスはディスクスケジューラーが対応しているときにだけ効果があり、カーネルのドキュメントはbfqとmq-deadlineを対応スケジューラーとして挙げています。角括弧で示されたものが今使われているスケジューラーです。
cat /sys/block/nvme0n1/queue/scheduler[none] mq-deadline kyber bfqテストしたサーバーのNVMeディスクは[none]なので、公式ドキュメントによるとioniceを指定しても効果がない場合があり、効果は別途測定していません。ディスク名はlsblkで確認します。
6️⃣ niceを使う場面:バックアップ・cron・wp-cli
時間はかかるが急がない作業にniceを付けます。バックアップの圧縮はCPUとディスクを両方使うので、niceとioniceを一緒に指定します。
nice -n 19 ionice -c3 tar czf backup.tgz /home/exampleすでに実行中の作業がサーバーを遅くしているなら、topでPIDを確認してからreniceで値を上げ、毎日実行するcronジョブはコマンドの前にniceを付けます。
0 3 * * * nice -n 10 /usr/local/bin/backup.shWordPressサーバーで検索置換や画像の再生成のような大きなwp-cli作業をnice -n 10で実行すると、CPUが忙しいときは訪問者のリクエストを処理するphp-fpmが先にCPUを使います。
nice -n 10 wp media regenerate --yes反対に、php-fpmやWebサーバー自体にはnice値を上げません。訪問者への応答を処理するプロセスが譲ると、CPUが忙しいときにページの応答が遅くなります。
🔢 FAQ & おすすめコンテンツ









ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。
