WCF服务(在IIS中托管)的性能问题被20个并发请求命中

时间:2012-03-08 09:59:27

标签: wcf iis

问题: 我有一个WCF服务,我正在尝试使用JMeter进行性能测试,我注意到,当发送更多并发请求时,服务响应时间会显着增加。第一个并发请求在预期的时间内返回,但每个后续请求都需要花费越来越多的时间 - 因此最后一个请求可能需要两倍的时间。

以下是JMeter中运行的屏幕截图: Performance Test Results

守则: 我已经将WCF服务剥离到最低限度,因此所有服务方法只包含一个Thread.Sleep()来模拟稍长的运行过程。

[ServiceContract]
public interface IAvailabilityService
{
  [OperationContract]
  Thing GetSomething(Request request)
}    

[ServiceBehavior(
  InstanceContextMode = InstanceContextMode.PerCall, 
  AddressFilterMode = AddressFilterMode.Any)]
public class AvailabilityService : IAvailabilityService
{
  public Thing GetSomething(Request request)
  {
    Thread.Sleep(20000);
    return new Thing();
  }
}

该服务配置如下:

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="MyService.AvailabilityService"
               behaviorConfiguration="DefaultServiceBehavior">
        <endpoint address="" 
                  binding="basicHttpBinding"
                  bindingConfiguration="bindingConfig"
                  contract="MyService.IAvailabilityService" />
      </service>      
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="DefaultServiceBehavior">      
          <serviceMetadata httpGetEnabled="true"/>      
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <basicHttpBinding>
        <binding name="bindingConfig">
          <security mode="None">
            <transport clientCredentialType="None" />
            <message establishSecurityContext="false" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

我还尝试将服务配置为以其他标准HTTP绑定方式运行。此外,我已尝试在绑定配置上提升服务限制级别(虽然我确信对于20个请求,默认值应该没问题。)

服务设置: 该服务在.NET 3.5中的Windows Server 2008 R2上的IIS 6.1中运行。 虽然我们在IIS 7上也看到过相同的行为。

服务跟踪 我已启用跟踪,这表明该服务总是需要大约20秒来处理每个响应,但连接上的接收字节具有交错的开始时间,这反映了JMeter报告的时间差异。

这是否表明IIS服务激活滞后?它不能是WCF中的并发问题,因为您希望最后一个线程是第一个线程执行的20倍。

提前致谢

伊恩

更新 我通过增加IIS中的工作进程数来匹配我希望服务处理的并发请求数(20) - 使网站成为Web Garden,从而设法获得一致的响应。虽然我需要这样做才能从WCF获得一致的性能水平,这让我感到惊讶。

如果有人有更好的想法,我会在几天后再提出这个问题。

2 个答案:

答案 0 :(得分:2)

通过增加IIS中应用程序池的工作进程数来解决此问题。正如this博客文章所提到的,WCF中可能长时间运行的进程必须由多个工作进程支持。

Web服务器上还有一个平衡操作,以确保工作进程不会超过计算机RAM并进入虚拟内存,这也会降低处理速度。

答案 1 :(得分:1)

您应该查看限制设置。默认值非常低,通常会将并发请求数限制为10。

请参阅此博文:http://www.lybecker.com/blog/2010/10/06/wcf-throttling-%E2%80%93-part-1/