[WCF] Асинхронность внутри сервиса
От: Митяй Россия http://dkomanov.livejournal.com
Дата: 10.10.10 13:28
Оценка:
Возникли проблемы в нагруженных WCF-сервисах — большое количество исключений по таймауту. После некоторых поисков выяснилось, что проблема в "длительных операциях", т.е. в сервисе есть несколько методов: некоторые выполняются относительно кратко, а некоторые долго. Долгие операции — это вызовы других WCF-сервисов и вызовы БД.

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

В ASP.NET есть асинхронные операции, которые возвращают рабочий поток (Worker Thread) в общий пул, пока асинхронные операции выполняются. Хотелось бы в WCF-сервисе использовать нечто подобное — чтобы длительные операции на все wait'ы освобождали пул рабочих потоков WCF.

Сразу оговорюсь, что я в курсе про OperationContractAttribute.AsyncPattern, однако он не решает проблемы нескольких wait'ов в сервисе + не хочется менять вид контракта с синхронного на асинхронный (и тем самым ещё и клиентов переписывать).

P.S. Понятно, что можно разделить долгие/короткие операции в разные сервисы и с помощью throttling регулировать загрузку (для котортких меньше, для долгих больше), но на мой взгляд это не очень "красиво".
wcf throttling async scalability
Re: [WCF] Асинхронность внутри сервиса
От: adontz Грузия http://adontz.wordpress.com/
Дата: 10.10.10 13:49
Оценка:
Здравствуйте, Митяй, Вы писали:

М>P.S. Понятно, что можно разделить долгие/короткие операции в разные сервисы и с помощью throttling регулировать загрузку (для котортких меньше, для долгих больше), но на мой взгляд это не очень "красиво".


Это как раз самое правильное. Очередь в которой запросы разной длины — очень-очень плохая ситуация.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: [WCF] Асинхронность внутри сервиса
От: Митяй Россия http://dkomanov.livejournal.com
Дата: 10.10.10 14:13
Оценка:
A>Это как раз самое правильное. Очередь в которой запросы разной длины — очень-очень плохая ситуация.
Это даёт клиенту как бы лишнее знание о том, что происходит внутри.
Re[3]: [WCF] Асинхронность внутри сервиса
От: adontz Грузия http://adontz.wordpress.com/
Дата: 10.10.10 15:32
Оценка:
Здравствуйте, Митяй, Вы писали:

A>>Это как раз самое правильное. Очередь в которой запросы разной длины — очень-очень плохая ситуация.

М>Это даёт клиенту как бы лишнее знание о том, что происходит внутри.

Знаю
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[4]: [WCF] Асинхронность внутри сервиса
От: Митяй Россия http://dkomanov.livejournal.com
Дата: 11.10.10 11:50
Оценка:
A>>>Это как раз самое правильное. Очередь в которой запросы разной длины — очень-очень плохая ситуация.
М>>Это даёт клиенту как бы лишнее знание о том, что происходит внутри.
A>Знаю

А всё-таки. Есть механизм внутренней асинхронности в WCF?
Re[5]: [WCF] Асинхронность внутри сервиса
От: Аноним  
Дата: 12.10.10 10:56
Оценка:
Здравствуйте, Митяй, Вы писали:
М>А всё-таки. Есть механизм внутренней асинхронности в WCF?

я давно делаю асинхронные вызовы в сервисе — опиши делегат, вызови BeginInvoke и в конце вызови EndInvoke
Re: [WCF] Асинхронность внутри сервиса
От: Jolly Roger  
Дата: 12.10.10 12:54
Оценка:
Здравствуйте, Митяй, Вы писали:

М>Возникли проблемы в нагруженных WCF-сервисах — большое количество исключений по таймауту.


А какие у Вас настройки пула? Что возвращают ThreadPool.GetMinThreads, GetMaxThreads, GetAvailableThreads в нормальном состоянии и при проблемной ситуации?
"Нормальные герои всегда идут в обход!"
Re[2]: [WCF] Асинхронность внутри сервиса
От: Митяй Россия http://dkomanov.livejournal.com
Дата: 13.10.10 20:03
Оценка:
JR>А какие у Вас настройки пула? Что возвращают ThreadPool.GetMinThreads, GetMaxThreads, GetAvailableThreads в нормальном состоянии и при проблемной ситуации?

Думаю, что эта информация вряд ли поможет. Поскольку проблема идентифицирована: расширяем количество потоков — увеличивается конкуренция (слишком много переключений контекста и т.п.), уменьшаем — уменьшается утилизация ЦПУ (поскольку много потоков просто в wait'е).

Нужен именно способ сказать WCF, что пока не выполнится этот wait — можешь использовать этот поток для обработки входящего запроса.
Re[3]: [WCF] Асинхронность внутри сервиса
От: Jolly Roger  
Дата: 14.10.10 10:15
Оценка:
Здравствуйте, Митяй, Вы писали:

М>Думаю, что эта информация вряд ли поможет. Поскольку проблема идентифицирована: расширяем количество потоков — увеличивается конкуренция (слишком много переключений контекста и т.п.), уменьшаем — уменьшается утилизация ЦПУ (поскольку много потоков просто в wait'е).


Это всё конечно правильно, но есть кое-какие нюансы. Пул базируется на Completion port, а этот механизм довольно хорошо оптимизирует использование процессаров своими потоками. Перегрузить планировщик скорее можно созданием своих потоков, неподконтрольных пулу. Я как-то проводил небольшие тесты, и мне не удалось заставить пул активировать потоков более, чем имеется процессоров, разумеется при условии, что потоки активны, не уходят в спячку.

По-моему, такие параметры, как число активных(конкурирующих за процессор), активированных но спящих, и доступных пулу потоков, вкупе с величинами загрузки процессоров, могли-бы быть полезны при анализе ситуациим.

Но Вам на месте, несомненно, лучше видно и проще оценить ситуацию
"Нормальные герои всегда идут в обход!"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.