IIS 7.0 503 Generic Handler (.ASHX)가있는 오류 IHTTPASYNCHANDLER 구현
-
03-07-2019 - |
문제
ihttpasynchandler를 구현하는 일반적인 핸들러를 사용하여 몇 가지 성능 문제가 발생합니다. 가장 간단하게 핸들러는 GET 요청을 받고 20 초 후에 응답에 '<timeout />'을 작성한 후 응답을 종료합니다.
10000-20000의 동시 요청으로 .ASHX를 망치면 5000 개의 요청 후 503 서버를 사용할 수없는 경우 실패합니다. 동기 모드로 전환하고 요청을 즉시 종료하면 문제가 사라집니다.
여러 설정을 땜질했지만 제가 아프게 한 유일한 것은이 오류가 발생하는 요청 임계 값을 낮추는 것입니다.
다음은 내가 장난감을 사용한 설정의 요점입니다.
machine.config :
<configuration>
...
<system.web>
...
<processModel enable="true" requestQueueLimit="10000"/>
...
web.config :
<configuration>
...
<system.web>
...
<httpRuntime enable="true" appRequestQueueLimit="10000"/>
...
IIS 관리자> ApplicationPools> 고급 설정
Queue Length : 65535
확실하지는 않지만 요청이 동기화되면 이러한 설정이 좋고 잘 작동하는 것처럼 보이지만 Async는 서버가 사라지라고 지시하기 전에 정확히 5000 개의 요청을 넘어서는 것 같습니다. 내가 더 낮게 설정하면 (위의 어떤 설정이 무엇인지 정확히 기억할 수 없지만 모두 시도해 보았습니다), 503 카운트는 그에 따라 올라가지 만 심각한 부하를받을 때 5000 이상으로 일어나지 않을 수 있습니다. .
이에 영향을 줄 수있는 무수한 장소에 흩어져있는 수많은 설정이있는 것 같습니다. 그러나 5000은 상당히 돌로 설정된 것 같습니다. 내가 참조 여기 그 AppRequestqueuelimit은 5000을 초과 할 수는 없지만 이에 대한 추가 정보를 찾을 수 없으며 이것이 잘못된 정보인지 궁금합니다.
IIS에는 단일 호스트를 5000 개 이하의 요청으로 제한 할 수있는 "홍수 제어"설정이 있습니까? IIS가 5000 이상의 동시 비동기 요청을 처리하도록하려면 어떻게해야합니까?
edit2 : 한계가 초과 될 수있는 카운터 나 기타 지표가 있습니까? 더 조사하는 방법은 무엇입니까?
편집 : LoadGenerator 코드는 다음과 같습니다.
using System;
using System.Net;
using System.Threading;
namespace HammerTime
{
class Program
{
private static int counter = 0;
static void Main(string[] args)
{
var limit = 5000;
ServicePointManager.DefaultConnectionLimit=limit;
for (int i = 0; i < limit;++i )
{
StartWebRequest(i.ToString());
}
Console.ReadLine();
}
private static void StartWebRequest(string channelId)
{
string uri = "http://spender2008/test/Test.ashx?channel="+channelId;
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(uri);
request.BeginGetResponse(responseHandler, request);
}
private static void responseHandler(IAsyncResult ar)
{
try
{
HttpWebRequest state = (HttpWebRequest)ar.AsyncState;
HttpWebResponse response = (HttpWebResponse)state.EndGetResponse(ar);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
Console.WriteLine(Interlocked.Increment(ref counter));
}
}
}
}
해결책
확인. 고정 ... 많은 감사합니다 이것 몇 가지 세부 정보를 지우려면 게시하십시오.
503 오류를 제거하려면 3 가지 다른 구성 변경이 필요합니다.
machine.config :
<configuration>
...
<system.web>
...
<processModel enable="true" requestQueueLimit="100000"/>
IIS 관리자> ApplicationPools> 고급 설정
Queue Length : 65535
그리고 마지막으로 (퍼즐의 누락 된 조각), 명령 줄 :
appcmd.exe set config /section:serverRuntime /appConcurrentRequestLimit:100000
메인 포스트에 언급 된 web.config 설정은 관련이 없습니다.
100000 동시 연결, 문제 없음. 도와 줘서 고마워!