我有一个旧的 ASP.NET 应用程序。我们将 httpWebRequest 发送到远程 REST 服务器并取回 XML,大多数情况下应用程序运行良好。最近,我们每天都会遇到几次 CPU 使用率过高的问题。
在 CPU 使用率较高期间,我们监控了这些 httpWebRequest 连接(通过检查 w3wp 进程的 netstat)。一开始,连接从“ESTABLISHED”变为“CLOSE_WAIT”状态,然后这些连接超时后,这些连接一个接一个消失,然后再没有连接。
重置 IIS 后,当 w3wp.exe 进程再次启动时,我们仍然找不到与 httpWebRequest 目标服务器的任何连接。所以CPU使用率一直保持在高水平。即使经过几轮reset,也无法解决问题,直到我们看到一些连接开始连接到httpWebRequest目标服务器,CPU使用率下降了。
我实际上认为这可能是我的代码没有正确处理 httpWebRequest 的问题,我在这里发布了另一个问题:如何在捕获 httpwebrequest 超时后关闭底层连接?.
正如那个问题中提到的,我还发现了很多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();
}