2009-03-25 5 views
6

У меня есть служба WCF net.tcp, размещенная с встроенным ServiceHost, и при выполнении стресс-тестов я получаю странное поведение. В первый раз, когда я отправляю кучу запросов, от 5 до 10 запросов отвечают быстро, а остальные возвращаются с интервалом в 2 секунды. Во второй раз, когда я отправляю запросы, 10-20 возвращаются быстро и отдыхают с двумя интервалами sencond.Производительность WCF с net.tcp

Вышеупомянутый повторяет, пока я не смогу получить более 100 запросов, которые будут возвращены быстро, но если я подожду минутку, то использование памяти службы снижается, а запросы возвращаются к 5-10, быстро возвращающимся.

Служба, которую я тестирую, имеет небольшую задержку, так что я могу получить много открытых подключений одновременно, если эта задержка удалена, запросы возвращаются так быстро, что у меня есть, возможно, 2-5 соединений, открытых одновременно , Эта задержка заключается в моделировании соединений БД и других исходящих материалов.

Из-за поведения это выглядит так, как ServiceHost выделяет что-то, потоки, экземпляры классов, но я не могу понять, что это такое.

У меня может быть таймер в клиенте, который вызывает службу, чтобы она работала, но это похоже на плохое решение.

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

Я предполагаю, что мой вопрос: ЧТО это получить при высокой загрузке службы WCF, и КАК Я могу настроить службу для выделения большего количества вещей, которые распределяются.

EDIT: Я проверил еще несколько тестов и посмотрел на taskmgr для процесса. Я вижу, что, когда servicehost «отдыхает», открыто 10 потоков, но когда я начинаю отправлять запросы, уровень thread увеличивается. Пока длина потока высока, servicehost может быстро обрабатывать входящие запросы, но если я приостанавливаю отправку запросов, то open threadcount уменьшается, а последующие запросы начинают занимать больше времени для обработки.

Теперь, как я могу сказать servicehost, чтобы сохранить кучу потоков открытыми? Или больше, чем 10-12, которые он сохраняет по умолчанию?

ответ

1

То, что определяет способ запроса, обрабатывается одновременно, является ServiceThrottlingBehavior. Существует несколько разных threasholds, которые ограничивают количество обрабатываемого запроса. Это также зависит от того, что вы используете, например, wsHttpBinding по умолчанию для сеансов, в то время как basicHttpBinding не использует сеансов, а ограничение по умолчанию для сеанса по умолчанию 10 не представляет проблемы.

Для получения более подробной информации см. http://msdn.microsoft.com/en-us/library/ms735114.aspx.

+0

Спасибо, я проверил сайт, и настройки уже есть в моем файле конфигурации, с высокими пределами, так высоко, что я должен быть в состоянии обрабатывать все входящие соединения на один раз вместо первой 5-10, а затем один за 2 секунды. – Kim

6

Ну, после многих поисковых запросов, похоже, проблема в threadpool. Пул потоков CLR выделяет несколько потоков, и когда они используются, он дросселирует создание новых потоков, и через какое-то время он также освобождает неиспользуемые потоки.

Существует некоторая путаница в отношении ошибки, которая означала, что ThreadPool не соблюдал вызов SetMinThreads.

http://www.michaelckennedy.net/blog/PermaLink,guid,708ee9c0-a1fd-46e5-8fa0-b1894ad6ce0f.aspx

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

1

Исправлена ​​ошибка, указанная в .NET 3.5 SP1.Возможно, это связано с проблемой, я думаю, что более вероятно (гораздо более вероятно), что дросселирование - это ваша проблема, а не поток, как ввел Морис.

<system.serviceModel> 
    <service name="???" > 
    <endpoint ... /> 
    </service> 
</system.serviceModel> 

Каков предел дросселя для этой «пустой» конфигурации? 10 сеансов, 16 одновременных вызовов! Осторожно.

Вот еще на резьбе: http://www.michaelckennedy.net/blog/2008/08/20/ThreadPoolBugInNET20SP1IsFixed.aspx

0

Это чувствует, как взломать, но это, кажется, чтобы решить вашу проблему. Проблема в том, что threadpool потребуется время, чтобы запустить новый поток, поэтому вам действительно нужны потоки, ожидающие в режиме ожидания. Добавьте конструктор в свою службу и установите минимальное количество потоков, которые вы хотите.

public YourService() 
    { 
     int workerThreads; 
     int portThreads; 
     ThreadPool.GetMinThreads(out workerThreads, out portThreads); 
     ThreadPool.SetMinThreads(200, portThreads); 
    }