【问题标题】:WCF client timeout under heavy load重负载下的 WCF 客户端超时
【发布时间】:2011-12-07 14:39:14
【问题描述】:

我已经在这里问过一个类似的问题:WCF Service calling an external web service results in timeouts in heavy load environment,但我现在对发生的事情有了更好的了解,所以发布一个新问题。

这是正在发生的事情:

  • .NET 客户端同时向 WCF 服务发送多个请求(如果有帮助 - 我正在使用 Visual Studio 负载测试复制此场景)
  • 客户端已将“sendTimeout”设置为 5 秒
  • WCF 服务接收它并开始处理它。该处理涉及向外部服务发送请求,该请求可能需要大约 1 秒才能返回响应
  • 这就是我认为问题所在:客户端已向服务发送了许多请求,并且由于服务仍在忙于处理并发请求,因此来自客户端的一些请求在 5 秒后超时

我尝试了以下方法:

  • 将 InstanceContextMode 更改为 PerCall
  • 增加了 maxConcurrentCalls 和 maxConcurrentInstances 的值
  • 增加了 machine.config 中 connectionManagement.maxconnection 的值

但这些似乎都没有任何区别。有谁知道如何确保我不会遇到这个超时问题?

【问题讨论】:

  • 感谢大家的帮助和指点。我想我找到了问题所在。我不得不增加 maxConcurrentCalls 和 maxConcurrentSessions 的值——这反过来意味着服务必须有 PerCall 的 InstanceContextMode。我之前也这样做过,但是在我的负载测试中是在测试一个单元测试,而这些配置更改没有任何区别。当我创建一个新的 Web 测试然后对其进行负载测试时,一切似乎都很好地结合在一起。但一直无法弄清楚为什么会这样!

标签: wcf


【解决方案1】:

好的,你说的是 WCF,这还不够。您正在使用什么绑定以及在哪里托管它?如果您使用的是 IIS,则可能与自托管不同。

可能的原因是 ThreadPool 大小数量较少。您可以使用ThreadPool.SetMaxThreads() 更改此值,但请注意这是一个敏感值。看看here

【讨论】:

  • 抱歉 - 该服务托管在 IIS 中,并且正在使用 basicHttpBinding。我将尝试 ThreadPool 大小建议。
【解决方案2】:

查看以下链接:
http://weblogs.asp.net/paolopia/archive/2008/03/23/wcf-configuration-default-limits-concurrency-and-scalability.aspx

我不确定你想要达到什么目的。由于 WCF 服务正在执行一项耗时的操作,因此您不能重载它并期望它能够正常工作。您可以执行以下操作(检查有关设置以下内容的链接):

  1. 增加wcf服务的接收能力
  2. 增加服务的发送超时时间
  3. 增加客户端的发送超时时间
  4. 增加客户端的接收超时时间
  5. 限制到 wcf 服务的传出连接

最好和最可靠的选择是配置 MSMQ 并将其与 WCF 服务一起使用。

【讨论】:

  • 服务需要同步 - 所以不要认为 MSMQ 是一个选项 - 是吗?我还没有研究过 MSMQ 方面的事情。我会调查的。根据您的建议:如何“限制到 wcf 服务的传出连接”?
  • 尝试设置 maxConnections (我认为这包括传入和传出连接)。如果您使用 TCP 或 NamedPipes,还要检查 TcpConnectionPoolSettings.MaxOutboundConnectionsPerEndpoint 属性。
猜你喜欢
  • 1970-01-01
  • 2012-11-24
  • 2011-03-22
  • 2011-07-07
  • 2012-03-25
  • 2013-02-09
  • 1970-01-01
  • 2016-02-16
  • 2010-12-04
相关资源
最近更新 更多