Я пишу, чтобы задать вопрос о производительности WCF.
1.Справочная информация
У нас есть система клиент-сервер, которая работает на .NET 3.5.Сервером является C # сервис , а клиентом - приложение silverlight .
Я написал стресс-тестер, который является приложением winforms и работает так:
- Он порождает рабочие процессы
- Работник обрабатывает различные стрессовые нагрузки
[eg for (i=0;i<100;i++)
Send(payload)]
- Служба работает как
[ServiceBehavior(InstanceContextMode
=InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)]
. - Всетайм-ауты (операция, отправка, получение, ..) были установлены на максимум
serviceThrottling:
maxConcurrentSessions="200"
- Включена трассировка сообщений и печатается все
2,Проблема
После некоторых пороговых значений (в зависимости от нагрузочных нагрузок и тестируемой среды) мои рабочие процессы (обычные консольные приложения .NET 3.5 C #) начинают генерировать исключения.Сначала я получал timeoutExceptions, но после многих сеансов чтения и настройки я попал в точку, где я получаю только два исключения (только при очень высокой нагрузке)
- Базовое соединение было закрыто:Соединение, которое, как ожидали, будет поддерживаться в рабочем состоянии, было закрыто сервером.
- Произошла ошибка при получении ответа HTTP на.Это может быть связано с тем, что привязка конечной точки службы не использует протокол HTTP.Это также может быть связано с тем, что сервер прерывает контекст HTTP-запроса (возможно, из-за закрытия службы).См. Журналы сервера для более подробной информации.
Наряду с этим я вижу существенную потерю сообщения.Сервер никогда не выходит из строя (что хорошо).Я думаю, что сервер просто отклоняет сообщения, которые он не может обработать.
3.Выполненные действия
Я прочитал много статей и настроил множество параметров (включая регулирование, тайм-ауты и т. Д.).Например, я попробовал все предложения здесь: http://www.codeproject.com/KB/WCF/WCFThrottling.aspx
Я получаю улучшение производительности, но в зависимости от того, в какой среде я работаю на сервере, я достигну этого верхнего предела и начну отклонять сообщения.
В журналах трассировки вообще не сообщается об ошибках
4.В идеале ...
... Я хотел бы иметь сервер, который работает медленнее при увеличении нагрузки, но не пропускает сообщения.(т. е. нормально, если клиенту требуется 10 секунд для получения ответа, если 500 других используют службу)
Возможно ли это в WCF через Http и однопоточный односторонний контекстный сервер?Я здесь пропускаю настройку или я получаю верхнюю границу и получаю ожидаемое поведение WCF?
Примечание: я пытался использовать ConcurrencyMode.Multiple
.Я получаю улучшение (т. Е. Требуется больше нагрузки для достижения верхней границы), но я получаю те же исключения.