サーバーが遅い。通信が不安定。
しかし、
- 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輻輳
詳細は以下の記事で解説しています。
あわせて読みたい


Linuxでパケットロスが発生する原因一覧(NIC・MTU・仮想環境)
Linuxサーバーで通信遅延やタイムアウトが発生し、 確認した結果「パケットロスが起きている」ことが分かった。 次に必要なのは、 「なぜパケットロスが発生しているの…
あわせて読みたい


Linuxでパケットロスが起きているか確認する方法
サーバーのレスポンスが悪い、通信が途切れる、タイムアウトが発生する。 このようなとき、 本当にパケットロスが発生しているのかを Linuxサーバー上で正しく確認でき…
まとめ
パケットロスがあると、 CPUは仕事を与えられず idle 状態になります。
CPU idleは「余裕」ではなく「待ち」 であるケースがあることを理解することが重要です。
