1

2台のPCの間にスイッチだけを使用して、帯域幅テストを設定しようとしていました。すべてのネットワークハードウェアはギガビットです。1台のマシンで、ソケットを開き、接続をリッスンし、受け入れ、続いてデータを読み取り、受信したバイトを「パフォーマンスカウンター」に対して測定するループを作成しました。もう一方のマシンでは、プログラムは最初のマシンに接続されたソケットを開き、タイトループに進んで、send()呼び出しごとに1Kブロックで、データを可能な限り高速に接続に送り込みます。その設定だけで、物事は許容できるほど速いように見えます。ネットワークを介して約30〜40メガバイト/秒を取得できました。ギガビットh / wの妥当性の範囲内で、100BaseTよりも明らかに高速です。

ここからが楽しみです。setsockopt()を使用して、両端のバッファー(SO_SNDBUF、SO_RCVBUF)のサイズを1Kに設定しようとしました。突然、受信側は1秒あたりわずか4,000バイトまたは5,000バイトを取得していると報告します。送信側を計測すると、send()呼び出しは、1Kブロックを送信するだけで、それぞれ0.2〜0.3秒かかるようです。受信側からsetsockopt()を削除しても、状況は変わらないようです。

明らかに、バッファサイズを操作しようとするのは悪い考えでした。バッファサイズを1Kに強制し、send()呼び出しを1Kにすると、OSが送信呼び出しごとに1つのパケットをネットワークに送信するように強制する方法になると思いました。これにより、ネットワークスタックが送信用にデータを効率的に結合しますが、スループットがわずか4〜5K/秒に低下するとは予想していませんでした。

私はこれを追いかけるためのリソースに時間がなく、私が望む方法でそれを本当に理解していますが、send()に0.2秒かかる可能性があるものを本当に知りたいです。向こう側からのアックを待っていても、0.2秒は信じられないほどです。何が得られますか?

4

2 に答える 2

3

説明は、1kバッファは非常に小さいバッファサイズであり、送信側のマシンはおそらく一度に1つのパケットを送信しているということです。送信者は、受信者からの確認応答を待ってから、バッファを空にし、アプリケーションから送信する次のブロックを受け入れる必要があります(TCP層は後でデータを再送信する必要がある場合があるため)。

さらに興味深い演習は、バッファサイズをシステムのデフォルトから1kまで変更し(クエリしてそれが何であるかを確認する)、各バッファサイズがスループットにどのように影響するかを確認することです。

于 2012-04-30T03:10:47.743 に答える
3

ネーグル?

小さなメッセージのあるWindowsネットワーク

于 2012-04-30T10:40:53.043 に答える