我有一个旧的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