问题: 我有一个WCF服务,我正在尝试使用JMeter进行性能测试,我注意到,当发送更多并发请求时,服务响应时间会显着增加。第一个并发请求在预期的时间内返回,但每个后续请求都需要花费越来越多的时间 - 因此最后一个请求可能需要两倍的时间。
以下是JMeter中运行的屏幕截图:
守则: 我已经将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获得一致的性能水平,这让我感到惊讶。
如果有人有更好的想法,我会在几天后再提出这个问题。
答案 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/