Linuxサーバーで負荷対策を行う際、
- nice を下げたのにレスポンスが改善しない
- CPU使用率は下がったが体感は変わらない
- 「niceって意味あるの?」と感じた
このような経験をしたことがある運用担当者は非常に多いです。
結論から言うと、 niceが効かないのは設定ミスではなく、使いどころを間違えている ケースがほとんどです。
本記事では、 niceが効かない典型パターンを整理し、 どういう状態なら意味があり、どういう状態なら無意味なのか を明確に解説します。
結論:niceは「CPUの取り合い」が起きていないと効果が出ない
nice は、 CPUスケジューリングの優先度を制御する仕組みです。
つまり、
- CPUが暇
- CPUを待っているプロセスが少ない
この状態では、 niceをどう設定しても効果は出ません。
まず確認:本当にCPUがボトルネックか?
確認コマンド
top
判断基準
- us / sy が高く、CPU idle が低い → CPU競合あり
- wa が高い → CPUではなくI/O待ち
- idle が高い → CPUは余っている
wa が高い時点で、niceはほぼ無意味です。
理由①:原因がI/O waitだから
nice が効かない最大の理由がこれです。
I/O wait が高い状態では、
- プロセスはCPUを使いたくても使えない
- ディスクI/O完了待ちで止まっている
つまり、 CPU優先度を変えても意味がありません。
この場合に使うべきなのは、 ionice(I/O優先度制御)です。
理由②:CPU使用率がそもそも低い
top を見ると、
- CPU使用率 10~20%
- idle が高い
という状態なのに、 「サーバーが遅い」と感じることがあります。
この場合、 CPUは完全に余っているため、 nice を下げても挙動は変わりません。
理由③:niceを下げた対象が間違っている
nice は、 プロセス単位で効きます。
よくあるミスとして、
- 親プロセスだけに設定
- 実際に重い子プロセスに効いていない
というケースがあります。
確認方法
ps -o pid,ppid,ni,cmd -C プロセス名
本当に重いPIDに nice が効いているか を確認する必要があります。
理由④:niceでは制御できない種類の処理
以下の処理は、 niceを下げても効果が限定的です。
- ディスクI/O待ち中心の処理
- ネットワーク待ち中心の処理
- ロック待ちが多い処理
これらは、 CPUを取り合っていないためです。
理由⑤:niceは「遅くする」方向の効果が主
重要なポイントとして、
niceは「他より速くする」ツールではありません。
正確には、
- nice を大きくする → 後回しにされる
- nice を下げる → 取り合い時に有利
つまり、 競合が起きていない限り体感は変わらない のが正しい挙動です。
「niceが効く」正しい条件
以下を満たしている場合、 nice は明確に効果を発揮します。
- CPU使用率が高い
- 複数プロセスがCPUを取り合っている
- CPU待ち行列が発生している
この場合、 優先度調整で体感が改善します。
niceが効かない時の正しい次の一手
- I/O wait が高い → ionice を使う
- ディスクが詰まっている → iostat / iotop
- CPU idle が高い → 別のボトルネックを疑う
niceに固執しないことが重要です。
「正しく理解できた」と判断できる状態
- niceを使う/使わないの判断が即できる
- 効かない理由を説明できる
- 次に何を確認すべきか迷わない
まとめ
niceが効かないのは、 Linuxの仕様どおりであり、 バグでも失敗でもありません。
重要なのは、 今のボトルネックがCPUなのかどうか を見極めることです。
本記事の内容を理解すれば、 「意味のないnice設定」から卒業できます。



