Влияет ли количество занятых рабочих потоков в CLR ThreadPool на производительность потоков ввода-вывода? - PullRequest
1 голос
/ 11 января 2011

У нас есть Служба Windows , на которой размещено несколько служб WCF , и в несвязанной части приложения широко используется TPL Task класс для асинхронного выполнения относительно коротких битов работы.

Насколько я понимаю, WCF использует потоки управляемого ввода-вывода из ThreadPool для выполнения запросов.Я заметил, что после развертывания функции, которая значительно повысила использование приложений Tasks, а также использование рабочих потоков ThreadPool, производительность пары веб-сервисов стала очень низкой.Мы говорим минуты вместо секунды.Число Tasks, которые фактически пытаются выполнить в любой момент времени, может варьироваться от 20 до 1000, что заставляет меня думать, что любая новая (последняя) работа, требующая некоторого времени ЦП, может быть вынуждена ждать довольно долго.

Влияет ли (в моем случае очень большое) количество занятых рабочих потоков ThreadPool на потоки управляемого ввода-вывода ThreadPool?Могут ли эти двое быть связаны каким-либо образом?Или я должен начать искать в другом месте ...

Спасибо!

РЕДАКТИРОВАТЬ: Я только что проверил выборочное развертывание приложения в режиме реального времени, пытаясь вызвать один издлительно работающие веб-службы, что довольно типично: выполняется 70 задач, процесс службы Windows имеет около 150 потоков, средняя загрузка ЦП составляет 30-60%.Под типичным я подразумеваю, что загрузка процессора обычно составляет около 40% и редко превышает 80%, однако при этом выполняется большое количество задач и потоков, используемых процессом.

Ответы [ 2 ]

1 голос
/ 17 января 2011

Примечание: Я никогда раньше не отвечал на свой вопрос, поэтому надеюсь, что это уместно.Не стесняйтесь комментировать или не соглашаться, но похоже, что никто не отвечает на этот вопрос.

Итак, проблема, вызывающая проблемы с производительностью, была чем-то совершенно не связанным и теперь решается.

После устранения проблемы веб-службы снова начали своевременно отвечать.Это приводит меня к выводу, что у вас может быть довольно много задач TPL, запущенных одновременно (например, сотни в моем примере), и даже при интенсивном использовании рабочих потоков Thread Pool WCF по-прежнему сможет использовать управляемый I пула потоков./ O темы эффективно обрабатывать ваши запросы веб-службы.

1 голос
/ 11 января 2011

Если ваши задачи тратят какое-то время на сон или ожидание ввода-вывода, вы можете выиграть от запуска задач с TaskCreationOptions.LongRunning.Это заставляет пул потоков создавать больше потоков, а не ждать завершения потоков в очереди.

    task = Task.Factory.StartNew(() =>
   {
       DoLongRunningWork();
   }, TaskCreationOptions.LongRunning);

Если вы хотите проверить концепцию, здесь есть эксперимент здесь , который вы можетенайти полезного.

...