Подтвердить что ты не робот

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

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

Обновление

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

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

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

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

-Adam

Ответ 4

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

В классе Runtime существует метод availableProcessors(). Это то, что вы ищете?

Ответ 5

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

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

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

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

Ответ 6

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

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

Ответ 7

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

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