Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 受应用程序线程池限制时如何提高TCP/IP服务器的可扩展性_C#_.net_Sockets_Tcp - Fatal编程技术网

C# 受应用程序线程池限制时如何提高TCP/IP服务器的可扩展性

C# 受应用程序线程池限制时如何提高TCP/IP服务器的可扩展性,c#,.net,sockets,tcp,C#,.net,Sockets,Tcp,我有一个用C#net编写的TCP/IP服务器,它可以一次轻松地连接10000个连接。但是,当从套接字接收回调时,它将由应用程序线程池中的新线程处理。这意味着真正的并发通信限制取决于线程池中的线程数。例如,如果这10000个连接都试图同时发送数据,那么大多数将不得不等待线程池以尽可能快的速度运行。是否有人可以分享他们在高性能套接字服务方面的经验,并建议大型公司如何确保10000个连接不仅可以同时连接,还可以同时通信?谢谢不要在回调中内联处理数据包。在那里做绝对最小的工作,然后通过生产者-消费者队列

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

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


您必须小心,队列不会无限增长-如果您的消费者比生产者慢得多,并且队列在正常负载下增长,那么您就有一个问题,对网络接收进行节流显然是一个解决方案,尽管它不受欢迎。

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


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

您在这里犯了一个思想错误。无论有多少线程,数据总是要等待,除非每个连接有一个CPU核。可伸缩性不是具有无限的并行性,而是能够处理许多问题并保持cpu处于满功率状态

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

并建议一家大公司如何确保10000个连接不只是 同时连接,但也可以同时通信


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

你在这里犯了一个思想错误。无论有多少线程,数据总是要等待,除非每个连接有一个CPU核。可伸缩性不是具有无限的并行性,而是能够处理许多问题并保持cpu处于满功率状态

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

并建议一家大公司如何确保10000个连接不只是 同时连接,但也可以同时通信


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

您好,谢谢您的回答,您建议不要在回调中内联处理数据包;我正在做的是使用异步套接字,我的功能如下所示,您能根据您的建议确认这是合适的吗?谢谢private void receiveClientCallback(IAsyncResult结果){SocketConnection client=(SocketConnection)result.AsyncState;client.EndReceive(result);System.Threading.ThreadPool.QueueUserWorkItem(new ConnectionHandler(this,client).ThreadPoolCallback);}大致上就是这个想法。实践中的适用性取决于谁在使用该流程
ThreadPool
。使用您自己的队列和线程池将使您能够更严格地控制-在
ThreadPool
上,您正在与其他“东西”竞争,并且应该了解系统中的内容,以了解是否应该使用私有池。您可能只需要调整
ThreadPool
参数。线程池仅为连接处理程序线程保留,这些线程只进行两次数据库查询,然后将特定数据包内容保存到一个文件中,另一个服务在其自己的线程池中拾取并处理该文件听起来您可以参与其中。不过,虚拟化这会让我感到困扰。尝试在真实硬件上进行基准测试,以防您需要VM降级的证据。您好,谢谢您的回答,您建议不要在回调中内联处理数据包;我正在做的是使用异步套接字,我的功能如下所示,您能根据您的建议确认这是合适的吗?谢谢private void receiveClientCallback(IAsyncResult结果){SocketConnection client=(SocketConnection)result.AsyncState;client.EndReceive(result);System.Threading.ThreadPool.QueueUserWorkItem(new ConnectionHandler(this,client).ThreadPoolCallback);}大致上就是这个想法。实践中的适用性取决于谁在使用该流程
ThreadPool
。使用您自己的队列和线程池将使您能够更严格地控制-在
ThreadPool
上,您正在与其他“东西”竞争,并且应该了解系统中的内容,以了解是否应该使用私有池。您可能只需要调整
ThreadPool
参数。线程池仅为连接处理程序线程保留,这些线程只进行两次数据库查询,然后将特定数据包内容保存到一个文件中,另一个服务在其自己的线程池中拾取并处理该文件听起来您可以参与其中。虚拟化此wo