【发布时间】:2015-02-08 17:52:40
【问题描述】:
我有一个 C# 应用程序,它是一个侦听端口的 TCP 服务器。 GPS 设备连接到此端口。应用程序正在接受 TCP 客户端并为每个客户端创建一个新线程。客户端 ID 保存在哈希表中,当客户端连接时更新。这一切都很好,直到大约 400 个单位。一旦单元数量增加,服务器就无法处理所有连接。连接不断被丢弃,有时会导致服务器 CPU 和内存消耗殆尽并将其关闭。解决方法是打开另一个 TCP 服务器实例,侦听不同的端口,并将一些单元转移到该端口。目前大约有 1800 台设备在 8 个不同的端口上运行。服务器非常不稳定,单位仍然无法保持连接。每天面对太多的问题。还使用远程处理通过远程处理端口发送设置 - 这仅在某些情况下有效。
请为 TCP 套接字/线程/线程池等提供解决方案,该解决方案既可扩展又强大,并且可以在单个端口中使用。
此 TCP 服务器在带有 IIS7 和 SQL server 2008 的 Windows server 2008 R2 Enterprise 中运行。
处理器:Intel Xenon CPU E3-1270 V2 @3.50GHz
内存:32GB
系统:64位操作系统
谢谢 乔纳森
【问题讨论】:
-
每个客户端一个线程根本无法在 Windows 上扩展。您需要在 .NET 中使用几种异步 API 模型之一进行网络连接。请注意,无论如何,您总会有一个限制。但是使用基本的异步 I/O(
BeginXXX()方法或NetworkStream类上的XXXAsync()方法)您应该能够轻松处理多达数万个连接,并且如果您使用更高效的XXXAsync()Socket类上的方法(与异步流方法不同),您应该能够处理成百上千的方法。 -
还要注意,以上假设您自己的代码的其余部分写得很好。有很多方法可以破坏网络服务器的可伸缩性。您没有提供足够的信息让任何人知道您的实际问题是什么,但我们可以肯定地说,您当前的实现至少有一个已知的可伸缩性问题。
-
@PeterDuniho 这种套接字连接方案是否也适用于桌面 Windows 操作系统,例如Windows 7 专业版 x64。在桌面操作系统上运行套接字服务器时,数千个连接仍然合理吗?
标签: c# multithreading sockets tcpserver