ThreadPool SetMaxThreads и SetMinThreads Magic Number - PullRequest
30 голосов
/ 11 января 2010

Существует ли магическое число или формула для установки значений SetMaxThreads и SetMinThreads для ThreadPool? У меня есть тысячи долговременных методов, которые нуждаются в исполнении, но просто не могу найти идеальное соответствие для установки этих значений. Любой совет будет принята с благодарностью.

Ответы [ 3 ]

43 голосов
/ 11 января 2010

Минимальное количество потоков по умолчанию - это количество ядер на вашей машине.Это хорошее число, обычно не имеет смысла запускать больше потоков, чем у вас ядер.

Максимальное количество потоков по умолчанию в 250 раз превышает количество ядер, которые у вас установлены в .NET 2.0 SP1 и выше.Здесь огромное количество передышки.На четырехъядерном компьютере для достижения этого максимума потребуется 499 секунд, если ни один из потоков не завершит работу за разумное время.

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

Достижение максимума не является здоровым.На четырехъядерном компьютере только стеки этих потоков будут занимать гигабайт пространства виртуальной памяти.Получение OOM очень вероятно.Попробуйте уменьшить максимальное количество потоков, если это ваша проблема.Или рассмотрите возможность запуска лишь нескольких обычных потоков, которые получают пакеты работы из потоково-безопасной очереди.

8 голосов
/ 11 января 2010

Как правило, магическое число заключается в том, чтобы оставить его в покое. ThreadPool хорошо справляется с этим.

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

Заполните заявку, чтобы найти правильный номер.

6 голосов
/ 11 января 2010

Если вам нужен лучший контроль, вы можете НЕ использовать встроенный ThreadPool. Есть хорошая замена на http://www.codeproject.com/KB/threads/smartthreadpool.aspx.

...