【问题标题】:BottleNeck/delay when Calling WCF service调用 WCF 服务时的瓶颈/延迟
【发布时间】:2016-01-28 21:23:39
【问题描述】:

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

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

我正在使用 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

【问题讨论】:

  • Source Code。它具有用于测试的服务和客户端代码。

标签: c# .net performance wcf threadpool


【解决方案1】:

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

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

【讨论】:

  • 实际上我确实将最小和最大线程设置为 500 和 2000。但它没有帮助。 Source Code。它有测试服务器和客户端应用程序。
  • 好吧,我弄错了。这种情况下你必须增加IO线程,而不是工作线程。你只需修改这一行,ThreadPool.SetMinThreads(_NewMinThreads, _CurrentMinCompPort);如下,ThreadPool.SetMinThreads(_NewMinThreads, 100);
  • 感谢您的帮助,通过将 IO 线程增加到 500,我能够同时进行最多 300 次调用。您知道如何更进一步吗?或者最好使用任务并行库来增加同时调用。
  • 300 可能取决于 ,因此您可以通过使用 ThreadPool 设置它们来增加。在这种情况下,使用 TPL 并没有太大帮助。因为TPL也是基于ThreadPool的。看这篇文章New and Improved CLR 4 Thread Pool Engine
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
相关资源
最近更新 更多