2012-06-04 157 views
8

我正在創建一個WCF服務器 - 客戶端應用程序。然而,在我第一次測試,一個簡單的調用(基本方法只是return true;)需要花費大量的時間(約5秒),簡單的WCF調用需要很長時間

我試圖跟蹤它,這裏的呼叫跟蹤截圖 enter image description here

正如你可以看到第2和第3行之間,它的時間間隔爲5秒(儘管說實話我不知道第2行和第3行的含義)

在客戶端(調用者)配置中,綁定就像這樣(主要由Visual Studio生成

<wsHttpBinding> 
     <binding name="WSHttpBinding_IAgent" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" 
      textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
      maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" 
      enabled="false" /> 
      <security mode="None"> 
      </security> 
     </binding> 
     </wsHttpBinding> 

,並在服務器

<wsHttpBinding> 
    <binding name="WSHttpBinding_IAgent" closeTimeout="00:01:00" 
     openTimeout="00:01:00" receiveTimeout="00:05:00" sendTimeout="00:05:00" 
     bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
     maxBufferPoolSize="16777216" maxReceivedMessageSize="16777216" 
     messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
     allowCookies="false"> 
     <readerQuotas maxDepth="32" maxStringContentLength="16777216" 
     maxArrayLength="16384" maxBytesPerRead="16384" maxNameTableCharCount="16384" /> 
     <reliableSession ordered="true" inactivityTimeout="00:10:00" 
     enabled="false" /> 
     <security mode="None"/> 
    </binding> 

,我把它叫做是這樣的

var client = new AgentClient(binding, BuildEndpointAddress(hostName, port)); 
for(int i =0; i<10; i++) 
    client.IsAlive(); //this call is very slow despite just returning true; 
    // subsequent calls are also slow so probably not because of wake-up time 

請注意這個測試的方式,服務器和客戶端都在同一臺計算機上,因此不能網絡問題。任何想法是什麼導致了緩慢或如何找到更多的信息來解決這個問題?

+1

後續調用速度更快嗎?可以在第一次通話時編譯或「醒來」。 – McGarnagle

+0

沒有我嘗試循環調用client.IsAlive()幾次,隨後的調用顯示沒有區別於第一個。 –

+0

@dbaseman準確地說,持續時間確實有所不同,但它似乎是因爲隨機性而不是系統性的。例如,在我的第一次測試中,連續呼叫的持續時間(同樣的方法)是4秒,4,6,2,4,3,8,並且當我重試時,它是: 9,3,2,4,5, 5,3 –

回答

0

要找到更多信息,您可能希望利用BCL團隊的codeplex站點中的Perfmonitor工具利用Windows事件跟蹤(ETW)。此工具的許多功能之一是它可以每毫秒採樣指令指針,併爲每個採樣提供託管調用堆棧。這可能會告訴您在這段時間內代碼的功能。

ps。下面是使用此工具的文章的另一個鏈接: http://naveensrinivasan.com/category/net/etw-net/

1

應用程序生命週期未在您的文章中指定,我將假設您啓動客戶端應用程序並在第一時間調用WCF服務而不進行預熱。

時間在這種情況下會有意義。

儘管使用了輕量級的綁定和消息,但.NET還是做了很多隱藏的工作來初始化ChannelFactory和Server。

這是WCF的本質,不應該引起太多問題,因爲在通信預熱後真的很快。

嘗試在一次應用會話中連續調用您的服務兩次,以測量兩次通話的時間。 如果兩個電話都需要相當的時間,我的假設是錯誤的。

如果你想看到我的問題,比較環境 -

Why is the first WCF client call slow?

0

嘗試配置WCF跟蹤記錄 - 細節在這裏:http://msdn.microsoft.com/en-us/library/ms733025.aspx

我有各種各樣的頭髮拉-WCF的問題,但同一個盒子上的那種性能問題不是我以前見過的。正如其他人所說,最可能的原因是服務器的「熱身」,但如果你多次打電話,那麼這應該不是問題。您是否嘗試過從您的客戶端應用程序多次調用代碼?