Когда я использую настройки по умолчанию:
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 ГБ.