2012-01-15 11 views
0

私は現在、TCPソケットサーバーのベンチマークをプログラムしています。 基本的な考え方は以下の通りです:ベンチマークの多くのTCPクライアントが正しく閉じない

  • クライアントが10000個の接続を作成
  • 彼らはすべてのサーバーに10秒のピンポンメッセージを送信し、ピンポン
  • の後を受け
  • 同時2500本の接続があります
  • 彼らがすべて切断する10秒

接続数が少ない(100の同時接続と1000の接続)場合、すべて正常に動作しますが、セットアップab接続の一部はサーバーに接続されたままです。 これは、クローズコールがまったくサーバーに到達しないことを意味します。ここで

は、上記の説明のためのコードです:

class Program { 
    static List<Thread> mConnectionThreads_ = new List<Thread>();     //!< The list of the Threads for all textloaders 
    static List<TCPConnection> mConnections_ = new List<TCPConnection>();   //!< The list of TextsXMLParser 

    static void Main(string[] args) { 
     int numConnections = 10000; 
     int numConcurrentConnections = 2500; 
     for(int k = 0; k < numConnections/numConcurrentConnections; ++k) { 
      for(int i = 0; i < numConcurrentConnections; ++i) { 
       TCPConnection connection = new TCPConnection(); 
       connection.connect(((k+1)*numConcurrentConnections)+i); 
       mConnections_.Add(connection); 
       mConnectionThreads_.Add(new Thread(connection.pingLoop)); 
      } 
      Console.WriteLine(((k+1)*numConcurrentConnections) + "/" + numConnections + " Threads connected"); 

      // start all threads 
      foreach (Thread t in mConnectionThreads_) 
       t.Start(); 

      foreach (Thread t in mConnectionThreads_) 
       t.Join(); 
      foreach (TCPConnection c in mConnections_) 
       c.disconnect(); 
      Console.WriteLine(((k+1)*numConcurrentConnections) + "/" + numConnections + " Threads disconnected " + cnt + " calls"); 
      mConnections_.Clear(); 
      mConnectionThreads_.Clear(); 
     } 
    } 
} 

切断機能は、次のようになります。

public void disconnect() { 
     if( mClient_.Client != null) { 
      mClient_.Client.Disconnect(false); 
      //mClient_.GetStream().Close(); 
      //mClient_.Close(); 
      Console.WriteLine("closed " + mConnectionId_); 
     } 
     else if(mClient_.Client == null) 
      Console.WriteLine("closed invalid " + mConnectionId_); 
    } 

あなたは、私はすでに別のcloseメソッドの多くを試してみた見ることができるようにしかし、くすみは働く。

この場合、何かできることはありますか?他の誰かが同じ問題を抱えていますか?

+0

あなたがWindowsでソケットを閉じると思うと、それは使用可能になる前にしばらくの間、 'TIME_WAIT'(TcpViewまたはnetstatで見ることができます)のままです。また、Windowsには最大数の接続があります。これらを制御するレジストリ設定があります。最後に、接続上で明示的に 'Dispose'を呼び出す必要がありますか? –

+0

まず、tcp-serverはubuntuサーバー上で動作します。私はServerプログラムにThreadを持っています。これは同時に接続されているユーザーの数を出力します。ソケットがTIME_WAIT状態にあるとき、私はそこに表示されるべきではありません。私はまた、1024の接続のデフォルト数より多くを処理するようにサーバーを構成しました。これが理由ではありません。 –

答えて

0

多分、私は何か不足していますが、どのタイプにmClient_.Clientがありますか?

通常、TCPクライアント(TCPClientクラス)を使用する場合は、Closeを呼び出して接続を閉じることができます。 SocketまたはNetworkStreamを直接使用する場合と同じ方法で、Closeを呼び出すこともできます。

一方、サーバー上の接続のオープン/クローズ接続を検出してデバッグしていますか?サーバーコードが接続を正しく処理しない可能性があり、不正な統計情報が表示される可能性があります。

また、負荷がかかると、サーバーが接続の状態を更新するのに十分なCPU時間がないため、遅延が発生することがあります。サーバーで非同期I/Oまたはスレッド単位の接続を使用していますか?

+0

この場合、サーバーのコードではなくサーバーのコードではなく、サーバーとネットワークの待ち時間などの問題がありました。単純な小さなV-Server - >問題を説明したルートサーバー - >もう問題はありません。あなたの提案をありがとう。 –

関連する問題