Как по-другому настроить потоки WCF на планирование

Я использую winservice, который преследует 2 основные цели.

  1. Выполнение / обработка открытых веб-методов.
  2. Запускать внутренние процессы, потребляющие много ресурсов ЦП.

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

Я надеялся, что Framework 4.0 улучшит это, и они это сделали, но все же системе требуется довольно много времени для обработки задач в очереди WCF, если ЦП обрабатывает другие внутренние задачи.

  1. Можно ли изменить пул потоков, который использует WCF, на другой?
  2. Можно ли вручную изменить очередь задач (глобальная очередь задач, локальная очередь задач).
  3. Можно ли вручную обрабатывать 2 очереди задач, которые ведут себя по-разному?

Любая помощь в этом предмете будет принята.

Гилад.


person Gilad    schedule 11.05.2010    source источник


Ответы (2)


Имейте в виду, что ThreadPool поддерживает два различных типа потоков: рабочие потоки и потоки завершения ввода-вывода. Запросы WCF будут обслуживаться потоками ввода-вывода. Задачи, которые вы запускаете через ThreadPool.QueueUserWorkItem, будут выполняться в рабочих потоках. В этом отношении запросы WCF и другие задачи ЦП уже работают из разных очередей.

Некоторые проблемы с производительностью могут быть вызваны настройками ThreadPool. Из MSDN:

Пул потоков поддерживает минимальное количество незанятых потоков. Для рабочих потоков значением по умолчанию этого минимума является количество процессоров. Метод GetMinThreads получает минимальное количество незанятых рабочих и потоков завершения ввода-вывода. Когда все потоки пула потоков назначены задачам, пул потоков не сразу начинает создавать новые незанятые потоки. Чтобы избежать излишнего выделения пространства стека для потоков, он через определенные промежутки времени создает новые неактивные потоки. В настоящее время интервал составляет полсекунды, хотя он может измениться в будущих версиях .NET Framework. Если приложение подвержено всплескам активности, при которых в очередь ставится большое количество задач пула потоков, используйте метод SetMinThreads, чтобы увеличить минимальное количество простаивающих потоков. В противном случае встроенная задержка при создании новых незанятых потоков может вызвать узкое место.

Я определенно сталкивался с вышеупомянутым узким местом в прошлом. Существует метод SetMinThreads, который позволит вам изменить эти настройки. Кстати, вы упомянули установку приоритетов потоков; однако я не знаком с механизмом изменения приоритетов потоков ThreadPool. Не могли бы вы уточнить? Кроме того, я читал, что установка приоритетов потоков может быть чревата опасностью.

Ужас программирования: приоритеты потоков - зло

Кстати, сколько процессоров / ядер работает на вашей машине?

person Dan Terry    schedule 21.05.2010
comment
Я использовал SetMinThreads, который по умолчанию заставляет Threadpool генерировать больше потоков. Это частично решает проблему, но заставляет процесс выделять активные потоки даже при очень низкой нагрузке. Это не полностью решает проблему, когда в процессе выделяются небольшие задачи, которые также блокируют очередь пула потоков. Изменяя приоритет потока, можно подавить все внутренние потоки и отдать приоритет запросам от пользователя, но это возможно только в том случае, если Threadpool выполнил задачу. Thread.CurrentThread.Priority = ThreadPriority.Highest - person Gilad; 23.05.2010

Поскольку вы используете .NET 4.0, вы можете запускать свои длительные процессы через TPL. По умолчанию TPL использует пул потоков .NET для выполнения задач, но вы также можете предоставить свой собственный реализация TaskScheduler. Взгляните на примеры реализации планировщика в примерах для TPL. Я не использовал его лично, но QueuedTaskScheduler, кажется, назначает задачи очереди и использует свой собственный пул потоков для обработки задач. Вы можете использовать это, чтобы определить максимальное количество потоков, которые вы хотите использовать для своих длительных задач.

person Eric Hauser    schedule 11.05.2010