2010-07-31 6 views
2

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

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

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

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

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

  1. Цепочка вызовов выглядит следующим образом, Client-> Service1-> Service2-> service3
  2. Все услуги являются PerCall с параллелизмом устанавливается на несколько.
  3. Дросселирование для X одновременных вызовов, X одновременных экземпляров.
  4. MaxConnections, ListenBacklog для службы X.
  5. Min/Max Threads ThreadPool установлен на X как на клиенте, так и на сервере (я применил исправление, предоставленное Microsoft).

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

Любые входы в это могли бы помочь.

Спасибо.

-Krishnan

+0

Вы пробовали это с помощью X = 1? Изменяется ли задержка ответа при добавлении потоков? –

+0

Да, да. Для X = 1 время отклика равно ответу, который я получаю, когда я выполняю запросы последовательно без потоков. И еще одна информация. Я использую TCP Binding. – Krishnan

ответ

1

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

0

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

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

+0

Спасибо за ваш ответ. Я попробую ваши рекомендации. Я создаю новый экземпляр прокси-сервера WCF и открываю его явно для каждого потока, прежде чем я вызову метод на прокси. Вы все еще чувствуете, что один открытый канал можно использовать повторно? Есть ли способ проверить это? И это поможет, если я создам несколько AppDomains вместо процессов? – Krishnan

+0

AppDomains может сделать это, если вы используете TCP-транспорт; они все равно являются процессами. Вероятно, вы все равно столкнетесь с событием 4226. –

+0

Создание AppDomains, похоже, не решает проблему. Я замечаю, что в ответах больше латентности. Я пытаюсь имитировать только 10 одновременных запросов. – Krishnan

Смежные вопросы