"작업 시간이 초과 된"진단 방법 httpexception
-
19-09-2019 - |
문제
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.