Подтвердить что ты не робот

Написание службы WCF Long-Polling

Я писал длинный опрос в WCF. Я нахожусь в точке нагрузочного тестирования, и у меня возникает проблема, которая, когда я получаю 5000 выдающихся запросов, начинаю получать:

The HTTP service located at (my service) is too busy.

Я реализовал это как службу WCF AsyncPattern, и количество потребляемых потоков рабочего /IO остается очень низким (как и должно быть). Количество ручек хорошо выглядит и т.д. Я думаю, что нахожусь в одном из пределов анти-DOS и просто не могу его найти. Вот некоторые из вещей, которые я сделал:

Я изменил реестр, так что MaxConcurrentRequestsPerCPU не является проблемой. Действительно, количество запросов в очереди ASP.NET остается 0.

Я настроил настройку сервиса в веб-конфигурации, так что это не должно быть проблемой. Трассировки WCF не показывают никаких исключений из-за этого.

Я использую настраиваемую привязку, которая не содержит никакой безопасности и т.д. Все, что у нее есть, это кодировка и транспорт (httpTransport).

Я изменил файл machine.config для запроса requestQueueLimit: здесь элемент processModel из этого:

<processModel enable="true" 
  timeout="Infinite" 
  idleTimeout="Infinite" 
  shutdownTimeout="0:00:05" 
  requestLimit="Infinite" 
  requestQueueLimit="15000" 
  restartQueueLimit="10" 
  memoryLimit="60" 
  webGarden="false" 
  cpuMask="0xffffffff" 
  userName="machine" 
  password="AutoGenerate" 
  logLevel="Errors" 
  clientConnectedCheck="0:00:05" 
  comAuthenticationLevel="Connect" 
  comImpersonationLevel="Impersonate" 
  responseRestartDeadlockInterval="00:09:00" 
  responseDeadlockInterval="00:03:00" 
  maxWorkerThreads="250" 
  maxIoThreads="250" />

Но все же я заканчиваю этим лимитом (рассматриваемая машина может справиться с этим, а остальная система возвращается обратно в систему очередей сообщений).

Кто-нибудь может подумать о чем-нибудь еще?

Я - IIS 7.5 на WindowsServer 2008R2. Asp.NET 3.5SP1.

<ч/" > Дополнительная информация: Когда я получаю указанную выше ошибку, вступает в игру счетчик производительности ASP.Net v2.0.50727 "Отказанные запросы". Документы показывают, что это происходит, когда очередь запросов заполнена. Счетчик первичной очереди запросов равен 0 и никогда не сдвигается с места.

Если я вернусь к максимальным рабочим процессам, я могу превысить параллельные запросы 5K.

4b9b3361

Ответ 1

От: http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx

Для v2.0 и v3.5 установите значение реестра DWORD @HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0\MaxConcurrentRequestsPerCPU = 5000. Перезапустить IIS

В версии v.5.5 вы также можете установить <system.web><applicationPool maxConcurrentRequestsPerCPU="5000"/></system.web> в файле aspnet.config. Если значение установлено в обоих местах, параметр aspnet.config переопределяет параметр реестра.

Для v4.0 значение по умолчанию maxConcurrentRequestsPerCPU равно 5000, поэтому вам не нужно ничего делать.

Увеличьте предел очереди HTTP.sys, который имеет значение по умолчанию 1000. Если операционная система x64 и у вас есть 2 ГБ ОЗУ или более, установка ее на 5000 должна быть прекрасной. Если он слишком низок, вы можете видеть запросы HTTP.sys с условием 503. Откройте диспетчер IIS и дополнительные настройки для вашего пула приложений, а затем измените значение "Queue Length". Если ваше приложение ASP.NET использует веб-службы (WFC или ASMX) или System.Net для связи с бэкэнд через HTTP, вам может потребоваться увеличить connectionManagement/maxconnection. Для приложений ASP.NET это ограничение ограничено 12 * #CPUs функцией autoConfig. Это означает, что на quad-proc вы можете иметь не более 12 * 4 = 48 одновременных подключений к конечной точке IP. Поскольку это связано с autoConfig, самый простой способ увеличить максимальное соединение в приложении ASP.NET - это установить System.Net.ServicePointManager.DefaultConnectionLimit программно, например, с Application_Start. Установите значение для количества одновременных подключений System.Net, которые вы ожидаете от использования вашего приложения. Я установил это на Int32.MaxValue и не имел побочных эффектов, поэтому вы можете попробовать это - это фактически значение по умолчанию, используемое в собственном стеке HTTP, WinHTTP. Если вы не можете установить программный код System.Net.ServicePointManager.DefaultConnectionLimit, вам необходимо отключить autoConfig, но это также означает, что вам нужно установить maxWorkerThreads и maxIoThreads. Вам не нужно устанавливать minFreeThreads или minLocalRequestFreeThreads, если вы не используете классический/ISAPI-режим.

Ответ 2

Является ли IIS ограничением числа открытых соединений? Я думаю, что на веб-сайте или веб-приложении в IIS есть настройка, которая может это сделать.

Ответ 3

Я нахожу все разные параметры конфигурации очень запутанными, но это сообщение в блоге очень полезно:

http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx

Он упоминает предел 5000 в различных обличьях довольно много. Кажется, что сложная вещь заключается в том, что различные настройки применяются в зависимости от точной настройки (например,.net 2, 3.5, 4.0, IIS 6, 7 и т.д.)

Надеюсь, что это поможет.