2

古い ASP.NET アプリケーションがあります。httpWebRequest をリモート REST サーバーに送信し、XML を取得します。ほとんどの場合、アプリケーションは正常に動作します。最近、1 日に数回、CPU 使用率が高い問題が発生しました。

CPU 使用率が高い時間帯に、これらの httpWebRequest 接続を監視しました (w3wp プロセスの netstat をチェックすることによって)。最初に接続が「ESTABLISHED」から「CLOSE_WAIT」状態に変化し、接続がタイムアウトした後、それらの接続が 1 つずつ消え、その後接続がなくなります。

IIS をリセットした後、w3wp.exe プロセスが再び開始されたとき、まだ httpWebRequest ターゲット サーバーへの接続を見つけることができませんでした。そのため、CPU 使用率は常に高いレベルにとどまっています。数回のリセットの後でも、問題は解決しません。いくつかの接続が httpWebRequest ターゲット サーバーへの接続を開始するまで、CPU 使用率が低下しました。

コードが 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();
}
4

3 に答える 3

2

メインスレッドのブロックを回避するために、非同期でリクエストを送信してみることをお勧めします。

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"));
}
于 2009-09-05T07:29:40.500 に答える
2

問題の原因となっているコードを特定する必要があるため、CPU使用率が高い理由を見つけるには時間がかかる場合があります。私は現在、最近開発したvb.netアプリでこれに取り組んでいます。その間に、管理ユーザーがクリックしてW3WP.exeプロセスを停止できるボタンを備えたページを開発しました。これは、問題のあるコードを特定して更新できるようになるまでの優れたストップギャップ対策です。これが私が使用したコードです。対応するページで次のコードを呼び出すボタンを使用して.aspxページを作成するだけ.aspx.vbです。コードはコマンドプロンプトを使用してタスクリストを取得し、これをファイルに書き込みます。W3WP.exe次に、ワーカープロセスのPIDのテキストファイルを解析します。次に、プログラムでコマンドプロンプトに再度アクセスW3WP.exeし、PIDを使用してプロセスを終了します。

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
于 2011-03-18T04:13:17.047 に答える
2

あなたの説明から、あなたの高い CPU 使用率が発信 HTTP リクエストに関連していることは明らかではありません。CPU 使用率が高いのは、コードのバグ、CLR、IIS、またはその他のバグが原因である可能性があります。どのコンポーネントが CPU を消費しているかを知らなければ、それ以上何もできません。

私があなたなら、まずサンプリング プロファイラーを W3WP プロセスに接続して、どのコンポーネントが CPU を消費しているかを確認します。これにより、この問題を解決するための次のステップに進むことができます。

于 2009-09-11T17:48:48.127 に答える