Назад | Перейти на главную страницу

Как работает vm.overcommit_memory?

Когда я использую настройки по умолчанию:

vm.overcommit_memory = 0
vm.overcommit_ratio = 50

Я могу прочитать эти значения из /proc/meminfo файл:

CommitLimit:     2609604 kB
Committed_AS:    1579976 kB

Но когда я меняю vm.overcommit_memory из 0 к 2, Я не могу запустить тот же набор приложений, который мог запускать до изменения, особенно amarok. Мне пришлось изменить vm.overcommit_ratio к 300, поэтому предел может быть увеличен. Теперь, когда я запускаю amarok, /proc/meminfo показывает следующее:

CommitLimit:     5171884 kB
Committed_AS:    3929668 kB

У этой машины всего 1 ГБ ОЗУ, но amarok работает без проблем, когда vm.overcommit_memory установлен на 0. Но в случае установки на 2, amarok необходимо выделить более 2 ГБ памяти. Это нормальное поведение? Если да, может ли кто-нибудь объяснить, почему, например, firefox (который потребляет в 4-6 раз больше памяти, чем amarok) работает одинаково до и после изменения?

Вы можете найти документацию в man 5 proc (или на kernel.org):

/proc/sys/vm/overcommit_memory
       This file contains the kernel virtual memory accounting mode.
       Values are:

              0: heuristic overcommit (this is the default)
              1: always overcommit, never check
              2: always check, never overcommit

       In mode 0, calls of mmap(2) with MAP_NORESERVE are not
       checked, and the default check is very weak, leading to the
       risk of getting a process "OOM-killed".

       In mode 2 (available since Linux 2.6), the total virtual
       address space that can be allocated (CommitLimit in /proc/mem‐
       info) is calculated as

           CommitLimit = (total_RAM - total_huge_TLB) *
                         overcommit_ratio / 100 + total_swap

Простой ответ заключается в том, что установка overcommit на 1 настроит сцену так, что когда программа вызывает что-то вроде malloc() выделить кусок памяти (man 3 malloc), он всегда будет успешным, независимо от того, знает ли система, что у нее не будет всей запрашиваемой памяти.

Основная концепция, которую необходимо понять, - это идея виртуальная память. Программы видят виртуальное адресное пространство, которое может или не может быть сопоставлено с реальной физической памятью. Отключив проверку избыточности, вы указываете ОС просто предполагать, что для резервного копирования виртуального пространства всегда достаточно физической памяти.

пример

Чтобы подчеркнуть, почему это иногда имеет значение, взгляните на Руководства Redis почему vm.overcommit_memory для него должно быть установлено значение 1.

Это старый вопрос с четко определенным ответом, но я думаю, что есть что добавить.

Прежде всего, когда vm.overcommit_memory = 0, то vm.overcommit_ratio значение не имеет значения. Ядро будет использовать эвристический алгоритм для перегрузки памяти, так что ваш amarok процессу может быть выделено больше памяти, чем доступно.

Когда вы устанавливаете vm.overcommit_memory к 2, то vm.overcommit_ratio значение становится актуальным. По умолчанию это значение установлено на 50, что означает, что система будет выделять только до 50% вашей оперативной памяти (плюс своп). Это объясняет, почему вы не можете запускать программы, которые работали нормально, когда vm.overcommit_memory = 0 - потому что выделяемой памяти меньше 500 МБ (при условии отсутствия подкачки).

Когда вы установите его на 300, вы позволяете системе выделять до 300% вашей оперативной памяти (плюс своп, если таковой имеется), поэтому CommitLimit ценность в /proc/meminfo так высоко.

Хотя vm.overcommit_memory = 2 обычно используется для предотвращения чрезмерных обязательств, здесь вы используете его для ограничения суммы, которая может быть превышена. Установив его на 300 опасно, поскольку в вашей системе нет 5171884 kB памяти, и поэтому, в зависимости от того, сколько места подкачки у вас есть, система будет использовать подкачку (что медленно) или вообще нехватка памяти.

Что касается почему amarok использует больше памяти, когда vm.overcommit_memory = 2 - это наверное потому, что amarok лучше всего работает с большим объемом памяти, но также подходит и с меньшим объемом памяти. Таким образом, логика программы может сначала попытаться выделить 2 ГБ памяти, но если это не удается, попробуйте 1 ГБ.