0

最近、C# .NET Framework 4.0で奇妙な状況に遭遇しました。


簡単なプログラムで、TcpListener を作成し、そのローカル ポートを指定して開始し、非同期受け入れ関数を使用して着信接続要求を受信します。

保留中の接続が受信されると、サーバーは非同期コールバック関数から TcpClient を受け入れ、それをコンテナー (より具体的にはList<TcpClient>) に記録します。

そして、サーバーが起動したらサーバーに接続し、非同期受信関数を呼び出す別の単純なクライアントプログラムを作成します。

すべてのクライアントが接続されると、サーバーは を使用して並列タスクのグループを開始しますSystem.Threading.Tasks.Parallel.ForEach()

各タスクで、そのリストに格納されている TcpClient を使用して、対応するクライアントにデータを送信します。すべての TcpClient が同時にデータを送信しています (クライアント側を確認したところ、すべてデータを受信して​​います)。データはbyte[8192]、サーバー プログラムの起動時に生成されるランダム データです。サーバーに繰り返し送信させます。

クライアントの受信コールバックは単純です。データが到着すると、クライアントはデータを無視し、別の非同期受信関数を実行します。

テスト環境は、 1 Gbps の LAN1 つのサーバー、および複数のクライアントです。

その結果、サーバーに接続されているクライアントの数 ( 3 ~ 8 ) に関係なく、サーバーの合計アップロード速度が13MByte/s を超えることはありません。


それから私は別の方法を試しました:

クライアント側でもTcpListenerを作成します。クライアントがサーバーに接続すると、サーバーはクライアントのリッスン ポートにも接続します。次に、サーバーは、着信接続ではなく、この発信接続をリストに保存します。

今回は、テスト結果が大きく変わります。3 つのクライアントがサーバーからデータを受信して​​いる場合、サーバーの合計アップロード速度はほぼ30MByte/s. 5 つのクライアントを使用すると、合計アップロード速度はほぼ50MBytes/s.

この10MByte/s-per-client制限は、ハードウェアまたはネットワーク構成が原因である可能性がありますが、上記の場合よりもはるかに優れています。


理由を知っている人はいますか?

4

2 に答える 2

0

処理にスレッドやタスクを使用しないでください。それはあなたのパフォーマンスを損なうでしょう。

私は、実際の IO 処理を気にすることなく、パフォーマンスの高いネットワーク アプリケーションを開発するのに役立つフレームワークを作成しました。

http://blog.gauffin.org/2012/05/griffin-networking-a-somewhat-performant-networking-library-for-net/

于 2012-05-05T10:18:55.793 に答える
0

この動作の原因はわかりませんが、回避策として、より大きなバッファーを送信することをお勧めします。1MB(または少なくとも64k)のように。1 Gbps LAN では、アプリがより大きなチャンク (およびより少ないパケット) を送信する場合、より効率的である可能性があります。また、ジャンボ フレームを有効にします。

于 2012-05-03T10:38:57.627 に答える