パケットロスがあるのにCPU idleが高い理由

  • URLをコピーしました!

サーバーが遅い。通信が不安定。

しかし、

  • CPU使用率は低い
  • idleは高い

この状況に直面すると、 「CPUに問題はないはずなのになぜ遅いのか?」 と混乱しがちです。

本記事では、 パケットロスが発生しているのにCPU idleが高くなる理由を、 Linuxの動作原理から解説します。

目次

結論:CPUは「待たされている」だけ

パケットロスが発生すると、 Linux上のプロセスは CPUを使う前に通信待ち状態になります。

その結果、

  • 処理は進まない
  • CPUは仕事をもらえない

という状態が発生します。

CPU idleが高くなる仕組み

通信待ち=スリープ状態

Linuxでは、

  • socket通信
  • read/write待ち

が発生すると、 プロセスはスリープ状態になります。

この間、CPUは使われないため idle が増加します。

パケットロス時に起きていること

  • パケットが破棄される
  • ACKが返らない
  • TCP再送が発生

アプリケーションは 再送完了まで待ち続けるため、 CPUを消費しません。

vmstatで見るとどう見えるか

vmstat 1

典型的な特徴

  • r が少ない
  • b が増えることがある
  • id が高い
  • wa が断続的に上がる

CPUは暇ですが、 処理は進んでいない状態です。

topではどう見えるか

  • CPU使用率は低い
  • プロセスはS(sleep)

CPUを使っていないのではなく、 使えない状態です。

誤解されやすいポイント

  • CPU idle が高い=正常
  • 負荷が低い=速い

これらは 通信障害時には成立しません

どうなれば「解決」と判断できるか

  • pingでpacket lossが解消
  • TCP retransmitsが増えない
  • アプリケーションの応答が安定

その結果として、

  • CPU idleは自然に下がる
  • 処理時間が短縮

という変化が現れます。

次に確認すべきポイント

  • NICドロップ
  • MTU不一致
  • 仮想環境のvSwitch輻輳

詳細は以下の記事で解説しています。

まとめ

パケットロスがあると、 CPUは仕事を与えられず idle 状態になります。

CPU idleは「余裕」ではなく「待ち」 であるケースがあることを理解することが重要です。

目次