如何在受应用程序线程池限制的情况下提高TCP/IP服务器的可伸缩性

本文关键字:情况下 TCP 可伸缩性 服务器 IP 应用程序 线程 | 更新日期: 2023-09-27 18:01:38

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

如何在受应用程序线程池限制的情况下提高TCP/IP服务器的可伸缩性

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

您必须小心队列不能无限制地增长—如果您的消费者比生产者慢得多,并且队列在正常负载下增长,那么您就遇到了一个问题,限制网络接收是一个明显的解决方案,尽管它不受欢迎。

你在这里犯了一个思想错误。无论您有多少线程,数据总是必须等待,除非您有一个CPU CORE PER CONNECTION。可伸缩性不是无限的并行性,而是能够处理大量的连接并保持cpu的全功率。

线程池的大小完全适合于此。一旦CPU达到充分利用,您就不能做任何其他事情了。

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

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