私は最近、ネットワーク パフォーマンスとループバック パフォーマンスを比較するいくつかのパフォーマンス テストを実行しているときに、興味深い TCP パフォーマンスの問題に遭遇しました。私の場合、ネットワークのパフォーマンスがループバックのパフォーマンスを上回りました (1Gig ネットワーク、同じサブネット)。私が対処している場合、待ち時間が重要であるため、TCP_NODELAY が有効になっています。私たちが思いついた最良の理論は、TCP 輻輳制御がパケットを滞らせているというものです。いくつかのパケット分析を行ったところ、パケットが保持されていることが明確にわかりますが、その理由は明らかではありません。さて、質問は...
1) ループバックを介した通信がネットワークを介した通信よりも遅くなるのは、どのような場合で、その理由は何ですか?
2) できるだけ速く送信する場合、TCP_NODELAY の切り替えがネットワーク経由よりもループバック経由の最大スループットに大きな影響を与えるのはなぜですか?
3) パフォーマンスの低下の潜在的な原因として、TCP 輻輳制御をどのように検出して分析できますか?
4) この現象の理由について、他の説を持っている人はいますか? はいの場合、理論を証明する方法はありますか?
以下は、単純なポイント ツー ポイント C++ アプリによって生成されたサンプル データです。
トランスポート メッセージ サイズ (バイト) TCP NoDelay 送信バッファ (バイト) 送信側ホスト 受信側ホスト スループット (バイト/秒) メッセージ レート (メッセージ/秒) TCP 128 オン 16777216 ホスト A ホスト B 118085994 922546 TCP 128 オフ 16777216 ホスト A ホスト B 118072006 922437 TCP 128 オン 4096 ホスト A ホスト B 11097417 86698 TCP 128 オフ 4096 ホスト A ホスト B 62441935 487827 TCP 128 オン 16777216 ホスト A ホスト A 20606417 160987 TCP 128 オフ 16777216 ホスト A ホスト A 239580949 1871726 TCP 128 オン 4096 ホスト A ホスト A 18053364 141041 TCP 128 オフ 4096 ホスト A ホスト A 214148304 1673033 UnixStream 128 - 16777216 ホスト A ホスト A 89215454 696995 UnixDatagram 128 - 16777216 ホスト A ホスト A 41275468 322464 NamedPipe 128 - - HostA HostA 73488749 574130
以下に、さらに役立つ情報をいくつか示します。
- この問題は小さなメッセージでのみ見られます
- HostA と HostB はどちらも同じハードウェア キットを使用しています (Xeon X5550@2.67GHz、合計 32 コア/128 ギグ メモリ/1 ギグ NIC)
- OS は RHEL 5.4 カーネル 2.6.18-164.2.1.el5)
ありがとうございました