niceを設定しても効果が出ない理由

  • URLをコピーしました!

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設定」から卒業できます。

目次