Существует ли магическое число или формула для установки значений SetMaxThreads и SetMinThreads для ThreadPool? У меня есть тысячи долго работающих методов, которые требуют выполнения, но я просто не могу найти идеальное соответствие для установки этих значений. Любой совет будет принят с благодарностью.
ThreadPool SetMaxThreads и SetMinThreads Magic Number
Ответы (3)
Минимальное количество потоков по умолчанию — это количество ядер вашей машины. Это хорошее число, обычно нет смысла запускать больше потоков, чем у вас есть ядер.
Максимальное количество потоков по умолчанию в 250 раз превышает количество ядер, имеющихся в .NET 2.0 SP1 и более поздних версиях. Здесь огромное пространство для дыхания. На четырехъядерной машине для достижения этого максимума потребуется 499 секунд, если ни один из потоков не завершится за разумное время.
Планировщик пула потоков пытается ограничить количество активных потоков до минимума, по умолчанию количество ядер, которое у вас есть. Дважды в секунду он позволяет запустить еще один поток, если активные потоки не завершаются. Потоки, которые выполняются в течение очень долгого времени или часто блокируются, не вызванные вводом-выводом, не являются хорошими кандидатами для пула потоков. Вместо этого вы должны использовать обычный Thread.
Достижение максимума не является здоровым. На четырехъядерной машине только стеки этих потоков будут потреблять гигабайт виртуальной памяти. Получение OOM весьма вероятно. Подумайте о снижении максимального количества потоков, если это ваша проблема. Или рассмотрите возможность запуска нескольких обычных потоков, которые получают пакеты работы из потокобезопасной очереди.
Как правило, магическое число — оставить его в покое. ThreadPool хорошо справляется с этим.
При этом, если вы работаете с большим количеством долго работающих служб, и у этих служб будут длительные периоды ожидания, вы можете увеличить максимальное количество потоков, чтобы обрабатывать больше параметров. (Если процессы не блокируются, вы, вероятно, просто замедлите работу, если увеличите количество потоков...)
Профилируйте свое приложение, чтобы найти правильный номер.
Если вам нужен лучший контроль, вы можете НЕ использовать встроенный ThreadPool. Хорошая замена есть на http://www.codeproject.com/KB/threads/smartthreadpool.aspx.