문제

IIS 6 서버의 특정 웹 페이지에 대한 각 요청에 대해 XML 기반 데이터를 검색하기 위해 5 개의 외부 서버를 호출하고 있습니다. 현재 볼륨은 초당 3-5 개의 들어오는 요청이므로 초당 15-20 개의 나가는 요청이 있습니다.

내 서버 (클라이언트)에서 외부 서버 (서버)까지 나가는 요청의 99%가 작동하지만 하루에 약 100-200은 "작업 시간이 초과되었습니다"예외로 끝납니다.

이것은 내 서버에 리소스 문제가 있음을 시사합니다. 소켓, 포트 등 또는 스레드 잠금 장치가 부족하지만이 이론의 문제는 실패가 완전히 무작위라는 것입니다. 외부 서버 중 2 개는 대부분의 실패를 설명합니다.

내 질문은 문제가 내 마지막 (클라이언트) 또는 다른 쪽 (서버)에 있는지 확인하기 위해 이러한 예외를 어떻게 진단 할 수 있습니까?

요청의 양으로 인해 분석기를 와이어에 배치하는 것이 배제됩니다. 이러한 몇 가지 예외를 캡처하는 것은 매우 어려울 것입니다. 컴퓨터에 연결 및 스레드를 재설정했으며 기본 코드는 다음과 같습니다.

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을 실행하고 네트워크 추적을보고 앱의 요청이 서버를 통과하고 있는지 확인하는 것입니다. 주어진 시간 초과 내에 대상 서버가 응답하는지 여부입니다.

이것이 스레드 기아 문제 인 경우, 진단하는 방법 중 하나는 Timeout을 시작할 때 WINDBG.EXE 디버거를 W3WP.EXE 프로세스에 첨부하는 것입니다. 그런 다음 sos.dll 디버깅 확장을로드하십시오. 그리고! 스레드 명령을 실행하고! ThreadPool 명령을 실행하십시오. 작업자 스레드와 완료 포트 스레드가 사용/나머지 수를 보여줍니다. #CompleTionport 스레드 또는 작업자 스레드가 낮 으면 시간 초과에 기여합니다.

또는 Asp.net 및 System.net Perf 카운터를 모니터링 할 수 있습니다. ASP.NET 요청 큐가 단조로 증가하는지 확인하십시오. 이는 나가는 요청이 충분히 빨리 완료되지 않았 음을 나타낼 수 있습니다.

죄송합니다. 여기에는 쉬운 답변이 없습니다. 탐험해야 할 수있는 수단이 많이 있습니다. 내가 당신이라면, 나는 당신이 타임 아웃을 시작하고 앞에서 설명한 일을 할 때 Windbg.exe를 W3WP에 첨부하여 시작합니다.

다른 팁

기본적으로 HTTPWebRequest는 HTTP/1.1 서버 당 2 개의 연결로 제한합니다. 따라서 요청이 완료하는 데 시간이 걸리고 서버에서 대기하는 요청이 있으면 연결이 부족하여 시간 초과를 얻게됩니다.

ServicePointManager에서 최대 발신 연결을 변경해야합니다.

ServicePointManager.DefaultConnectionLimit = 20 // or some big value.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top