Имитация одновременных клиентских вызовов WCF и измерение времени ответа - PullRequest
2 голосов
/ 31 июля 2010

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

В качестве первого шага я создал X потоков, используя класс Thread, и вызвал метод Start.Чтобы синхронизировать все запросы, при обратном вызове потока я открываю соединение и получаю Monitor.Wait, чтобы удержать запрос от запуска до тех пор, пока все потоки не будут созданы и запущены.Как только все потоки запущены, я вызываю Monitor.PulseAll для запуска вызова метода на клиентском прокси WCF.

Когда я выполняю запросы таким образом, я вижу огромную задержку в ответе.Запрос, который занимает всего несколько миллисекунд, занимает около секунды.

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

У меня есть следующие настройки.Предположим, что «X» соответствует числу запросов, которые я хочу выполнить.Также обратите внимание, что со следующими настройками я не получаю никаких проблем отказа в обслуживании.

  1. Цепочка вызовов выглядит следующим образом: Клиент-> Сервис1-> Сервис2-> Сервис3
  2. ВсеСлужбы PerCall с параллелизмом установлены на несколько.
  3. Регулирование установлено на X Параллельных вызовов, X Параллельных Экземпляров.
  4. MaxConnections, ListenBacklog на Сервисе на X.
  5. Мин. / Макс. Потоки ThreadPool установлены на X на обоих Клиентахи Сервер (я применил исправление, предоставленное Microsoft).

Я не уверен, что время отклика, которое я измеряю, точное.Я упускаю что-то очень тривиальное?

Любые материалы по этому вопросу будут очень полезны.

Спасибо.

-Кришнан

Ответы [ 2 ]

1 голос
/ 17 ноября 2010

Я сам нашел ответ трудным путем.Все это время, то, как я измерял время отклика, было неверным.Нужно создать X количество потоков, где X - количество одновременных пользователей, которых вы хотите симулировать.В каждом потоке откройте соединение только один раз и используйте цикл while, чтобы выполнить только метод WCF, который вы хотите протестировать в течение заданного времени.Измеряйте время отклика по каждому возврату, накапливайте его и усредняйте по числу вызовов, которые были выполнены в течение данной продолжительности.

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

Если все ваши исходящие вызовы поступают из одного процесса, вполне вероятно, что среда выполнения либо объединяет несколько запросов в один открытый канал, либо ограничивает количество одновременных запросов в одной целевой службе.Вы можете получить лучшие результаты, если переместите каждого симулированного клиента в его собственный процесс, используйте именованный EventWaitHandle для их синхронизации и вызовите #Set(), чтобы развернуть их всех сразу.

Существует также ограничение на количество ожидающих одновременных (в состоянии TCP SYN или SYN / ACK) исходящих соединений TCP, разрешенных при сборке настольных систем Windows;если вы столкнетесь с этим пределом, вы получите событие 4226 , зарегистрированное и дополнительные одновременные соединения будут отложены.

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