Как настроить потоки WCF по-разному - PullRequest
0 голосов
/ 11 мая 2010

У меня работает winservice, у которого есть 2 основные цели.

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

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

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

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

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

Гилад.

Ответы [ 2 ]

1 голос
/ 21 мая 2010

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

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

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

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

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

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

0 голосов
/ 11 мая 2010

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

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