Потоков на процессор - PullRequest
       11

Потоков на процессор

24 голосов
/ 18 октября 2008

Есть ли в Java программный способ узнать, сколько параллельных потоков поддерживается процессором?

Обновление

Чтобы уточнить, я не пытаюсь забить ЦП потоками, и мне известна функция Runtime.getRuntime (). AvailableProcessors (), которая предоставляет мне часть информации, которую я ищу.

Я хочу выяснить, есть ли способ автоматически настроить размер пула потоков так, чтобы:

  • если я работаю на годичном сервере, я получаю 2 потока (1 поток на процессор x произвольный множитель 2)
  • если через два года я переключусь на четырехъядерный процессор Intel i7 (который поддерживает 2 потока на ядро), я получу 16 потоков (2 логических потока на процессор x 4 процессора x с произвольным множителем 2).
  • если вместо этого я использую восьмиъядерный сервер Ultrasparc T2 (который поддерживает 8 потоков на ядро), я получу 128 потоков (8 потоков на процессор x 8 процессоров x произвольный множитель 2)
  • если я разверну одно и то же программное обеспечение на кластере из 30 разных компьютеров, которые могут быть приобретены в разные годы, мне не нужно читать спецификации ЦП и устанавливать параметры конфигурации для каждого из них.

Ответы [ 7 ]

24 голосов
/ 19 октября 2008

Runtime.availableProcessors возвращает количество логических процессоров (то есть аппаратных потоков), а не физических ядер. См. CR 5048379 .

19 голосов
/ 18 октября 2008

Одно ядро ​​процессора без гиперпоточности всегда может запускать один поток. Вы можете создавать множество потоков, и процессор будет переключаться между ними.

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

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

4 голосов
/ 19 октября 2008

Не существует стандартного способа получения количества поддерживаемых потоков на ядро ​​ЦП в Java. Лучше всего получить утилиту Java CPUID, которая дает вам информацию о процессоре, а затем сопоставить ее с таблицей, которую вам нужно сгенерировать, которая даст вам потоки на ядро, которыми процессор управляет без «реального» переключения контекста.

-Adam

1 голос
/ 18 октября 2008

Каждый процессор или ядро ​​процессора может выполнять ровно 1 операцию одновременно. С гиперпоточностью дела обстоят немного иначе, но по большей части это все еще остается верным, поэтому моя HT-машина на работе почти никогда не поднимается выше 50%, и даже при 100% она не обрабатывает вдвое больше сразу ,

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

1 голос
/ 18 октября 2008

Основа: Приложение, загруженное в память, является процессом . Процесс имеет как минимум 1 поток . Если вы хотите, вы можете создать столько потоков, сколько хотите в процессе (теоретически). Поэтому количество потоков зависит от вас и используемых вами алгоритмов.

Если вы используете пулы потоков , это означает, что пул потоков управляет количеством потоков, поскольку создание потока потребляет ресурсы. Пулы потоков перерабатывают темы. Это означает, что многие логические потоки могут выполняться внутри одного физического потока один за другим.

Вам не нужно учитывать количество потоков , оно управляется алгоритмами пула потоков. Пулы потоков выбирают разные алгоритмы для серверов и настольных компьютеров (ОС).

Edit1: Вы можете использовать явные потоки , если считаете, что пул потоков не использует имеющиеся у вас ресурсы. В этом случае вы можете явно управлять количеством потоков.

1 голос
/ 18 октября 2008

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

В классе времени выполнения есть метод availableProcessors () . Это то, что вы ищете?

0 голосов
/ 18 октября 2008

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

Смотрите это обсуждение .

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