Два из наиболее распространенных по умолчанию, которые я видел, когда проклейки неблокируемому пула потоков являются:Java номер оптимально по умолчанию потоков без блокировки ввода/вывода
number of threads = number of cores
number of threads = number of cores + 1
, но теперь я нашел еще один в Vert.x , который:
number of threads = 2 * number of cores
Видимо logic behind this value, что, как Java не имеет никакого способа закрепления конкретного потока для конкретного ядра, если мы устанавливаем # threads == # cores
, мы могли бы тратить некоторые из доступных ядер. Теоретически, установив # threads
на что-то вроде 2 * # cores
, вероятность использования всех ядер увеличивается.
Я не уверен, уверен ли я в этом аргументе, поскольку я ожидал бы, что планировщик ОС попытается найти наилучшее распределение работы по ядрам. Это может быть не оптимальное распределение, но я ожидаю, что он будет лучше, чем постоянный множитель.
Я знаю, что все это зависит от вида выполняемых операций, но, при условии, что нет блокировки ввода-вывода (поэтому нет необходимости иметь неактивные потоки, ожидающие много времени для ресурса), является 2 * # cores
лучшим подхода по умолчанию, чем # cores
? Зачем?
Я подозреваю, что у них включена гиперпоточность, которая позволяет одновременно запускать два потока на каждое ядро. –
Тогда возникает вопрос, сколько ядер действительно есть? http://www.javaspecialists.eu/archive/Issue220.html – edharned