Как ограничить JVM по кол-ву CPU в Linux

144
02 января 2022, 00:10

Есть какой-то сервер к примеру с 16 CPU.
Есть JVM (OpenJDK 8u), запускаемая на нем.
Требуется ограничить JVM работой на 4 CPU.
Docker-ы не предлагать, этот доп. ПО, которое необходимо ставить на хост.

Напрашивается механизм с использованием taskset, и в данном случае можно посадить уже имеющиеся треды на какие-то CPU в кол-ве 4 шт.

Но вновь создаваемые треды, планировщик ОС будет распределять по всем доступным CPU и то, что мы ранее ограничили с помощью taskset, для новых тредов не будет актуально. Выполнив Runtime.availableProcessors() мы увидим не 4 CPU, а 16.

Просьба подсказать, кто уже решал подобные задачи по ограничению.

Answer 1

@eri был прав.Спасибо.
Дополню для поколений.

Нужно не уже запущенному jvm процессу выставлять cpu affinity с помощью taskset, а запускать jvm используя taskset.

Пример:
/usr/bin/taskset -c 5,6,7 java -jar .......

Запустит JVM только на ядрах 5,6,7
Проверить можно через:
taskset -cp PID_JVM
А лучше увидеть в динамике последний используемый CPU тредом можно так:
top -H -p PID_JVM
покажет все треды и далее
Shift + F и выбрать "Last Used CPU(SMP)"
Покажет столбец и на каком CPU работал трэд.

Ну и в JVM, к примеру в debug-е, тоже покажет верное кол-во видимых CPU:
Runtime.getRuntime().availableProcessors()
3

Проверял в том числе на JBOSS.

READ ALSO
NullPointerException при работе с массивом классов Java

NullPointerException при работе с массивом классов Java

У меня есть массив класса VKUserПользователь моей программы должен вводить данные о пользователях, после чего они отправляются в класс через...

161
Как настроить Android App Bundles чтобы опубликовать apk (PWA)?

Как настроить Android App Bundles чтобы опубликовать apk (PWA)?

Есть сайт с PWA, нужно опубликовать его в Google PlayСделал все по статье: https://habr

169
В чем различие OutputStreamWriter и FileWriter?

В чем различие OutputStreamWriter и FileWriter?

Честно гуглилНашел это: OutputStreamWriter vs FileWriter

90