基准测试中的许多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_);
}
正如你所看到的,我已经尝试了很多不同的闭合方法,但更有效。
在这种情况下我能做些什么吗?还有人有同样的问题吗?
也许我遗漏了什么,但什么类型的mClient_.Client?
通常,如果使用TCP客户端(TCPClient类),则可以调用Close来关闭连接。以同样的方式,当直接使用Socket或NetworkStream时,您也可以调用Close。
另一方面,您正在检测和调试服务器上的连接打开/关闭连接,对吗?服务器代码可能无法正确处理连接关闭,从而得到不正确的统计信息。
同样在负载过重的情况下,服务器可能没有足够的CPU时间来更新连接的状态,所以可能会出现一些延迟。您的服务器使用异步I/O还是按线程连接原则?