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