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

Я сталкиваюсь с некоторыми проблемами производительности, используя универсальный обработчик, который реализует 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> Пулы приложений> Расширенные настройки

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 Ответ

6 голосов
/ 05 марта 2009

OK. Исправлено ... большое спасибо этой публикации за прояснение некоторых деталей.

Для устранения ошибок 503 требуется 3 различных изменения конфигурации:

machine.config:

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

Диспетчер IIS> Пулы приложений> Расширенные настройки

Queue Length : 65535

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

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

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

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

...