调用WCF服务时的BottleNeck / delay

时间:2015-10-28 21:56:18

标签: c# .net performance wcf threadpool

我使用方法Do work创建了一个简单的WCF服务,该方法休眠15秒然后返回一个字符串。它是一个具有多个并发的Singleton服务。

客户端(.net桌面应用程序)的for循环为100以调用此函数。我想看看我可以同时处理多少个线程并提高性能。

我正在使用NetTCP绑定并添加了性能参数

服务器配置

<services>
  <service name="WCFService.WCFService" behaviorConfiguration="mexbahaviour">
    <endpoint address="WCFService" binding="netTcpBinding" contract="WCFService.IWCFService" ></endpoint>
    <endpoint address="WCFService" binding="netNamedPipeBinding" contract="WCFService.IWCFService" ></endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" ></endpoint>
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8090/ "/>
        <add baseAddress="net.tcp://localhost:8091/ "/>
        <add baseAddress="net.pipe://localhost/ "/>
      </baseAddresses>
    </host>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="mexbahaviour">
      <serviceMetadata httpGetEnabled="true" />
      <serviceThrottling maxConcurrentCalls="300" maxConcurrentSessions="300"
        maxConcurrentInstances="600" />
    </behavior>
  </serviceBehaviors>
</behaviors>

问题是请求没有足够快地命中服务器。初始秒有4个请求,但之后每秒有2个请求。 The output window on service looks like this.

因此,只要请求命中服务并记录接收时间并进入休眠状态,就会创建一个新线程。

我在客户端添加了连接管理部分

<connectionManagement>
  <add address="*" maxconnection="100"/>
</connectionManagement>

是否因线程创建而延迟?或者我遇到的一些服务限制限制?

请提出我的建议。

我也尝试使用这篇有用的文章来实现 Boost WCF Performance

1 个答案:

答案 0 :(得分:0)

我认为,这是基于线程池的基本策略。您可以按如下方式修改minThreads,

int worker, int io;
ThreadPool.GetMinThreads(out worker, out io); 
ThreadPool.SetMinThreads(worker, 100 - io); // 100 is just sample value.