我們有一個應用程序具有在IIS7上運行的WCF服務(* .svc)以及查詢該服務的各種客戶端。該服務器正在運行Win 2008 Server。客戶端運行Windows 2008 Server或Windows 2003服務器。我收到以下例外,我已經看到它可能實際上與大量潛在的WCF問題有關。WCF超時異常詳細調查
System.TimeoutException: The request channel timed out while waiting for a reply after 00:00:59.9320000. Increase the timeout value passed to the call to Request or increase the SendTimeout value on the Binding. The time allotted to this operation may have been a portion of a longer timeout. ---> System.TimeoutException: The HTTP request to 'http://www.domain.com/WebServices/myservice.svc/gzip' has exceeded the allotted timeout of 00:01:00. The time allotted to this operation may have been a portion of a longer timeout.
我把超時時間增加到30分鐘,錯誤仍然發生。這告訴我其他的事情正在發揮作用,因爲數據量從未上傳或下載需要30分鐘。
錯誤來了又去。目前,它更頻繁。如果我有3個客戶端同時運行或100個,似乎並不重要,但它仍會偶爾發生。大多數時候,沒有超時,但我仍然每小時得到幾個。錯誤來自任何被調用的方法。其中一種方法沒有參數並返回一點數據。另一個需要大量的數據作爲參數,但是異步執行。錯誤總是來自客戶端,並且從不在堆棧跟蹤中引用服務器上的任何代碼。它總是結束與:
at System.Net.HttpWebRequest.GetResponse()
at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
在服務器上: 我試過(和目前有)以下的綁定設置:
maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647"
它似乎並沒有產生影響。
我試過(和目前有)以下限制設置:
<serviceThrottling maxConcurrentCalls="1500" maxConcurrentInstances="1500" maxConcurrentSessions="1500"/>
它似乎並沒有產生影響。
我目前有WCF服務的以下設置。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)]
我跑ConcurrencyMode.Multiple
一段時間,錯誤仍然發生。
我試過重新啓動IIS,重新啓動我的底層SQL Server,重新啓動計算機。所有這些似乎都沒有影響。
我試過禁用Windows防火牆。它似乎沒有影響。
在客戶端,我有以下設置:
maxReceivedMessageSize="2147483647"
<system.net>
<connectionManagement>
<add address="*" maxconnection="16"/>
</connectionManagement>
</system.net>
我的客戶端關閉其連接:
var client = new MyClient();
try
{
return client.GetConfigurationOptions();
}
finally
{
client.Close();
}
我已經改變了註冊表設置,以允許更傳出連接:
MaxConnectionsPerServer=24, MaxConnectionsPer1_0Server=32.
我現在剛剛嘗試過SvcTraceViewer.exe。我設法在客戶端捕捉到一個例外。我看到它的持續時間是1分鐘。看看服務器端跟蹤,我可以看到服務器不知道這個異常。我能看到的最長持續時間是10秒。
我看過服務器上使用exec sp_who
的活動數據庫連接。我只有幾個(2-3)。我使用TCPview從一個客戶端查看了TCP連接。它通常是2-3左右,我已經看到了5或6.
簡單地說,我很難過。我嘗試了所有我能找到的東西,並且必須錯過WCF專家能夠看到的非常簡單的東西。我的直覺是,在服務器實際接收到消息之前和/或某些東西在服務器級別排隊消息並且從不讓他們處理消息之前,某些東西阻止了我的客戶端在低級別(TCP)。
如果你有任何性能計數器,我應該看看,請讓我知道。 (請指出哪些值是不好的,因爲其中一些計數器很難降解)。另外,如何記錄WCF消息大小?最後,有沒有什麼工具可以讓我測試我的客戶端和服務器之間可以建立多少個連接(獨立於我的應用程序)
感謝您的時間!
額外的信息添加6月20日:
我的WCF應用程序做類似如下的東西。
while (true)
{
Step1GetConfigurationSettingsFromServerViaWCF(); // can change between calls
Step2GetWorkUnitFromServerViaWCF();
DoWorkLocally(); // takes 5-15minutes.
Step3SendBackResultsToServerViaWCF();
}
使用Wireshark的,我沒有看到,發生錯誤時,我有一個5個TCP重發之後的TCP重置以後。我的猜測是RST來自WCF,會導致連接中斷。我得到的例外報告是從Step3超時。
我通過查看tcp流「tcp.stream eq 192」發現了這一點。然後我將過濾器擴展爲「tcp.stream eq 192和http和http.request.method eq POST」,並在此流中看到了6個POST。這看起來很奇怪,所以我檢查了另一個流,例如tcp.stream eq 100.我有三個POST,這看起來更正常一些,因爲我正在進行三個調用。但是,在每次WCF調用之後,我都會關閉連接,因此我希望每個流都有一個調用(但我對TCP的瞭解不多)。
調查了一會兒,我將http數據包加載到磁盤,看看這六個調用在哪裏。
1) Step3
2) Step1
3) Step2
4) Step3 - corrupted
5) Step1
6) Step2
我的猜測是兩個併發客戶端使用相同的連接,這就是爲什麼我看到重複。但是,我仍然有一些我無法理解的問題:
a)爲什麼數據包被破壞?隨機網絡僥倖 - 也許?使用此示例代碼對負載進行gzip壓縮:http://msdn.microsoft.com/en-us/library/ms751458.aspx - 同時使用時,代碼有時可能會出現一次錯誤?我應該測試沒有gzip庫。
b)爲什麼我會看到步驟1 &步驟2在損壞的操作超時後運行?在我看來,這些操作應該不會發生。也許我不是在看正確的流,因爲我對TCP的理解是有缺陷的。我有其他的流同時發生。我應該調查其他流 - 快速瀏覽流190-194顯示Step3 POST具有合適的有效負載數據(未損壞)。推動我再次查看gzip庫。
Jason - 您是否曾經解決過這個問題?它是DefaultConnectionLimit設置嗎? – SFun28 2011-01-26 15:15:34
@JasonKealey - 與許多其他問題不同,在發佈問題之前,不能指責你不要自己嘗試:)我喜歡你的問題非常詳細,並且包含所有重要細節。你描述的症狀看起來非常像我的,所以我希望解決方案是一樣的:) – 2013-04-11 09:26:00