Проблема производительности IIS при попытке реализовать XMPP-подобный протокол - PullRequest
3 голосов
/ 23 сентября 2008

у нас есть клиент, которому нужно получать интерактивные сообщения от сервера, от клиентов, которые распространяются по всему миру за всеми видами межсетевых экранов с закрытыми всеми видами портов. Единственное, на что мы можем положиться - это HTTP-порт 80 (и HTTPS 443).

Дизайн в основном смоделирован по XMPP (протокол Jabber) с использованием нашего клиента и IIS. Клиент отправляет запросы GET обработчику .NET; обработчик держит запрос открытым некоторое время для поиска сообщений. Если поступают какие-либо сообщения, они немедленно отправляются клиенту; если нет, то по истечении времени ожидания соединение закрывается с ответом «нет данных». Клиент немедленно возобновляет связь.

Ну, теоретически.

Сначала происходит то, что на самом деле происходит, IIS не может обрабатывать более 100 одновременных запросов - все остальные помещаются в очередь, и между «подключенным» и IIS может возникнуть задержка в несколько минут, когда клиент узнает, что клиент звонил. Во-вторых, о половина времени ожидания клиента без ответа от сервера (время ожидания клиента на пять минут больше, чем на сервере).

POST всегда работает. Другие данные, обслуживаемые на том же веб-сервере, работают. Веб-сервисы на одном сервере работают. Это стандартная установка на Windows 2K3 Server.

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

Спасибо.

Ответы [ 4 ]

3 голосов
/ 26 сентября 2008

Я думаю, что вы превышаете ограничения пула потоков ASP.NET, а не IIS. Посмотрите на создание асинхронного обработчика HTTP (IHttpAsyncHandler), поскольку, когда они блокируют / ждут, они не связывают пул потоков (вместо этого они используют порты завершения).

Обновление : Недавно я столкнулся с этим, который, кажется, совпадает с моим мнением: CodeProject: Масштабируемый COMET в сочетании с ASP.NET

1 голос
/ 29 августа 2010

Из коробки Windows нужно немного подправить. Я должен был реализовать комет-сервер в asp.net и столкнулся с некоторыми глупыми настройками по умолчанию. Прочитав эти ссылки:

Я предложил следующие изменения, которые были внесены в наш сервер Windows 2k8.

  • reg add HKLM \ System \ CurrentControlSet \ Services \ HTTP \ Parameters / v MaxConnections / t REG_DWORD / d 1000000 / f
  • reg add HKLM \ System \ CurrentControlSet \ Services \ TcpIp \ Parameters / v TcpTimedWaitDelay / t REG_DWORD / d 30 / f
  • reg add HKLM \ SOFTWARE \ Microsoft \ ASP.NET \ 2.0.50727.0 / v MaxConcurrentThreadsPerCPU / t REG_DWORD / d 0 / f
  • reg add HKLM \ SOFTWARE \ Microsoft \ ASP.NET \ 2.0.50727.0 / v MaxConcurrentRequestsPerCPU / t REG_DWORD / d 30000 / f
  • appcmd.exe set apppool "[имя пула приложений]" / queueLength: 65535
  • appcmd.exe set config / section: serverRuntime / appConcurrentRequestLimit: 100000
  • reg add HKLM \ System \ CurrentControlSet \ Services \ TcpIp \ Parameters / v MaxUserPort / t REG_DWORD / d 65534 / f
  • reg add HKLM \ System \ CurrentControlSet \ Services \ TcpIp \ Parameters / v MaxFreeTcbs / t REG_DWORD / d 2000 / f
  • reg add HKLM \ System \ CurrentControlSet \ Services \ TcpIp \ Parameters / v MaxHashTableSize / t REG_DWORD / d 2048 / f reg add HKLM \ System \ CurrentControlSet \ Services \ InetInfo \ Parameters / v MaxPoolThreads / t REG_DWORD / d 80 / f
  • appcmd set config / section: processModel / requestQueueLimit: 100000 / commit: MACHINE

Я не знаю, были ли все изменения необходимыми или оптимальными, но с некоторым тестированием на тестовом сервере мы достигли более 30 000 выполненных соединений и 5 000 запросов в секунду. Не удалось пойти дальше, потому что у меня закончились клиентские машины для запуска тестов.

1 голос
/ 24 сентября 2008

Если IIS не соответствует вашим требованиям, вам следует выбрать другой веб-сервер, например Apache Mod_mono ) или LightTPD .

Кстати, вы можете туннелировать XMPP через HTTP, используя XMPP Over BOSH . Не нужно придумывать собственный протокол.

0 голосов
/ 25 августа 2010

XMPP никогда не был разработан для высокопроизводительных приложений. Сообщения должны проходить через весь стек до уровня приложения, и существует много разборов XML. Рассматривали ли вы использование какого-либо другого стандарта, кроме XMPP?

...