Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Runtime.getRuntime().availableProcessors()  [new]
Molasar
Member

Откуда:
Сообщений: 756
Всем привет!

Две машины с одинаковым 2-х ядерным процессором. На одной стоит Win10, на другой - Linux (CentOS7)

Runtime.getRuntime().availableProcessors():
- на Win10 выводит 4
- на Linux (CentOS7) 2

Винда, как я понимаю выводит количество потоков (обычно это ядра*2), а линукс фактическое количество ядер. Или я ошибаюсь?
Есть универсальный способ определения кол-ва процессоров?
1 июл 19, 12:33    [21918049]     Ответить | Цитировать Сообщить модератору
 Re: Runtime.getRuntime().availableProcessors()  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Molasar, а вы прямо в код првалитесь, там, насколько я помню, будет комментарий о том, как различаются понятие "процессоров" у винды и линукса.
1 июл 19, 12:42    [21918060]     Ответить | Цитировать Сообщить модератору
 Re: Runtime.getRuntime().availableProcessors()  [new]
Molasar
Member

Откуда:
Сообщений: 756
Т.е. как настроили JVM на конкретной машине, то и показывает?
/**
     * Returns the number of processors available to the Java virtual machine.
     *
     * <p> This value may change during a particular invocation of the virtual
     * machine.  Applications that are sensitive to the number of available
     * processors should therefore occasionally poll this property and adjust
     * their resource usage appropriately. </p>
     *
     * @return  the maximum number of processors available to the virtual
     *          machine; never smaller than one
     * @since 1.4
     *
    public native int availableProcessors();
Озверин
Molasar, а вы прямо в код првалитесь, там, насколько я помню, будет комментарий о том, как различаются понятие "процессоров" у винды и линукса.
1 июл 19, 12:51    [21918066]     Ответить | Цитировать Сообщить модератору
 Re: Runtime.getRuntime().availableProcessors()  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Molasar, ну там суть такая, что ява использует средства ос для определения кол-ва процессоров. и В винде оно возвращает с учетом гипертрединга, а в линуксе - похожу, только физические ядра

https://linux.die.net/man/3/sysconf - _SC_NPROCESSORS_ONLN
1 июл 19, 12:54    [21918068]     Ответить | Цитировать Сообщить модератору
 Re: Runtime.getRuntime().availableProcessors()  [new]
mayton
Member

Откуда: loopback
Сообщений: 42343
Molasar, универсального способа нет. Каждая операционка вкладывает свой смысл в термины процессор, ядро и thread.
Вы для себя сами решаете что правильно. Исходя из вашей задачи. Задачу я надеюсь вы понимаете.

Более того. Intel и AMD на коробке изделия могут слегка нас обманывать и выдавать одни цифры за другие.

По вашему вопросу. Самое простое - посмотреть в переменные окружения.

Например у меня под десятой виндой.

$ set
NUMBER_OF_PROCESSORS=8
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 
PROCESSOR_LEVEL=6


Вообще такой параметру лучше задавать вручную (! если это важно) т.к. современные среды виртуализации
могут быть очень хитрыми. Тактовая частота может плавать. И собственно сведения которые вы соберете
из getRuntime() или из еще каких-то источников не сильно могут отражать действительность.

Если вы решили выбрать размер пула потоков исходя из availableProcessors - то это скорее всего будет
неправильный выбор. Для большинства задач количество тредов слабо связано с процессорами. Особенно
если ваши треды большую часть времени будут стоять в ожидании блокера.
1 июл 19, 14:22    [21918168]     Ответить | Цитировать Сообщить модератору
 Re: Runtime.getRuntime().availableProcessors()  [new]
забыл ник
Member

Откуда:
Сообщений: 3024
mayton

Если вы решили выбрать размер пула потоков исходя из availableProcessors - то это скорее всего будет
неправильный выбор. Для большинства задач количество тредов слабо связано с процессорами. Особенно
если ваши треды большую часть времени будут стоять в ожидании блокера.


Не совсем правильно. availableProcessors - это некая база, от которой надо отталкиваться для расчетов, введя поправочные коэффициенты на свою задачу CPU bound/ IO bound.
1 июл 19, 14:25    [21918173]     Ответить | Цитировать Сообщить модератору
 Re: Runtime.getRuntime().availableProcessors()  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3334
Озверин
https://linux.die.net/man/3/sysconf - _SC_NPROCESSORS_ONLN
Инфа неактуальная: https://bugs.openjdk.java.net/browse/JDK-8140793 или https://bugs.openjdk.java.net/browse/JDK-6515172
1 июл 19, 14:46    [21918200]     Ответить | Цитировать Сообщить модератору
 Re: Runtime.getRuntime().availableProcessors()  [new]
mayton
Member

Откуда: loopback
Сообщений: 42343
Да. Докеры и виртуалки. Тоже требуют внимания.
1 июл 19, 14:53    [21918216]     Ответить | Цитировать Сообщить модератору
 Re: Runtime.getRuntime().availableProcessors()  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5183
Андрей Панфилов
Озверин
https://linux.die.net/man/3/sysconf - _SC_NPROCESSORS_ONLN
Инфа неактуальная: https://bugs.openjdk.java.net/browse/JDK-8140793 или https://bugs.openjdk.java.net/browse/JDK-6515172


если до сих пор выдает - значит актуальна?
1 июл 19, 15:16    [21918251]     Ответить | Цитировать Сообщить модератору
 Re: Runtime.getRuntime().availableProcessors()  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7902
Озверин
...и В винде оно возвращает с учетом гипертрединга, а в линуксе - похожу, только физические ядра...

Х.з. На Ubundu у меня все возврашалось корректно

И в такие "выкрутасы" не сильно верится.

Что выводит команда top? Сколько ядер/процессоров

Возможно у автора гипер трейдинг банально выключен и процессоров (ядер) только 2-е штуки.
2 июл 19, 14:27    [21919051]     Ответить | Цитировать Сообщить модератору
 Re: Runtime.getRuntime().availableProcessors()  [new]
Molasar
Member

Откуда:
Сообщений: 756
Количество ядер мне необходимо для расчета количества соединений с БД через пул хикари. Каждое соединение в отдельном потоке.
У Оракла читал, что оптимальный вариант 2 * Ядра + 1. На практике это подтверждается.
В настройках по умолчанию хочу выставлять количество потоков, рассчитанное по этой формуле.
Можно и в ручную задать этот параметр.


mayton
Molasar, универсального способа нет. Каждая операционка вкладывает свой смысл в термины процессор, ядро и thread.
Вы для себя сами решаете что правильно. Исходя из вашей задачи. Задачу я надеюсь вы понимаете.

Более того. Intel и AMD на коробке изделия могут слегка нас обманывать и выдавать одни цифры за другие.

По вашему вопросу. Самое простое - посмотреть в переменные окружения.

Например у меня под десятой виндой.

$ set
NUMBER_OF_PROCESSORS=8
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 
PROCESSOR_LEVEL=6


Вообще такой параметру лучше задавать вручную (! если это важно) т.к. современные среды виртуализации
могут быть очень хитрыми. Тактовая частота может плавать. И собственно сведения которые вы соберете
из getRuntime() или из еще каких-то источников не сильно могут отражать действительность.

Если вы решили выбрать размер пула потоков исходя из availableProcessors - то это скорее всего будет
неправильный выбор. Для большинства задач количество тредов слабо связано с процессорами. Особенно
если ваши треды большую часть времени будут стоять в ожидании блокера.
2 июл 19, 18:19    [21919340]     Ответить | Цитировать Сообщить модератору
 Re: Runtime.getRuntime().availableProcessors()  [new]
chpasha
Member

Откуда:
Сообщений: 8426
Premature optimization is the root of all evil. У тебя почти гарантированно в коде найдется масса мест, где что-то делается на столько не оптимально, что кол-во коннектов в пуле будет по сравнению с этим мелочью. Какой смысл сейчас на этапе разработки проекта тратить время на возню с высчитыванием оптимального размера пула, оптимального кол-ва работников и т.д.? Если будет доказано, что именно эти места являются узким местом - тогда и прикинешь оптимальную конфигурацию.
2 июл 19, 18:30    [21919346]     Ответить | Цитировать Сообщить модератору
 Re: Runtime.getRuntime().availableProcessors()  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7902
Пусть автор сначала приведет скриншоты системных утилит Unix (хотя бы top), где было бы видно РЕАЛЬНОЕ кол-во процессоров в системе, а не его хотелки, что должно быть как-бы 4.
2 июл 19, 18:50    [21919362]     Ответить | Цитировать Сообщить модератору
 Re: Runtime.getRuntime().availableProcessors()  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9404
lscpu
И не скриншоты - текст из консоли замечательно копируется в два клика мыши.
2 июл 19, 19:04    [21919373]     Ответить | Цитировать Сообщить модератору
 Re: Runtime.getRuntime().availableProcessors()  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 2041
Molasar
Количество ядер мне необходимо
подумай.
Все настойчиво тебе говорят что нет связи прямой Коннект-Ядро.
Если надо, то выведи в глобальную статик константу или конфиг.
2 июл 19, 19:07    [21919375]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить