2011-03-07 65 views
2

我有WCF服務。我用basichttp綁定和tcp綁定做了一些測試。WCF主機和性能

在控制檯客戶端我創建了數以百計的線程,並擊中了與TCP和HTTP服務綁定。原來TCP比http快兩倍。

然後我做了在IIS上運行,並擊中服務的Web客戶端。 原來,http比TCP更快。

這是怎麼發生的?是不是TCP應該比basichttp更快? COde就像下面的一樣。類似。

stopwatch start here 

Thread[] ts = new Thread[100]; 
for(int i= 0; i< ts.lenght;i++){ 
    ts[i] = new Thread(foo); // replace with bar for the second test. 
    ts[i].start(); 
} 

for(int i 0;i< ts.lenght;i++){ 
    ts[i].join(); 
} 

stopwatch stop here. 

public static void foo(){ 
MyServiceClient myclient = new MyServiceClient("netTcpBinding"); 
myclient.GetResult(1); 
} 

public static void bar(){ 
MyServiceClient myclient = new MyServiceClient("basicHttpBinding"); 
myclient.GetResult(1); 
} 
+0

這取決於您的測試代碼。 – 2011-03-07 14:31:24

+0

您的第二個測試是否與服務在同一臺機器上運行? – jonathanpeppers 2011-03-07 14:39:47

+0

他們是相同的代碼。我只是用兩種配置調用一種服務方法。綁定只有不同。 – DarthVader 2011-03-07 14:40:28

回答

3

你知道,WCF已經節流上默認打開。在運行這些測試,你應該關閉它通過使用配置的該位在你的web.config的serviceModel部分:

<behaviors> 
    <serviceBehaviors> 
    <behavior> <!-- can omit name in .NET 4 --> 
     <serviceThrottling 
     maxConcurrentCalls="10000" 
     maxConcurrentSessions="100000" 
     maxConcurrentInstances="100000" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

默認值因版本而異,但在16,10,100或即使您的web.config/app.config中沒有限制條目,那些較低的默認值也適用於

祝你好運。

+1

在.NET 4.0中,它們依賴於系統的「ProcessorCount」,以便根據運行服務的計算機的功能自動縮放限制限制。有關詳細信息,請參閱[WCF 4:WCF服務的默認限制更高設置](http://blogs.msdn.com/b/wenlong/archive/2009/07/26/wcf-4-higher-default-throttling-設置換WCF的services.aspx)。 – 2012-11-12 15:09:36

0

我認爲問題是,託管進程的。 .NET默認爲一定數量的在線程池工作線程可由進程創建的線程任務之前被覆蓋。考慮你的第二個測試是在IIS,這與的AppFabric默認爲HTTP結合之前WCF4中,IIS由於野獸的本質可能很可能會改變工作線程的默認數量。

只是因爲你問說任何給定的機器上100個線程,並不意味着所有將立即被創建,而是排隊更不用說線程上下文切換的限制。

作爲一般規則,你不應該比機器上的內核數量創造更多的工作線程。

+0

這是真的。您可以執行諸如ThreadPool.SetMinThreads()等等的事情。但請注意,WCF會在此限制之上施加限制限制。 – 2012-11-13 19:30:43