c# Socket服务器-最大容量&一般的问题
本文关键字:问题 大容量 Socket 服务器 | 更新日期: 2023-09-27 18:18:12
我有一个现有的服务器应用程序,它跟踪网络上的各种计算机。有时网络中需要跟踪的计算机多达6000台。追踪只需要知道电脑是开机的。偶尔,服务器会将需要处理和处理的消息发送回客户端。
我尝试过WCF,但它似乎不能很优雅地处理大负载(当接近1200-2000个客户端范围时,高CPU使用率非常常见);另外,使用WCF,我必须使它成为一种"拉"机制,而不是"推"机制,以便向客户端获取消息(即,客户端向服务器请求消息)。我正在考虑切换到低级TCP套接字通信,但我不确定会发生什么,这就是这个问题的问题所在。
:
1 -我期望有多少客户端能够连接并保持与我的服务器的连接?假设这个连接主要是用来让服务器知道客户端是否仍然在线,并且从服务器发送一个非常偶然的消息,我可能会看到服务器上的很多资源使用(在CPU/RAM/tcp端口等方面)吗?
谢谢
1 -我期望有多少客户端能够连接并保持与我的服务器的连接?
5000应该没有任何问题。
2 -假设这个连接主要是用来让服务器知道客户端是否仍然在线,并从服务器发送一个非常偶然的消息,我可能会看到服务器上的很多资源使用(CPU/RAM/tcp端口等)吗?
定义"多"。打开的TCP连接会占用资源。但是最大的资源是你在BeginReceive
中使用的byte[]
缓冲区。但我们假设它有32768字节大。总共大约163Mb。内存很便宜,不是吗?
对于CPU使用率,没有。空闲连接不占用任何CPU
看看这个bytes.com的问题,这个问题是关于在一个类似的情况下允许的理论最大连接数。
似乎最相关的回答是:
The magic setting you're looking for is "MaxUserPort". You can google this,
then make the appropriate registry change.
The value is typically set at 5000, and if you want lots and lots of client
connections then you need to bump the value up.
也就是说,如果在本地局域网环境中使用UDP而不是TCP,如果它与您的设计很好地混合在一起,您可能会受益。我个人没有在c#中执行任何基准测试,但在c++中成功地支持了超过10,000个UDP客户端,几乎没有问题(和一个巨大的盒子)。
你真的需要保持那么多的连接打开吗?
这并不是因为您需要"跟踪"工作站,所以需要持久连接。您可以让客户端按照您建议的间隔进行连接和轮询。在架构上与HTTP有一些相似之处。这样,web服务器甚至可以满足您的服务器需求:所有正在轮询的客户端都可以被认为是up,并且您的服务器可能有话要说,也可能没有。这其实并不重要,只要您保持连接打开的时间尽可能短。使用这种方法与宽松的轮询超时相结合,很可能很容易覆盖上述由一台服务器"跟踪"的6000个工作站。
另一个选项可能是考虑消息传递基础设施。服务器将命令发送到命令队列,接收命令的客户端通过响应队列进行响应。
我想UDP可以被认为是实现后者的可能方式。