最近、C# .NET Framework 4.0で奇妙な状況に遭遇しました。
簡単なプログラムで、TcpListener を作成し、そのローカル ポートを指定して開始し、非同期受け入れ関数を使用して着信接続要求を受信します。
保留中の接続が受信されると、サーバーは非同期コールバック関数から TcpClient を受け入れ、それをコンテナー (より具体的にはList<TcpClient>
) に記録します。
そして、サーバーが起動したらサーバーに接続し、非同期受信関数を呼び出す別の単純なクライアントプログラムを作成します。
すべてのクライアントが接続されると、サーバーは を使用して並列タスクのグループを開始しますSystem.Threading.Tasks.Parallel.ForEach()
。
各タスクで、そのリストに格納されている TcpClient を使用して、対応するクライアントにデータを送信します。すべての TcpClient が同時にデータを送信しています (クライアント側を確認したところ、すべてデータを受信しています)。データはbyte[8192]
、サーバー プログラムの起動時に生成されるランダム データです。サーバーに繰り返し送信させます。
クライアントの受信コールバックは単純です。データが到着すると、クライアントはデータを無視し、別の非同期受信関数を実行します。
テスト環境は、 1 Gbps の LAN、1 つのサーバー、および複数のクライアントです。
その結果、サーバーに接続されているクライアントの数 ( 3 ~ 8 ) に関係なく、サーバーの合計アップロード速度が13MByte/
s を超えることはありません。
それから私は別の方法を試しました:
クライアント側でもTcpListenerを作成します。クライアントがサーバーに接続すると、サーバーはクライアントのリッスン ポートにも接続します。次に、サーバーは、着信接続ではなく、この発信接続をリストに保存します。
今回は、テスト結果が大きく変わります。3 つのクライアントがサーバーからデータを受信している場合、サーバーの合計アップロード速度はほぼ30MByte/s
. 5 つのクライアントを使用すると、合計アップロード速度はほぼ50MBytes/s
.
この10MByte/s-per-client
制限は、ハードウェアまたはネットワーク構成が原因である可能性がありますが、上記の場合よりもはるかに優れています。
理由を知っている人はいますか?