スイッチへの10GbE接続を備えたサーバーと、同じスイッチへの1GbE接続を備えた10台のクライアントがあります。
各クライアントでnuttcpを並行して実行すると、10個のTCPデータストリームをワイヤ速度に近い速度で同時にサーバーにプッシュできます(つまり、10個のクライアントすべてから同時に100メガバイト/秒のシャイ) )。
ただし、方向を逆にしてサーバーからクライアントにデータを送信すると(つまり、10 TCPストリーム、各クライアントに1つずつ))TCP =再送信が急増し、パフォーマンスがクライアントあたり1秒あたり30、20、さらには10メガバイトに低下します。このトラフィックパターンは私が関心のある特定のアプリケーションを代表しているため、これらの数値を上げたいと思います。
同様のサーバーへの10GbE接続を介して同じ実験を実行することにより、サーバーが10GbEリンクを飽和させることができることを確認しました。どのポートにもエラーがないことを確認しました。
最後に、受信機のTCPウィンドウサイズ)を強制的にクランプ(制限)すると、帯域幅をいくらか高くすることができます(30〜40メガバイト/秒)。極端に低くクランプすると、次のことができます。再送信をゼロにします(帯域幅がおかしなほど低くなります)。
したがって、スイッチのバッファをオーバーランし、輻輳によるパケット損失が発生していると合理的に確信しています。しかし、TCPの輻輳制御はこれをうまく処理し、最終的にはワイヤ速度の50%を超える速度で安定するはずだと思いました。
したがって、私の最初の質問は非常に単純です。どのTCP輻輳制御アルゴリズムが私の状況に最適でしょうか?利用可能なものはたくさんありますが、ほとんどの場合、損失の多いネットワークまたは高ネットワークを対象としているようです。帯域幅の高遅延ネットワークまたはワイヤレスネットワーク...どれも私の状況には当てはまりません。
2番目の質問:他に試すことができるものはありますか?
パケットドロップが発生したときにウィンドウサイズが大幅に縮小されないアルゴリズムが必要になります。 TCPトラフィックでスループットが突然低下するのは、ウィンドウサイズの大幅な低下です。
スイッチとサーバーがフロー制御をサポートしている場合は、フロー制御を有効にしてみてください。これがどの程度うまく機能するかは、スイッチのシリコンとファームウェアにほぼ完全に依存します。基本的に、スイッチはクライアントに接続されているポートの出力輻輳を検出し、パケットの送信元を特定し、フロー制御フレームを入力ポートから送信します(つまり、サーバーに戻します)。サーバーがフロー制御フレームを理解している場合、送信速度が低下します。すべてがうまく機能すれば、スイッチの出力バッファで発生するパケットドロップが実質的にゼロで、最適なスループットが得られます。