Ограничение использования памяти для контейнера против ограничения использования памяти процессом JVM внутри контейнера? Что лучше? - PullRequest
0 голосов
/ 30 августа 2018

У меня есть контейнер, и я запускаю в нем 6 процессов. Есть 3 других контейнера, делающих то же самое. Если размер, выделенный группе, составляет 30 ГБ, я вижу, что почти вся ОЗУ заполняется, даже если на физическую память уходит только 25 ГБ.

Поэтому я решил ограничиться. Что я должен ограничить? Должен ли я ограничить каждый контейнер до 8 ГБ каждый? Или я должен ограничить объем оперативной памяти, выделяемой каждому процессу, используя -XX:MaxRamFraction=xx?

Первый случай ограничивает контейнер, а второй ограничивает оперативную память, выделенную для каждого процесса. Что лучше и почему?

1 Ответ

0 голосов
/ 30 августа 2018

Вы должны сделать оба. Поскольку JVM была pre-docker и не работает с cgroups (больше информации здесь ), она не «видит» ограничения, которые вы накладываете на свои контейнеры, и пытается использовать больше, чем следует. Это было исправлено в Java9 +, где JVM адаптирована к контейнерам. Сильфон исправления будет работать для java:8u172b111 и выше.

  1. Получить изображение Docker с помощью java:8u172b111 (например, anapsix/alpine-java:8u172b11_jdk)
  2. Добавьте JAVA_OPTS со следующими значениями:

-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction=2

  1. Ограничить память контейнера. Теперь JVM будет использовать cgroups при расчете объема используемой памяти.

Стоит отметить, что -XX:MaxRAMFraction=2 следует настроить в соответствии с вашим приложением, нагрузкой и количеством запущенных потоков.

Ребята из fabric8 проделали большую работу в создании изображений, которые вычисляют память контейнера и используют приблизительно 50% общей памяти как максимально допустимый (я думаю, что это также можно отрегулировать). И это работает для Java 7.

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