2014-02-19 59 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