Memory overcommit
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 = <значение>
Применение изменений
Для применения изменений выполните:
# 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