我有一个用C#.net编写的TCP / IP服务器,它可以轻松实现10,000个连接。但是,当从套接字收到回调时,它将由应用程序线程池中的新线程处理。这意味着真正的并发通信限制低至线程池中的线程数。例如,如果这10,000个连接都试图同时发送数据,则大多数连接将在线程池尽可能快地运行时等待。任何人都可以分享他们在高性能套接字服务方面的经验,并建议大公司如何确保10,000个连接不仅可以同时连接,还可以同时进行通信?感谢
答案 0 :(得分:2)
不要在回调中内联处理数据包。在那里做绝对最小的工作,然后通过生产者 - 消费者队列将它们交给一个单独的工作线程池,该队列(理想情况下)永远不会阻塞生产者线程,这是你的套接字监听器。 BlockingCollection<T>
在这里可能很有用。
你必须要小心队列不会无限制增长 - 如果你的消费者比生产者慢得多,并且队列在正常负载下增长,你就会遇到一个问题,即网络接收的节流是明显的解决方案,尽管它的不受欢迎程度。
答案 1 :(得分:1)
你在这里犯了一个思想错误。无论你有多少线程,数据总是要等待,除非你有一个CPU CORE PER CONNECTION。可扩展性没有无限制的并行性,但可以处理大量的问题并使cpu保持全功率。
线程池的大小非常合适。一旦CPU达到完全利用率,您无论如何都无法做任何其他事情。
并建议大公司如何确保10,000个连接不仅可以 同时连接,但也可以同时通信?
许多计算机总共拥有500个处理器核心。诀窍是:什么延迟是可以接受的。你不需要即时通讯。你试图从错误的一端解决这个问题。