Ошибки IIS 7.0 503 с универсальным обработчиком (.ashx), реализующим IHttpAsyncHandler

StackOverflow https://stackoverflow.com/questions/612242

Вопрос

Я сталкиваюсь с некоторыми проблемами производительности при использовании универсального обработчика, который реализует IHttpAsyncHandler.В самом простом случае обработчик получает запрос GET и через 20 секунд завершает ответ после записи '< тайм-аут / >' для ответа.

При загрузке .ashx 10000-20000 одновременных запросов происходит сбой, и 503 сервера недоступны ровно после 5000 запросов.При переключении в синхронный режим и немедленном завершении запроса проблема исчезает.

Я повозился с рядом настроек, но единственное, чего мне удалось добиться, - это снизить порог запроса, при котором возникает эта ошибка.

Вот краткое описание настроек, с которыми я играл:

machine.конфигурация:

<configuration>
    ...
    <system.web>
        ...
        <processModel enable="true" requestQueueLimit="10000"/>
        ...

web.config:

<configuration>
    ...
    <system.web>
        ...
        <httpRuntime enable="true" appRequestQueueLimit="10000"/>
        ...

Диспетчер IIS > applicationPools > Дополнительные настройки

Queue Length : 65535

Хотя я не могу быть уверен, кажется, что эти настройки работают хорошо, если запросы синхронны, но при асинхронности я, похоже, не могу выйти за пределы ровно 5000 запросов, прежде чем сервер начнет говорить мне уйти.Если я установлю значения ниже (не могу точно вспомнить, какие настройки это были бы из приведенных выше, но я перепробовал их все), то количество 503 соответственно возрастет, но я никогда не смогу остановить это выше 5000 при серьезной нагрузке.

Кажется, что существует множество настроек, разбросанных во множестве мест, которые могут повлиять на это, но 5000 кажется высеченным на камне.Я вижу здесь этот appRequestQueueLimit не может превышать 5000, но я не могу найти дополнительной информации об этом и задаюсь вопросом, не является ли это дезинформацией.

Существует ли в IIS какой-либо параметр "flood-control", который может ограничивать один хост не более чем 5000 запросами?Как я могу заставить IIS обрабатывать более 5000 одновременных асинхронных запросов?

Редактировать 2:Существуют ли какие-либо счетчики или другие индикаторы того, какой лимит может быть превышен, и как мне провести дальнейшее расследование?

Редактировать:Вот код 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.конфигурация:

<configuration>
    ...
    <system.web>
        ...
        <processModel enable="true" requestQueueLimit="100000"/>

Диспетчер IIS > applicationPools > Дополнительные настройки

Queue Length : 65535

и, наконец (недостающий фрагмент головоломки), командная строка:

appcmd.exe set config /section:serverRuntime /appConcurrentRequestLimit:100000

Параметр web.config, упомянутый в основном сообщении, не имел значения.

10000 одновременных подключений, никаких проблем.Спасибо за помощь!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top