「操作がタイムアウトしました」HttpExceptionを診断する方法
-
19-09-2019 - |
質問
私は私のIIS 6サーバー上の特定のウェブページのための要求ごとにXMLベースのデータを取得するために、5台の外部のサーバーを呼び出しています。現在のボリュームは、毎秒15-20発信要求を意味し、毎秒3-5着信要求の間です。
外部サーバ(サーバ)への私のサーバー(クライアント)からの発信要求の99%がOK働くが、約100〜200日あたりのは、「操作がタイムアウトしました」例外で終わるます。
ソケット、ポートなどまたはスレッドのロックのいくつかの不足が、この理論に問題が障害が完全にランダムであるということです - - 行の要求の数があることがないこれは私が私のサーバー上のリソースの問題を抱えている示唆しますすべての失敗 - と外部サーバの2は、障害の大部分を占める。
。私の質問は、私はさらに問題が私の最後(クライアント)上にあるかどうかを判断するために、これらの例外を診断したりする方法であるもう一方の端に(サーバ)?
要求の量は、ワイヤ上アナライザを置くことを妨げる - これらのいくつかの例外を捕捉することは非常に困難であろう。私は自分のmachine.config内の接続とスレッドをリセットしているし、基本的なコードは次のようになります:
Dim hRequest As HttpWebRequest
Dim responseTime As String
Dim objWatch As New Stopwatch
Try
' calculate time it takes to process transaction
objWatch.Start()
hRequest = System.Net.WebRequest.Create(url)
' set some defaults
hRequest.Timeout = 5000
hRequest.ReadWriteTimeout = 10000
hRequest.KeepAlive = False ' to prevent open HTTP connection leak
hRequest.SendChunked = False
hRequest.AllowAutoRedirect = True
hRequest.MaximumAutomaticRedirections = 3
hRequest.Accept = "text/xml"
hRequest.Proxy = Nothing 'do not waste time searching for a proxy
hRequest.ServicePoint.Expect100Continue = False
Dim feed As New XDocument()
' use *Using* to auto close connections
Using hResponse As HttpWebResponse = DirectCast(hRequest.GetResponse(), HttpWebResponse)
Using reader As XmlReader = XmlReader.Create(hResponse.GetResponseStream())
feed = XDocument.Load(reader)
reader.Close()
End Using
hResponse.Close()
End Using
objWatch.Stop()
' Work here with returned contents in "feed" document
Return XXX' some results here
Catch ex As Exception
objWatch.Stop()
hRequest.Abort()
Return Nothing
End Try
任意の提案ですか?
解決
あなたはASPページへの各着信要求に対して5発信要求を行っていると述べました。その5台の異なるサーバー、または同じサーバーですか?
あなたは、次のいずれかを発行する前に、完了するの以前の要求を待つのですか?それは、接続を待っている、またはリクエスト/レスポンス中にいる間にタイムアウトが起こっているのでしょうか?
タイムアウトが要求/応答の間に何が起こっている場合は、それは、ターゲットサーバーに負荷がかかっていることを意味しています。これが事実であるかどうかを確認する唯一の方法は、マシンのいずれかでのwireshark / netmonのを実行して、アプリからの要求でも、サーバーにそれを通じ作り、それならばされるかどうかを確認するために、ネットワークトレースを見ていますターゲット・サーバは、所与のタイムアウト時間内に応答しているかどうか、である。
これは、スレッドの飢餓問題になる場合は、、それを診断する方法の一つは、あなたがタイムアウトを取得を開始する場合、w3wp.exeのプロセスにWINDBG.EXEデバッガをアタッチすることです。そして、sos.dllデバッグ拡張をロードします。そして!のスレッドプールコマンドに続く!スレッドのコマンドを実行します。多くのワーカースレッドと完了ポートスレッドが使用されている方法は、残りの/あなたが表示されます。 #completionportスレッドまたはワーカースレッドが低い場合、そのタイムアウトに貢献していきます。
また、あなたは、ASP.NETとSystem.net perfのカウンタを監視することができます。 ASP.NET要求キューが単調に増加しているかどうかを確認してください - これはあなたの発信要求が十分に速く完了していないことを示している可能性があります。
。申し訳ありませんが、ここでは簡単な答えはありません。あなたが探検する必要がある道がたくさんあります。私があなただったら、私はあなたがタイムアウトを取得を開始し、私が先に説明した何をするときW3WPするWINDBG.EXEを取り付けることから始めます。
他のヒント
デフォルトでは、HttpWebRequestのは、HTTPあたり2つの接続/ 1.1サーバーにあなたを制限します。あなたのリクエストが完了するまでに時間がかかるし、サーバー上にキューイング着信要求を持っているのであれば、あなたは接続を使い果たすため、タイムアウトを取得します。
あなたはServicePointManager上の最大の発信接続を変更する必要があります。
ServicePointManager.DefaultConnectionLimit = 20 // or some big value.