Настройка memory overcommit

Часто при дефолтном значении системных параметров ядра vm.overcommit_ratio=50 и vm.overcommit_memory=0 java или Redis получает ошибку «Cannot allocate memory».
Для избежания подобных проблем нужно выставить следующие параметры:

Установить значение vm.overcommit_ratio=100 вместо умолчальных 50.

echo 100 > /proc/sys/vm/overcommit_ratio
или
sysctl –w vm.overcommit_ratio=100

Внесите в файл /etc/sysctl.conf следующую строку: vm.overcommit_ratio = 100, что бы изменения сохранились после перезагрузки:

echo 'vm.overcommit_ratio = 100' >> /etc/sysctl.conf

Установить значение vm.overcommit_memory=2 вместо умолчального 0.

echo 2 > /proc/sys/vm/overcommit_memory
или
sysctl –w vm.overcommit_memory=2

Внесите в файл /etc/sysctl.conf следующую строку: vm.overcommit_memory = 2, что бы изменения сохранились после перезагрузки:

echo 'vm.overcommit_memory = 2' >> /etc/sysctl.conf

В ядре есть два основных параметра, отвечающих за overcommit памяти:

  • vm.overcommit_memory — отвечает за стратегию overcommit
  • vm.overcommit_ratio — отвечает за уровень (в процентах) overcommit-а

Стратегии есть такие (см. файл с исходниками ядра mm/mmap.c):

  • 0 — OVERCOMMIT_GUESS — эвристический подход к распределению памяти. В нем выделяется столько памяти, сколько хочет процесс. Но в swap/res попадает только те страницы, которые используются этим процессом.
  • 1 — OVERCOMMIT_ALWAYS — overcommit памяти есть всегда. Использовать лучше с совсем кривыми приложениями и быть готовым при этому ко всему.
  • 2 — OVERCOMMIT_NEVER — без overcommit. В этом случае допустимый объем пространства памяти будет swap+ram*overcommit_ratio/100.

По умолчанию используется стратегия OVERCOMMIT_GUESS, а vm.overcommit_ratio находится в значение 50% и используется только в случае OVERCOMMIT_NEVER. Система резервирует около 3% памяти для процессов пользователя root.

Есть еще oom_killer, но с дефолтными настройками он очень часто прибивает не то, что нужно (например, sshd). Чтобы он работал более адекватно, нужно настраивать /proc//oom_adj, а это более трудоёмко, чем просто поменять пару параметров в sysctl.conf.

Метки: , . Закладка Постоянная ссылка.

Добавить комментарий

Ваш e-mail не будет опубликован.

*