TCP 服务器 - 连接处理

TCP server- connection handling

我有一个 C# 应用程序,它是一个侦听端口的 TCP 服务器。 GPS 设备连接到此端口。应用程序正在接受 TCP 客户端并为每个客户端创建一个新线程。客户端 ID 在哈希 table 中维护,当客户端连接时更新。在大约 400 个单位之前,这一切都很好。一旦单位数量增加,服务器就无法处理所有连接。连接不断断开,有时会导致服务器 CPU 和内存耗尽并导致其崩溃。解决方法是打开另一个侦听不同端口的 TCP 服务器实例,并将一些单元转移到该端口。目前大约有 1800 个单位以某种方式 运行 在 8 个不同的港口。服务器非常不正常table,单位仍然无法保持连接。每天面对太多问题。还使用远程处理通过远程处理端口发送设置 - 这只是有时有效。

请帮助提供 TCP socket/threading/thread 池等的解决方案,该解决方案既可扩展又健壮,并且可以在单个端口中使用。

此 TCP 服务器是 运行,位于 Windows server 2008 R2 Enterprise with IIS7 和 SQL server 2008 中。
处理器:Intel Xenon CPU E3-1270 V2 @3.50GHz
内存:32GB 系统:64位操作系统

谢谢 乔纳森

基本上,不要为每个套接字使用一个线程;使用其中一个异步 APIs (BeginReceive / ReceiveAsync),或某种套接字轮询(例如 Socket.Select,尽管请注意这是以非常笨拙的方式实现的方式;当我使用它时,我实际上使用 P/Invoke 来获取原始基础 API)。就在此时,我有超过 30k 个套接字 每个进程 与我们的网络套接字服务器(通过 via Socket 实现)通信。请注意,出于 OS 原因,我们确实将其拆分为几个不同的 端口 - 主要是由于我们的负载均衡器的限制:

每个连接一个线程并不是一个好主意,特别是当您必须处理 100 个客户端时 concurrently.Asynchronous 是使用一些缓冲区 pooling/managing 的方法。如果您正在寻找从异步套接字开始的内容,请查看 this basic implementation if you are looking for something complete Take a look at this(explanation: Here) 如果你也愿意check this out

在 C# 中,您可以使用经典的 BeginXXX/EndXXX 方法。微软也有 High Performance Socket API which can be leveraged using XXXAsync methods. A few articles which explain the High Performance Socket API Here and Here