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秒は信じられないほどです。何が得られますか?