Написание службы длинных опросов WCF - PullRequest
25 голосов
/ 23 декабря 2010

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

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

Я реализовал это как службу WCF AsyncPatternи количество потребляемых потоков рабочих / ввода-вывода остается очень низким (как и должно быть).Количество дескрипторов выглядит хорошо и т. Д. Я думаю, что столкнулся с одним из ограничений анти-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 одновременных запросов.

Ответы [ 4 ]

3 голосов
/ 31 октября 2011

От: 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

Для версии 3.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 и дополнительные параметры для пула приложений, затем измените значение «Длина очереди». Если ваше приложение ASP.NET использует веб-службы (WFC или ASMX) или System.Net для связи с бэкендом по HTTP, вам может потребоваться увеличить connectionManagement/maxconnection. Для приложений ASP.NET это ограничено 12 * #CPU функцией autoConfig. Это означает, что в Quad-Proc вы можете иметь не более 12 * 4 = 48 одновременных подключений к конечной точке IP. Поскольку это связано с autoConfig, самый простой способ увеличить maxconnection в приложении ASP.NET - это установить System.Net.ServicePointManager.DefaultConnectionLimit программно, например, Application_Start. Задайте в качестве значения число одновременных соединений System.Net, которое вы ожидаете использовать в приложении. Я установил это на Int32.MaxValue и не имел никаких побочных эффектов, так что вы можете попробовать это - это фактически значение по умолчанию, используемое в собственном стеке HTTP, WinHTTP. Если вы не можете установить System.Net.ServicePointManager.DefaultConnectionLimit программным способом, вам нужно отключить autoConfig, но это означает, что вам также нужно установить maxWorkerThreads и maxIoThreads. Вам не нужно устанавливать minFreeThreads или minLocalRequestFreeThreads, если вы не используете классический режим / ISAPI.

1 голос
/ 07 сентября 2011

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

1 голос
/ 16 октября 2011

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

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 и т. Д.)

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

0 голосов
/ 30 июня 2011

Я уже сталкивался с лимитом 5000, но, к сожалению, не могу вспомнить, где.

Это какая-то помощь? http://msdn.microsoft.com/en-us/library/ee377061%28BTS.10%29.aspx

или

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/41aa5f44-ead6-47ba-8bd7-c918c9f0aee0/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...