Служба SelfHosted WCF через базовую привязку HTTP не поддерживает более 1000 одновременных запросов - PullRequest
4 голосов
/ 23 декабря 2010

Я сам размещал службу WCF на BasicHttpBinding, потребляемом ASMX Client.Я имитирую параллельную пользовательскую нагрузку 1200 пользователей .Сервисный метод принимает строковый параметр и возвращает строку.Обмен данными составляет менее 10 КБ.Время обработки запроса фиксируется на уровне 2 секунд с помощью оператора Thread.Sleep (2000).Ничего дополнительного.Я удалил все хиты / бизнес-логику БД.

Один и тот же фрагмент кода работает нормально для 1000 одновременно работающих пользователей.Я получаю следующую ошибку, когда увеличиваю число до 1200 пользователей.

System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a receive. ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
   at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   --- End of inner exception stack trace ---
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead)
   --- End of inner exception stack trace ---
   at System.Web.Services.Protocols.WebClientProtocol.GetWebResponse(WebRequest request)
   at System.Web.Services.Protocols.HttpWebClientProtocol.GetWebResponse(WebRequest request)
   at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
   at WCF.Throttling.Client.Service.Function2(String param)

Это исключение часто сообщается при несовпадении DataContract и большом обмене данными.Но никогда, когда делаю нагрузочный тест.Я просмотрел достаточно и перепробовал большинство опций, которые включают

  1. Включенный журнал трассировки и сообщений на стороне сервера.Но ошибок нет.
  2. Для преодоления исчерпания порта MaxUserPort установлен на 65535, а TcpTimedWaitDelay 30 секунд.
  3. Для MaxConcurrent Calls установлено значение 600, а для MaxConcurrentInstances установлено значение 1200.
  4. Тайм-ауты открытия, закрытия, отправки и получения установлены на 10 минут.
  5. Для HTTPWebRequest KeepAlive установлено значение false.

Мне не удалось зафиксировать проблему дляпоследние два дня.

Любая помощь будет оценена.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 21 января 2011

Я видел похожие проблемы на разных серверах, в зависимости от их процессоров и оперативной памяти.Вы не упомянули тип сервера, как он был обновлен (XP Pro или Server 2003 обновлен до Server 2008) и т. Д. Я решил проблему путем проверки x: \ Windows \ Microsoft.NET \ Framework [версия]\ Config \ machine.config.Очевидно, что выбор «безлимитного» соединения через IIS не означает «безлимитные» соединения.Количество соединений, с которыми я столкнулся после 11 запросов в ту же миллисекунду.

Проблема была связана с количеством соединений, поступающих из одного источника.Инструмент оценки производительности находился на том же ПК, который имеет тот же IP-адрес.Machine.config содержит ограничение на количество соединений из одного источника.

0 голосов
/ 23 декабря 2010

Если в журналах WCF на стороне службы нет ошибок, я подозреваю, что вы достигли какого-то ограничения на уровне драйвера HTTP.SYS, что привело к отклонению запросов до того, как приложение службы их увидит. Я думаю, что предел по умолчанию в очереди запросов для конкретного приложения может быть 1000.

Я не эксперт по HTTP.SYS, но вы можете получить некоторое представление, запустив:

netsh http show servicestate
...