Почему ThreadPool по умолчанию имеет 250 рабочих потоков на процессор?

Взято из документации Microsoft:

По умолчанию пул потоков содержит 250 рабочих потоков на каждый доступный процессор. Вы можете изменить этот параметр с помощью метода ThreadPool.SetMaxThreads.

Также широко известно, что есть некоторые накладные расходы:

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

Исходя из некоторого опыта и предположений, у меня было бы что-то вроде от 1 до 4 потоков на ЦП, а не 250! Кто-нибудь знает, почему 250? Это какое-то значение, которое должно обеспечить наилучшую общую производительность, или это для того, чтобы почти каждая задача, которую вы отдаете этому пулу потоков, была обрабатывается, не дожидаясь завершения других задач?


person Wernight    schedule 03.08.2010    source источник
comment
Я думаю, лучше спросить @serverfault   -  person ckv    schedule 03.08.2010


Ответы (1)


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

Конечно, в числе «250» нет ничего особенного, и взаимоблокировки все еще могут возникать, если разработчик настаивает на использовании такой проблематичной схемы использования пула потоков. Однако это должно уменьшить вероятность достижения тупиковой ситуации в таких сценариях.

Джо Даффи более подробно объясняет это рассуждение в своем сообщении: Почему максимальное количество потоков CLR 2.0 SP1 по умолчанию для пула потоков было увеличено до 250/CPU.

person Liran    schedule 03.08.2010