基准测试中的许多TCPClients无法正确关闭

本文关键字:许多 TCPClients 基准测试 | 更新日期: 2023-09-27 18:20:25

我目前正在为我的TCP套接字服务器编程一个基准测试。基本概念如下:

  • 客户端创建10000个连接
  • 同时有2500个连接
  • 他们都向服务器发送10秒的乒乓球消息,并接收乒乓球
  • 10秒钟后,它们全部断开

当我使用较少数量的连接(100个并发连接和1000个连接)时,一切都很好,但通过上面的设置,一些连接仍然连接在服务器上。这意味着关闭调用根本不会到达服务器。

这是上面解释的代码:

    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_);
    }

正如你所看到的,我已经尝试了很多不同的闭合方法,但更有效。

在这种情况下我能做些什么吗?还有人有同样的问题吗?

基准测试中的许多TCPClients无法正确关闭

也许我遗漏了什么,但什么类型的mClient_.Client?

通常,如果使用TCP客户端(TCPClient类),则可以调用Close来关闭连接。以同样的方式,当直接使用Socket或NetworkStream时,您也可以调用Close。

另一方面,您正在检测和调试服务器上的连接打开/关闭连接,对吗?服务器代码可能无法正确处理连接关闭,从而得到不正确的统计信息。

同样在负载过重的情况下,服务器可能没有足够的CPU时间来更新连接的状态,所以可能会出现一些延迟。您的服务器使用异步I/O还是按线程连接原则?