문제

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 동시 연결, 문제 없음. 도와 줘서 고마워!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top