与服务器建立300个tcp连接时的延迟



我们最近集成了一些旧产品并进行了一些负载测试,其中一个产品使用了遗留技术.Net远程处理(使用TCP(。通过Process Explorer,我发现每个代理调用都会创建一个TCP/IP连接。

远程处理客户端和服务器都作为Window Service托管,我们有多个服务器,每个服务器最多只能同时接收4个请求,所以我预计限制来自远程处理客户端,只有1个远程处理客户端在完成所有任务,因为客户端-服务器被设计为核心中间人。

以下是我迄今为止对的研究和测试

  1. 客户端机器看起来不错,CPU、内存、网络和IO仍有可用资源
  2. 增加的最小线程池
  3. app.config中的最大连接数增加

行为有点类似于线程池,当活动线程超过设置中的最小线程时,所有需要线程的子序列任务都将被放入队列,如果线程池无法按时释放空闲线程,则会创建新线程,但每个创建的线程将引入大约500ms的开销。

当它达到大约250个请求时,延迟开始出现,所以我的问题是,当太多连接像线程池一样同时建立时,TCP是否会引入一些开销?

我们已经研究了很多天,但仍然没有任何线索,任何建议或提示都将不胜感激。

这听起来像是原始C10K问题的一个版本(早就解决了(。

当所有连接都被放入某个数组中,然后定期迭代以查看需要对它们做什么时,就会发生这种情况。最初的C10K问题是由epoll()和各种异步IO技巧解决的。

我敢打赌,遗留的.Net代码是根据Socket.Select()(或需要它的东西(编译的,这就是问题所在。

看看这个悲惨的故事。

最新更新