2014-02-19 51 views
1

我的WCF服务配置:WCF响应时间,节流

<system.net> 
    <connectionManagement> 
     <add address ="*" maxconnection="500"/> 
    </connectionManagement> 
</system.net> 

<bindings> 
    <basicHttpBinding> 
    <binding name="customBasicHttpBinding" 
     maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" 
     transferMode="StreamedResponse"> 
     <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
       maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
       maxNameTableCharCount="2147483647"/> 
     <security mode="None"/> 
    </binding> 
    </basicHttpBinding> 
    <webHttpBinding> 
    <binding name="customWebBinding" maxBufferSize="2147483647" 
     maxReceivedMessageSize="2147483647"> 
     <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
      maxArrayLength="2147483647" maxBytesPerRead="2147483647" 
      maxNameTableCharCount="2147483647"/> 
     <security mode="None"> 
     </security> 
    </binding> 
    </webHttpBinding> 
</bindings> 

<serviceBehaviors> 
    <behavior name="soapBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
     <dataContractSerializer maxItemsInObjectGraph="6553600"/> 
     <serviceDebug includeExceptionDetailInFaults="false"/> 
     <serviceThrottling maxConcurrentCalls="100" 
      maxConcurrentInstances="100" maxConcurrentSessions="100" /> 
    </behavior> 
</serviceBehaviors> 

<services> 
    <service behaviorConfiguration="soapBehavior" name="Service.Service"> 
     <endpoint name="soap" 
      address="" 
      binding="basicHttpBinding" bindingConfiguration="customBasicHttpBinding" 
      contract="ServiceModel.IService"/> 
     <endpoint 
      address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
    </service> 
</services> 

正如你可以看到我设置节流参数处理100个并发实例。

对于我我的界面上创建虚拟方法的测试目的,看起来像这样

[OperationContract] 
string Test(){ 
    return "test response time"; 
} 

当我试图调用此方法,它使用100平行请求的ats一次响应时间是非常糟糕:

现在运行的100个并行请求...
ResponseTimes:0,45205P,10,047P,0,43304P,0,86609P,1,33913P,0,91409P,1,34713P,1,75718P,1 ,37414P,1,80718P,1,80618P,2,22622P,2,64426P,2,22822P,2,62626P,2,68127P,3,0453P,3,10731P,3,47 635P,3,51035P,3,91039P,3,94039P,3,9544P,4,36844P,4,34943P,4,78748P,4,37144P,4,82248P,4,79048P,5,25052P,4,81948P, 5,657657P,5,25253P,5,71657P,5,67357P,6,13761P,5,70257P,6,56566P,6,12361P,7,0117P,6,53065P,7,43674P,6,9517P, 86679P,7,36974P,7,81778P,8,29483P,8,75988P,8,71587P,8,24182P,8,70187P,9,16392P,9,12991P,9,19492P,9,57596P,9,65797P, 10,08201P,10,45205P,10,52505P,10,48905P,10,9521P,10,89709P,11,37714P,11,81118P,11,32413P,11,76418P,11,83918P,12,18222P, 31723P,12,60526P,12,75128P,13,0423P,13,17132P,13,48935P,13,64836P,13,91039P,14,07141P,14,32843P,14,48945P,14,78548P,14,91149P, 15,20652P,15,33153P,15,62856P,15,75558P,16,0516P,16,19262P,16,48265P,16,61866P,16,91169P,17,05471P,17,33773P,17,48375P, 74677P,17,92079P,18,15782P,18,34183P,18,58086P,18,77388P,19,0069P,
0次请求失败。
平均响应时间:9,20126

为什么结果如此糟糕,我试图改变应用程序池工作进程计数,但没有运气,谁能告诉我缺少的是什么,什么是设置限制?

我在Windows Server 2008R2机器上使用WCF 4.0,IIS7.5。

谢谢

+0

当然,这是一个并发问题。您没有提及您用于ConcurrencyMode(默认为单一)和其他设置。 –

回答

1

这是很难提供关于没有关于服务,配置和环境的详细信息通信性能问题很大的启示。至少,您可以提供服务绑定,ServiceBehaviorAttribute和有关客户端配置的信息。

从进行WCF性能测试和优化的几年来看,尽管服务器资源似乎没有出现,但是尽管服务器资源看起来并不像“尽管有100个并发连接”那样“有效”忙。在我们的例子中,“延迟”与缓慢的“冷”启动以及.NET线程池分配线程所花费的时间相关联。

下面的文章讨论我们的问题:
http://blogs.msdn.com/b/dmetzgar/archive/2011/05/04/wcf-scales-up-slowly-with-bursts-of-work.aspx

好运。

+0

我编辑我的帖子,所以提供了绑定 – Avicena00

0

我刚刚完成了一个大规模的工业规模的WCF项目,该项目使用了限制,并发现限制并不总是产生您期望的结果。我们在生产级虚拟服务器上设置了我们的WCF Web服务,然后我们创建了一个测试工具,在多线程程序上模拟了1000多个虚拟客户端。一旦我们准备好了,我们就使用一系列1 - 1000的不同节流设置反复运行测试,但结果令人惊讶。

例如,你可能会认为运行与200个最大并发连接您的网络服务是快两倍,100最大连接数,但是这不是我们发现设置了诸如:

-max并发会话

-max并发呼叫

-max并发实例

在现实中,没有太多的一种表现(callsProcessed /秒)MaxConcurrentSessions = 10和之间的差异MaxConcurrentSessions = 1000。每秒处理的呼叫大致相同,只有内存使用情况不同。与其他油门设置相同。

我们发现用于节流的最快设置?根本没有设置;基本上,让System.ServiceModel库处理一切。这是我们经过几天测试后发现的最快速度。

就你的表现而言,我会做的是试着找出瓶颈在哪里。例如,如果您的WCF服务使用SQL来检索数据,请尝试消除SQL并返回一个静态数据集并查看您的时间是否显着提高。如果是这样,那么也许你需要在事物的数据库方面工作。如果没有,可能在处理SOAP消息时出现问题。

+0

这就是我创建返回字符串的哑元方法的原因,并且没有其他的工作,你可以想象当我意识到使用100个并行请求调用该方法时我的脸上有多愚蠢的样子平均响应时间是9秒 – Avicena00

+0

这对于基本的ping功能来说非常慢。西摩提到的“缓慢,冷启动”可能是一个问题。 我想我会尝试一种非常简单的方法,评论所有无关的限制和消息大小的限制。如果事情加速,这可能只是一个启动问题。如果你仍然有问题,也许这是一个网络问题(假设你使用几台机器)。 – Brian