我有一箇舊的ASP.NET應用程序。我們發送httpWebRequest到遠程REST服務器並返回XML,大多數情況下應用程序工作正常。最近,我們每天幾次遇到一些高CPU使用率問題。ASP.NET HttpWebRequest停止發送請求,CPU使用率高
在高CPU使用時間期間,我們監視了那些httpWebRequest連接(通過檢查w3wp進程的netstat)。一開始,連接從「ESTABLISHED」變爲「CLOSE_WAIT」狀態,然後在這些連接超時後,這些連接逐一消失,然後再沒有連接。
重新設置IIS之後,當w3wp.exe進程再次啓動時,我們仍然找不到到httpWebRequest目標服務器的任何連接。所以CPU使用率保持在高水平。即使經過多輪重置,它也不會解決問題,直到我們看到一些連接開始連接到httpWebRequest目標服務器時,CPU使用率下降。
我其實認爲這可能是我的代碼沒有正確處理httpWebRequest的問題,我在此處發佈了另一個問題:How to close underlying connections after catch httpwebrequest timeout?。
正如在這個問題中提到的,我還發現System.Net.HttpWebRequest.GetResponse()
有很多超時異常。當CPU使用率很高時,我們在5分鐘內發現了3500次相同的異常情況。
什麼可能導致這種類型的問題,什麼可能是藥?爲什麼應用程序不再發送請求(因爲netstat中沒有連接)?
這裏是源代碼,以防萬一:
System.Net.HttpWebResponse httpWebResponse = null;
System.IO.Stream stream = null;
XmlTextReader xmlTextReader = null;
try
{
System.Net.HttpWebRequest httpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(request);
httpWebRequest.ReadWriteTimeout = 10000;
httpWebRequest.Timeout = 10000;
httpWebRequest.KeepAlive = false;
httpWebRequest.Method = "GET";
httpWebResponse = (System.Net.HttpWebResponse)httpWebRequest.GetResponse();
stream = httpWebResponse.GetResponseStream();
xmlTextReader = new XmlTextReader(stream);
xmlTextReader.Read();
xmlDocument.Load(xmlTextReader);
//Document processing code.
//...
}
catch
{
//Catch blcok with error handle
}
finally
{
if (xmlTextReader != null)
xmlTextReader.Close();
if (httpWebResponse != null)
httpWebResponse.Close();
if (stream != null)
stream.Close();
}
@feroze,非常感謝您的幫助,我沒有任何關於採樣分析器的經驗,請給我一些更多的細節或者我可以學習的一些鏈接。再次感謝。 – machinegone 2009-09-12 21:01:27
您可以從這裏下載CLR分析器:http://www.microsoft.com/downloads/details.aspx?FamilyID=a362781c-3870-43be-8926-862b40aa0cd0&displaylang=en 下面是一些鏈接,顯示如何使用探查: http://msdn.microsoft.com/en-us/library/ms979205.aspx http://msdn.microsoft.com/en-us/magazine/cc300553.aspx 我只是在尋找再次在你的代碼中,引起了我的注意。由於您將XMLTextReader()附加到流中,因此如果文檔非常複雜,解析XML文檔可能會佔用CPU。 – feroze 2009-09-13 20:19:29
@feroze,再次感謝,我會閱讀指南,並在我的服務器上運行它。稍後我會給你更新。謝謝。 – machinegone 2009-09-14 22:13:50