Memory overcommit

Материал из ALT Linux Wiki

Memory overcommit — концепция в управлении памятью, которая позволяет выделить процессам больше памяти, чем физически доступно на физической машине. Это возможно, потому что процессы не всегда используют весь выделенный им объём памяти.

В Linux используется параметр vm.overcommit_memory.

Memory overcommit позволяет выделить виртуальным машинам памяти больше, чем имеется на физическом хосте, но без гарантии, что в конкретный момент времени вся запрошенная память может быть выделена.

Принцип работы

Ядро не выделяет сразу оперативную память приложению, а ставит ссылку на нужный блок и объём виртуальной памяти.

Если четыре виртуальные машины имеют по 1 ГБ памяти на физической машине с 4 ГБ, но используют только 500 МБ, можно создать дополнительные виртуальные машины, используя 500 МБ, которые каждая существующая машина оставляет свободной.

Если вся физическая память использована, а приложению требуется загрузить новую страницу в неё, ОС может выбрать страницу физической памяти для сброса на диск (swap out). В таблицу страниц вносится пометка, что данная страница отсутствует в физической памяти. Если позднее приложение попытается получить доступ к адресу выгруженной на диск страницы, это приведёт к ошибке, и операционная система загрузит страницу с диска в физическую память (swap in).

Настройка

В Linux параметр vm.overcommit_memory имеет три возможных значения:

  • 0 — эвристика (по умолчанию, система сама решает, разрешать ли выделение памяти);
  • 1 — всегда разрешать (опасный режим, может привести к OOM‑киллеру);
  • 2 — строгий контроль (память выделяется только если есть гарантия, что она реально доступна).

Просмотреть текущее состояние можно командой:

$ cat /proc/sys/vm/overcommit_memory

Временный изменения

Изменения в параметре можно временно изменить с помощью команды

# sysctl -w

(флаг -w позволяет записать новое значение в параметр ядра). Чтобы изменения были постоянными, нужно добавить строку в файл

Постоянные изменения

Чтобы изменить параметр на постоянной основе, отредактируйте файл:

# mcedit /etc/sysctl.conf

Добавив строку:

vm.overcommit_memory = <значение>

Применение изменений

Внимание! У вас при этом перезапустятся графика ("Иксы", Wayland) и соответственно все запущенные вами пользовательские процессы!!!

Для применения изменений выполните:

# sysctl --system

Проверка значений

От простого пользователя:

$ cat /proc/sys/vm/overcommit_memory

От root:

# sysctl vm.overcommit_memory

Дополнительные настройки (опционально)

Если вы используете vm.overcommit_memory = 2, может потребоваться настроить vm.overcommit_ratio (процент оперативной памяти, доступной для выделения):

vm.overcommit_ratio = 50

(значение по умолчанию — 50%)

Ошибки

Если оперативной памяти не будет хватать для всех, может произойти out-of-memory (OOM) — специальный процесс, который останавливает процесс, потреблявший больше всего оперативной памяти. Это может привести к сбоям в работе системы.

Важно: жёсткий overcommit (vm.overcommit_memory=2) может ломать запуск редких приложений, ожидающих «много памяти на старте». Решение — временно ослабить лимит или поднять

vm.overcommit_ratio