ASP.NET HttpWebRequest停止发送请求,CPU使用率高
我有一个旧的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();
}
从你的描述,它不我清楚你的高CPU使用率与你的传出HTTP请求有关。 CPU利用率高可能是由于您的代码存在错误,CLR,IIS或其他错误。在不知道哪个组件正在消耗CPU的情况下,您无法进一步做任何事情。
如果我是你,我会首先尝试将采样分析器附加到W3WP进程,并查看哪个组件正在使用CPU。这应该指出解决此问题的下一步。
我建议你尝试异步发送请求,以避免阻塞主线程:
using (var client = new WebClient())
{
client.OpenReadCompleted += (sender, e) =>
{
using (var reader = XmlReader.Create(e.Result))
{
// Process the XML document here
}
};
client.OpenReadAsync(new Uri("http://www.example.com"));
}
Darin,谢谢,我会试试这种方式,看看它是否可以帮助我解决问题。 – machinegone 2009-09-05 07:39:18
找到导致问题的代码的CPU占用率高的原因可能需要一些时间,因为您必须找到代码。我现在正在通过我最近开发的vb.net应用程序开展工作。同时,我开发了一个页面,其中包含一个管理用户可以单击以停止W3WP.exe
进程的按钮。这是一个很好的停止差距措施,直到问题代码可以被识别和更新。这是我使用的代码。只需使用一个按钮在相应的.aspx.vb
页面上调用以下代码即可创建.aspx页面。代码使用命令提示符获取任务列表并将其写入文件。然后我解析文本文件以获取W3WP.exe
工作进程的PID。然后,我再次以编程方式访问命令提示符,以使用PID终止W3WP.exe
进程。
Imports System.Web
Partial Class TAP
Inherits System.Web.UI.Page
Protected Sub btnStop_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnStop.Click
Call thStop_IIS()
End Sub
Function thStop_IIS()
Dim varRetval As String
Dim varPID As String
dim x as long
Dim savePath As String = Request.PhysicalApplicationPath + "exports\"
If Dir(savePath + "filename.txt") = "filename.txt" Then
Kill(savePath + "filename.txt")
End If
varRetval = Shell("cmd /c tasklist > " + savePath + "filename.txt")
For x = 1 To 90000000
Next x
varPID = thParse_File_Return_PID(savePath + "filename.txt")
varRetval = Shell("cmd /c taskkill /pid " & varPID & " /F")
Return True
End Function
Function thParse_File_Return_PID(ByVal varFileToParse As String) As Integer
On Error GoTo handler_err
'Dim FILE_NAME As String = "C:\Users\Owner\Documents\test.txt"
Dim FILE_NAME As String = varFileToParse
Dim TextLine As String
Dim varPID As Integer
Dim x As Long
If System.IO.File.Exists(FILE_NAME) = True Then
Dim objReader As New System.IO.StreamReader(FILE_NAME)
Do While objReader.Peek() <> -1
'TextLine = TextLine & objReader.ReadLine() & vbNewLine
TextLine = objReader.ReadLine() & vbNewLine
If InStr(TextLine, "w3wp.exe") Then
varPID = Mid(TextLine, 31, 4)
End If
Loop
thParse_File_Return_PID = varPID
Else
thParse_File_Return_PID = 0
End If
handler_exit:
Exit Function
handler_err:
'MsgBox(Err.Number & " " & Err.Description & ":" & "thParse_File_Return_Pages")
Resume
End Function
End Class
@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