Java: Ограничьте количество ядер, которые может использовать JVM

Многочисленные пользователи запускают JAVA-приложения на вычислительном сервере с 60 ядрами (Linux/Ubuntu-based). Существуют различные приложения, и большинство из них не разрабатывается внутреннее.

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

Есть ли какая-либо конфигурация Java или ОС, которая может использоваться для предотвращения процесса от просто захвата, вычисляют ресурс неограниченным способом?

6
задан 12 June 2015 в 18:10
2 ответа

Что касается ОС:

  • Я бы сказал, что классический метод - установить привязку ЦП с набором задач .

  • Лучшая альтернатива - использовать контрольные группы .

  • И самое модное решение - запускать ваши приложения в контейнерах Docker . Однако до Java 8 JVM не могла понять ограничения, налагаемые Docker (доступно только после бэкпорта 8u131 +, не уверен, что он доступен как экспериментальный в Java9 для части ЦП, но он предназначен для памяти и полностью доступен в Java10)

3
ответ дан 3 December 2019 в 00:32

Я бы сказал, это видео стоит посмотреть. https://vimeo.com/181900266

Это дает очень хороший обзор Java, cgroups и контейнеров, а также то, как JVM обнаруживает, например количество процессоров.

Основываясь на этом, я бы сказал, что до Java 8 JVM определяет количество доступных процессоров на пути, что она всегда считает, что все «онлайн» процессоры доступны для нее, потому что она использует sysconf (_SC_NPROCESSORS_ONLN) для этой цели. Даже если это cgroup'd или помещен в контейнер.

Начиная с Java 9 JVM будет использовать sched_getaffinity (), и это поможет, если cpuset используется для управления количеством процессоров для JVM. Т.е. JVM будет видеть только настроенные процессоры. Например, если кто-то использует параметр Docker cpuset-cpus, он действительно создаст ограничение для JVM. Запись! Если cpushare настроен для JVM, это все равно не дает решения проблемы. JVM по-прежнему будет видеть все процессоры в системе (независимо от того, находится ли он в контейнере), если настроен только cpushare.

2
ответ дан 3 December 2019 в 00:32

Теги

Похожие вопросы