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

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

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

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

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

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

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

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

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

Edit2: Есть ли какие-либо счетчики или другие индикаторы, чей лимит может быть превышен, и как я буду расследовать дальше?

Изменить: вот код генератора нагрузки:

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));
            }

        }
    }
}

1 ответ

Решение

ХОРОШО. Исправлено... большое спасибо этому посту за прояснение некоторых деталей.

Для устранения ошибок 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, упомянутый в основном посте, не имеет значения.

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

Другие вопросы по тегам