Каков наилучший способ создания пула потоков в Java - PullRequest
3 голосов
/ 11 июня 2019

Я пытаюсь использовать службы executor в одном из моих приложений, где я создал пул из 8, так как моя машина имеет 4 ядра, и согласно моим недавним поискам я обнаружил, что только 2 активных потока могут работать на ядре.Когда я проверил количество ядер через java, также нашел значение 4

int cores = Runtime.getRuntime().availableProcessors();
ExecutorService executor = Executors.newFixedThreadPool(cores*2);

Пожалуйста, предложите, я делаю правильно, потому что я не вижу особой ценности в создании пула из 500, когда мой процессор может обрабатывать только 8 потоков.

Ответы [ 2 ]

2 голосов
/ 11 июня 2019

Hyper-Threading

Вы должны ознакомиться с технологией hyper-threading . Именно этот термин является фирменным знаком, используемым Intel для собственной проприетарной реализации одновременной многопоточности (SMT) , но также используется в более общем смысле для SMT.

Слишком упрощенное объяснение:

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

Гиперпоточность в ЦП добавляет дублирующий набор регистров. Каждое ядро, имеющее двойной набор регистров, означает, что оно может переключаться между потоками без замены значений в регистрах. Переключение между потоками происходит намного быстрее, настолько, что процессор находится в операционной системе, сообщая каждое ядро ​​как пару (виртуальных) ядер. Так, например, 4-ядерный чип будет отображаться как 8 ядер.

Я обнаружил, что только 2 активных потока могут работать на ядре

Имейте в виду, что переключение потоков по-прежнему сопряжено с определенными затратами, но значительно ниже Гиперпоточное ядро ​​ЦП все еще выполняет только один поток за раз. Гиперпоточность означает, что переключение между потоками стало проще и быстрее.

Для использования машины, где потоки часто находятся в режиме ожидания, ожидая завершения какой-либо внешней функции, такой как вызов по сети, гиперпоточность имеет большой смысл. Для приложений, где ядра, вероятно, выполняют такую ​​работу, которая связана с процессором, такую ​​как вычисление чисел, моделирование, анализ научных данных, тогда гиперпоточность может быть не такой полезной. Таким образом, на машинах, выполняющих такую ​​работу, системный администратор может решить отключить гиперпоточность, поэтому 4 ядра - это всего лишь 4 ядра, например. Кроме того, из-за недавних уязвимостей безопасности , связанных с технологией гиперпоточности, некоторые системные администраторы могут решить отключить гиперпоточность.

Резьба бассейнов

создание пула из 500, когда мой процессор может обрабатывать только 8 потоков.

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

Каков наилучший способ создания пула потоков в Java

Здесь нет особых правил, чтобы помочь вам здесь. Сначала вы должны сделать обоснованное предположение, а затем отслеживать ваше приложение и хост-компьютер в рабочем состоянии . И поэтому вы можете захотеть установить количество потоков, используемых в ваших приложениях во время выполнения, а не жестко кодировать число. Например, используйте настройки предпочтений или используйте JMX . Научитесь использовать инструменты профилирования, такие как Java Flight Recorder и Mission Control ; оба теперь связаны с дистрибутивами Java на основе OpenJDK. Если вы внедряете систему, поддерживающую DTrace (macOS, BSD и т. Д.), Это также может помочь.

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

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

Сложные вещи

Безопасность потоков - очень сложная и сложная работа.При совместном использовании ресурсов между потоками (переменными, файлами и т. Д.) Вы должны быть осведомлены о проблемах защиты этих ресурсов от злоупотреблений.

Обязательное чтение: Практический параллелизм Java Брайан Гетц и др.

0 голосов
/ 11 июня 2019

Перейдите на System properties и проверьте, сколько там cores (physical cores) и logical processors (virtual cores).

Например:

если ваша система имеет n ядер и n логических процессоров . Это означает, что ваш процессор не поддерживает hyperthreading.

если ваша система имеет n ядер и n x 2 логических процессора . Это означает, что ваш процессор поддерживает hyperthreading. Вы можете выполнять n * 2 потоков параллельно.

Примечание. Предположим, у вас есть поддержка гиперпоточности. Теперь у вас есть 8 ядер и 16 виртуальных ядер.

Тогда процессор даст хорошую пропускную способность до 16 потоков. Если вы увеличите пул потоков более чем на 16 потоков, пропускная способность станет одинаковой и не изменится слишком сильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...