什么可以延迟与 NetTcpBinding 建立新连接?
Posted
技术标签:
【中文标题】什么可以延迟与 NetTcpBinding 建立新连接?【英文标题】:What can delay the establishment of new connections with NetTcpBinding? 【发布时间】:2014-12-11 11:11:24 【问题描述】:我们有 WCF 服务,有时,通过新建立的通道完成的请求需要 3 到 8 秒,即使使用池通道的并发请求是即时处理的。换句话说,系统总体上是响应式的。
当时并发处理的请求数小于 10,远低于任何配置的上限,并且并发会话数也不应该达到任何限制。这是服务的设置方式:
NetTcpBinding binding = new NetTcpBinding(SecurityMode.None);
binding.ReceiveTimeout = TimeSpan.MaxValue;
binding.ReaderQuotas.MaxArrayLength = int.MaxValue;
binding.ReaderQuotas.MaxStringContentLength = int.MaxValue;
binding.ReaderQuotas.MaxDepth = int.MaxValue;
binding.ReaderQuotas.MaxBytesPerRead = int.MaxValue;
binding.ReaderQuotas.MaxNameTableCharCount = int.MaxValue;
binding.MaxReceivedMessageSize = int.MaxValue;
binding.MaxBufferSize = int.MaxValue;
binding.MaxBufferPoolSize = int.MaxValue;
binding.MaxConnections = 256;
host.AddServiceEndpoint(contract, binding, address);
host.Description.Behaviors.Remove(typeof(ServiceDebugBehavior));
host.Description.Behaviors.Remove(typeof(ServiceMetadataBehavior));
host.Description.Behaviors.Remove(typeof(ServiceThrottlingBehavior));
host.Description.Behaviors.Add(new ServiceMetadataBehavior HttpGetEnabled = false );
host.Description.Behaviors.Add(new ServiceThrottlingBehavior MaxConcurrentCalls = 256, MaxConcurrentSessions = 1000, MaxConcurrentInstances = 1000 );
host.Open();
知道可能是什么问题吗?
【问题讨论】:
【参考方案1】:我尝试对一个类似于我们在生产中的系统进行负载测试,并且能够通过建立大约 100 个连接并让每个连接执行 WCF 调用(仅在 Thread.Sleep(20ms)
on服务器,在无限循环中。
在新创建的通道上执行的方法逐渐增加到 5 秒以上,而在现有通道上执行的相同方法只需要最多 500 毫秒。
事实证明,具有 4 个 cpu 内核的服务器总是在 4 到 7 个不同线程中的 1 个中调用该方法(绝大多数在 4 个线程中的 1 个中,但偶尔在 3 个其他线程中也被使用了)。如果这些方法正在等待 IO(通过对 Sleep() 的调用来模拟),这不会给您带来很多并行性,这尤其有用。
我尝试了ThreadPool.SetMinThreads(40, 40)
,但这并没有帮助,我猜是因为bug in .net 3.5。
所以我尝试了 .net 4,即使没有调用 SetMinThreads,问题也消失了。我注意到 服务器上的方法现在从更多不同的线程调用,并且实际使用的 IO Completion Port Threads 的数量也会根据需要增加。
NB 实际上,MS 的知识库中有类似的东西:WCF service may scale up slowly under load 它提出了一种解决方法,使 WCF 在工作线程而不是 IO 线程上执行,根据那篇文章, 可以进入
一种无法以足够快的速度创建线程以立即处理突发请求的状态。随着新线程以每 500 毫秒 1 个的速度创建,响应时间意外增加。
这已经够糟糕了,但在我的情况下,根本没有创建新的 IO 线程,至少在我的测试的几十秒内没有。
【讨论】:
以上是关于什么可以延迟与 NetTcpBinding 建立新连接?的主要内容,如果未能解决你的问题,请参考以下文章
使用 netTcpBinding 的慢(ish)WCF 连接速度