3

5つの外部サーバーを呼び出して、IIS6サーバー上の特定のWebページに対する要求ごとにXMLベースのデータを取得しています。現在のボリュームは、1秒あたり3〜5の着信要求、つまり1秒あたり15〜20の発信要求です。

サーバー(クライアント)から外部サーバー(サーバー)への送信要求の99%は正常に機能しますが、1日あたり約100〜200で、「操作がタイムアウトしました」という例外が発生します。

これは、サーバーにリソースの問題があることを示しています-ソケット、ポートなどの不足、またはスレッドロックがありますが、この理論の問題は、失敗が完全にランダムであるということです-すべてが失敗する連続した要求の数はありません-また、2台の外部サーバーが障害の大部分を占めています。

私の質問は、これらの例外をさらに診断して、問題が自分の側(クライアント)にあるのか、もう一方の端(サーバー)にあるのかを判断するにはどうすればよいですか?

リクエストの量が多いため、アナライザーをネットワークに接続することはできません。これらのいくつかの例外をキャプチャすることは非常に困難です。machine.configのCONNECTIONSとTHREADSをリセットしましたが、基本的なコードは次のようになります。

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

助言がありますか?

4

2 に答える 2

2

デフォルトでは、HttpWebRequestはHTTP/1.1サーバーごとに2つの接続に制限されています。そのため、リクエストの完了に時間がかかり、受信リクエストがサーバーでキューに入れられている場合、接続が不足し、タイムアウトが発生します。

ServicePointManagerで最大発信接続を変更する必要があります。

ServicePointManager.DefaultConnectionLimit = 20 // or some big value.
于 2010-03-15T18:44:06.020 に答える
0

ASPページへの着信リクエストごとに5つの発信リクエストを実行しているとのことです。その5つの異なるサーバーですか、それとも同じサーバーですか?

次のリクエストを発行する前に、前のリクエストが完了するのを待ちますか?接続を待機している間、または要求/応答中にタイムアウトが発生していますか?

要求/応答中にタイムアウトが発生している場合は、ターゲットサーバーにストレスがかかっていることを意味します。これが当てはまるかどうかを確認する唯一の方法は、いずれかのマシンでwireshark / netmonを実行し、ネットワークトレースを調べて、アプリからのリクエストがサーバーに到達しているかどうかを確認することです。つまり、ターゲットサーバーが指定されたタイムアウト内に応答しているかどうかです。

これがスレッド不足の問題である場合、それを診断する方法の1つは、タイムアウトが発生し始めたときに、windbg.exeデバッガーをw3wp.exeプロセスにアタッチすることです。次に、sos.dllデバッグ拡張機能をロードします。そして、!threadsコマンドを実行し、続いて!threadpoolコマンドを実行します。使用されている/残っているワーカースレッドと完了ポートスレッドの数が表示されます。#completionportスレッドまたはワーカースレッドが低い場合、それがタイムアウトの原因になります。

または、ASP.NETおよびSystem.netのパフォーマンスカウンターを監視することもできます。ASP.NET要求キューが単調に増加しているかどうかを確認します。これは、送信要求が十分に速く完了していないことを示している可能性があります。

申し訳ありませんが、ここに簡単な答えはありません。これらはあなたが探求する必要があるたくさんの道​​です。私があなたの場合、タイムアウトが発生し始めたら、windbg.exeをw3wpにアタッチして、前に説明したことを実行することから始めます。

于 2010-03-30T16:53:13.287 に答える