我有一个旧的 ASP.NET 应用程序。我们将 httpWebRequest 发送到远程 REST 服务器并检索 XML,大多数时候应用程序运行良好。最近,我们每天都会遇到几次 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();
}
最佳答案
根据您的描述,我不清楚您的高 CPU 利用率是否与您的传出 HTTP 请求有关。 CPU 利用率高可能是由于代码中的错误、CLR、IIS 中的错误或其他原因造成的。如果不知道哪个组件正在消耗 CPU,您将无法执行任何进一步操作。
如果我是您,我会首先尝试将采样分析器附加到 W3WP 进程,并查看哪个组件正在消耗 CPU。这应该会告诉您解决此问题的后续步骤。
关于ASP.NET HttpWebRequest 停止发送请求,CPU 使用率高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1381890/