【问题标题】:C# Socket Server - Max Capacity & General QuestionsC# Socket 服务器 - 最大容量和一般问题
【发布时间】:2011-12-20 20:22:55
【问题描述】:

我有一个现有的服务器应用程序,可以跟踪网络上的各种计算机。有时,网络可以有多达 6000 台需要跟踪的计算机。跟踪只涉及知道计算机已打开电源。偶尔服务器会发回需要处理的消息给客户端。

我尝试过 WCF,但它似乎不能非常优雅地处理大负载(在接近 1200-2000 范围的客户端时,高 CPU 使用率很常见);另外,对于 WCF,我必须使它成为一种“拉”机制而不是“推”来将消息发送给客户端(即,客户端向服务器询问消息)。我正在考虑切换到低级 TCP 套接字通信,但我不确定会发生什么,这就是这个问题的意义所在。

所以:

1 - 我可以期望有多少客户端能够连接并保持连接到我的服务器? 2 - 假设此连接主要用于简单地让服务器知道客户端是否仍在线,并偶尔从服务器发送一条消息,我是否可能会看到大量资源使用(在 CPU/RAM/tcp 方面端口/等)在服务器上?

谢谢

【问题讨论】:

  • 您的网络是 LAN 还是覆盖式网络(通过 Internet)?
  • 99% 的时间都是局域网。这是一种出售给客户的产品。

标签: c# sockets


【解决方案1】:

1 - 我可以期望有多少客户端能够连接并保持连接到我的服务器?

5000 应该没有任何问题。

2 - 假设此连接主要用于简单地让服务器知道客户端是否仍然在线,并偶尔从服务器发送一条消息,我可能会看到大量资源使用(就 CPU/服务器上的 RAM/tcp 端口/等)?

定义“很多”。打开的 TCP 连接会占用资源。但最大的资源将是您在BeginReceive 中使用的byte[] 缓冲区。但是让我们假设它有 32768 字节大。总共大约 163Mb。内存很便宜,不是吗?

至于 CPU 使用率,没有。空闲连接不使用任何 CPU。

【讨论】:

    【解决方案2】:

    查看this bytes.com question,了解在类似情况下允许的理论最大连接数。

    似乎最相关的回应是:

    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.
    

    也就是说,如果在本地 LAN 环境中使用基于 TCP 的 UDP,如果它与您的设计很好地混合,您可能会受益。我个人没有在 C# 中对此进行过任何基准测试,但已成功支持超过 10,000 个 C++ UDP 客户端,几乎没有问题(和一个巨大的盒子)。

    【讨论】:

    • 我不是这两者之间区别的专家,但似乎 UDP 不如 TCP“可靠”;即,如果一个数据包丢失它并不关心。如果我使用 UDP over TCP,我应该期待什么?
    • @bugfixr - 当然 UDP 可能 不如 TCP 可靠,但它的开销也少得多,并且不会为您跟踪您的客户端(这减轻了部分您在努力中会遇到的问题)。在小型局域网环境中,我发现 UDP 非常可靠。除此之外,您应该通过 UDP 实现应用程序协议以帮助确保可靠性。
    【解决方案3】:

    你真的需要保持这么多连接打开吗?

    并不是因为您需要“跟踪”工作站,才需要建立持久连接。您可以按照您的建议让客户端连接并轮询一段时间。它在架构上与 HTTP 有一些相似之处。这样一来,网络服务器甚至可以满足您的服务器需求:所有正在轮询的客户端都可以被视为up,您的服务器可能有话要说,也可能没有。这并不重要,只要您尽可能短地保持连接打开即可。使用这种方法与宽松的轮询超时相结合,很可能很容易覆盖前面提到的由一台服务器“跟踪”的 6000 个工作站。

    另一种选择可能是考虑消息传递基础架构。服务器向命令队列发送命令,接收命令的客户端通过响应队列进行响应。

    我猜UDP可以被认为是实现后者的一种可能方式。但是你必须做更多的工作......

    【讨论】:

    • 那么您是说拥有 6000 个打开的 tcp 连接会对服务器造成负担吗?比使用 WCF 更重要(顺便说一句,我目前使用 WCF 来做你描述的事情,他们轮询并因此在线。但是,服务器在 2000 多个客户端计数时不能很好地处理它)。
    • 您还没有真正讨论过问题的时间维度。正如您所说,问题始于 2000 客户端阈值左右。但是我们说的是每秒 2000 个请求,还是 2000 个持久(打开)连接?后者很容易通过让每个客户端在特定超时时连接、轮询和断开连接来解决。超时时间越长,您可以跟踪的“并发”客户端数量就越多。
    猜你喜欢
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 2013-05-06
    • 2021-10-19
    • 2011-11-23
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多