2011-11-17 37 views
4

我正在基準自我託管nettcp WCF服務,從50個線程向位於同一臺計算機上的服務發出請求。問題在於Xeon E3-1270的CPU利用率從未超過35%。當我在兩臺筆記本電腦上運行相同的測試時,它的確會達到100%。WCF無法達到100%的CPU。什麼是瓶頸?

WCF方法什麼都不做,所以它不應該被IO限制。我試圖增加線程的數量,但這沒有幫助。每個線程創建一個服務通道並執行數千次重用該通道實例的調用。

這裏是我使用的服務類:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class TestService : ITestService 
{ 
    public void Void() 
    { 
     // DO NOTHING 
    } 
} 

CONFIGS:

ServiceThrottlingBehavior: MaxConcurrentCalls = 1000 MaxConcurrentInstances = 1000, MaxConcurrentSessions = 1000

NetTcpBinding的 將ListenBackLog = 2000 MaxConnections = 2000

+0

如果你把一些實實在在的工作一樣,會發生什麼'回報Enumerable.Range(1,10000).Sum();'? –

+0

打開perf計數器http://msdn.microsoft.com/en-us/library/ms735098.aspx並使用perfmon.exe檢查是否達到某些(限制/積壓)設置的上限。 – larsw

回答

1

我會嘗試將您的InstanceContextMode更改爲PerCall。我很肯定你當前的配置設置將被忽略,因爲WFC只創建你的類的單個實例,並將按順序處理它們。使用PerCall,將爲每個請求創建一個新實例,直到達到最大線程數或配置限制。您不應該需要netTcpBinding設置,但要保持您的調節行爲,但要確保您的比例正確,否則可能會產生不利影響。

  • MaxConcurrentCalls:16個*處理器數量
  • MaxConcurrentSessions:100 *處理器數量
  • MaxConcurrentInstance:總和(116 *處理器數量)