【问题标题】:How to improve TCP/IP server scalability when restricted by application thread pool受应用程序线程池限制时如何提高 TCP/IP 服务器的可扩展性
【发布时间】:2011-07-08 13:46:11
【问题描述】:

我有一个用 C# .net 编写的 TCP/IP 服务器,它可以轻松地同时拥有 10,000 个连接。但是,当从套接字接收到回调时,它会由应用程序线程池中的新线程处理。这意味着真正的并发通信限制取决于线程池中的线程数。例如,如果这 10,000 个连接都尝试同时发送数据,则大多数连接将不得不等待线程池尽可能快地运行。任何人都可以分享他们在高性能套接字服务方面的经验,并建议大公司如何确保 10,000 个连接不仅可以同时连接,而且还可以同时通信?谢谢

【问题讨论】:

    标签: c# .net sockets tcp


    【解决方案1】:

    不要在回调中处理内联数据包。在那里做绝对最少的工作,然后通过生产者-消费者队列将它们交给一个单独的工作线程池,该队列(理想情况下)永远不会阻塞生产者线程,它们是您的套接字侦听器。 BlockingCollection<T> 在这里可能有用。

    您必须注意队列不会无限增长 - 如果您的消费者比生产者慢很多,并且队列在正常负载下增长,那么您就会遇到一个问题,即限制网络接收是显而易见的解决方案,尽管这是不受欢迎的。

    【讨论】:

    • 您好,感谢您的回答,您建议不要在回调中内联处理数据包;我正在做的是使用异步套接字,我的功能有效如下,您能否根据您的建议确认这是否合适?谢谢.. private void receiveClientCallback(IAsyncResult result){SocketConnection client = (SocketConnection)result.AsyncState;client.EndReceive(result);System.Threading.ThreadPool.QueueUserWorkItem(new ConnectionHandler(this, client).ThreadPoolCallback);}跨度>
    • 大体上就是这样。实践中的适用性取决于还有谁在使用流程ThreadPool。使用您自己的队列和线程池将使您获得更严格的控制 - 在ThreadPool 上,您正在与其他“东西”竞争,并且应该了解系统中的内容,以了解您是否应该使用私有池。调整ThreadPool 参数可能就是您所需要的。
    • 线程池是专门为连接处理线程保留的,它们只进行几次数据库查询,然后将特定的数据包内容保存到一个文件中,另一个服务会在它自己的线程池中提取和处理
    • 听起来你可以参加派对。虚拟化这会困扰我。尝试在真实硬件上进行基准测试,以防您需要 VM 退化的证据。
    【解决方案2】:

    你在这里犯了一个想法错误。不管你有多少线程,数据总是需要等待,除非你每个连接都有一个 CPU 核心。可扩展性不是无限并行,而是能够处理大量的连接并保持cpu满功率。

    线程池的大小非常适合。一旦 CPU 达到完全利用率,你就不能再做任何事情了。

    并建议大公司如何确保 10,000 个连接不仅可以 可以同时连接,还能同时通信吗?

    许多计算机总共有 500 个处理器内核。诀窍是:什么延迟是可以接受的。您不需要即时通讯。你试图从错误的角度解决这个问题。

    【讨论】:

    • 谢谢 TomTom,你似乎澄清了我的想法,这必须尽可能好,现在真的没有其他方法可以改进,从这里开始必须归结为硬件。我有一台 8 核笔记本电脑,可以在几秒钟内接受 10,000 个连接,但是如果这些连接继续发送身份验证数据包,这会导致线程查询数据库,然后它们会继续传输 3kb 的数据,接受、验证、然后接受来自 10,000 个连接的 3kb 数据包总共需要 7 分钟
    • 我很担心,因为我们要在其上运行此服务器的虚拟专用服务器只有 1 gig 的 ram 和 1 个内核。如果我们将 VPS 增加到 8 核,并且仍然需要 7 分钟来接受来自 10,000 个连接的 3kb,那么,我想我们将需要几台服务器,每台服务器运行多个服务副本,以处理这么多的连接。
    • 天哪,您的 bean 计数器想要虚拟化您的系统?听起来这个配置是个坏主意。 imo担心你是对的。
    • 是的。获取服务器。如果您必须执行该负载,则不要进行虚拟化。你得到一个真正的服务器,24 核向上,看看它是如何处理它的。
    猜你喜欢
    • 2020-09-06
    • 2012-05-20
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 2011-01-18
    • 2016-06-03
    相关资源
    最近更新 更多