如何增加WCF服务的并行连接数

时间:2014-09-11 12:17:09

标签: c# .net wcf windows-server

我正在调查我们的网络应用程序存在的性能问题。它使用4层架构,MVC4 webapp,WCF数据服务和SQLServer作为DB。 尽管有足够的可用资源,但数据服务并未真正扩展请求。它似乎只能并行回答10-12个请求并排队所有其他请求。我希望它能同时回答> 100个请求。

  1. 我尝试使用我找到的所有配置值 WCF的这个主题:system.net - > connectionManagement - >加 maxconnection = 100 serviceBehavior - > serviceThrottling - > maxConcurrentCalls /实例/会话= 100。没有成功。
  2. 我尝试使用httpBinding以及我找到的netTcpBinding 参数maxConnections并将其设置为100.没有成功。
  3. 是WCF吗?我实现了一个简单的sleep.aspx webform,它有1s到 return(使用Thread.Sleep())。相同的结果,只有10-12个请求 在1秒内回答,进一步的请求排队。
  4. 是.Net吗?我在testmachine上安装了ActiveState Perl 写了一个小的Perl脚本,它做了同样的事情。相同的结果,10-12 请求直接回答,其他请求排队。
  5. 是Windows吗?我在Linux机器上安装了Perl脚本 Apache的。测试客户端在Windows下运行。在这个星座我 当我将Apache配置为具有尽可能多的响应时,在1秒内得到100个响应 服务器进程。
  6. IIS也可以使用多个进程而不是多个进程运行 线程(Web园)也是如此。啊,在这种情况下,IIS也回答100 请求并行。
  7. 所有这些让我得出结论,单个Windows进程可能无法并行处理超过10-12个TCP连接。

    这是真的吗?可以在某处配置吗?

    由于数据服务的设计,它不应该与多个进程一起运行,因为它使用了一个需要与所有其他实例同步的对象缓存。

    Google似乎对此问题了解不多。

    环境:Windows Server 2008 R2 / Windows Server 2012 R2,MVC4,WCF,.Net 4.5.1

    Thomy

2 个答案:

答案 0 :(得分:2)

 <serviceBehaviors>
     <behavior name="defaultServiceBehavior">
          <serviceThrottling maxConcurrentCalls="100" 
                 maxConcurrentInstances="100" maxConcurrentSessions="100" />
     </behavior>
 </serviceBehaviors>

以下是这些设置的摘要:

maxConcurrentCalls: defines the maximum number of messages actively processed by all the service instances of a ServiceHost. The default value is 16. Calls in excess of the limit are queued.

maxConcurrentInstances: defines the maximum number of service instances that can execute at the same time. The default value is Int32.MaxValue. Requests to create additional instances are queued and complete when a slot below the limit becomes available.
maxConcurrentSessions: defines the maximum number of sessions that a ServiceHost instance can accept at one time. The default value is 10. The service will accept connections in excess of the limit, but only the channels below the limit are active (messages are read from the channel).

答案 1 :(得分:1)

您可以尝试几件事

添加服务行为以最大化其可以处理的呼叫数量

  <serviceBehaviors>
    <behavior name="StandardServiceBehavior">
      <serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="10000"/>
    </behavior>
 </serviceBehaviors>

您是否尝试过使用服务行为中的并发模式?

可能会将服务行为设置为

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]

请参阅此设置在此处执行的操作的完整说明。

http://msdn.microsoft.com/en-us/library/system.servicemodel.concurrencymode(v=vs.110).aspx

您可能还想尝试为wcf服务添加一些日志记录,请参阅此链接

http://msdn.microsoft.com/en-us/library/ms730064(v=vs.110).aspx

它应该让您更深入地了解实际发生的情况以及是否存在任何错误。有时我也看到,如果maxconcurrentcalls已被命中,它会将调用排入队列,这些会显示为警告。