Недостаточно памяти
Недостаток памяти ( OOM ) — это часто нежелательное состояние работы компьютера, при котором дополнительная память не может быть выделена для использования программами или операционной системой. Такая система не сможет загружать какие-либо дополнительные программы, а поскольку многие программы могут загружать в память дополнительные данные во время выполнения, они перестанут работать корректно. Обычно это происходит потому, что вся доступная память, включая пространство подкачки на диске , уже выделена.
История
[ редактировать ]Исторически состояние нехватки памяти было более распространенным, чем сейчас, поскольку ранние компьютеры и операционные системы были ограничены небольшими объемами физической оперативной памяти (ОЗУ) из-за неспособности ранних процессоров обращаться к большим объемам памяти. , а также соображения стоимости. Поскольку появление виртуальной памяти открыло возможности для использования пространства подкачки, это условие встречается реже. Почти все современные программы ожидают, что смогут свободно выделять и освобождать память во время выполнения, и имеют тенденцию давать неконтролируемые сбои (сбои), когда это ожидание не оправдывается; Старшие часто выделяли память только один раз, проверяли, достаточно ли у них ее для выполнения всей работы, а затем ожидали, что больше ее не будет. Таким образом, они либо сразу же выйдут из строя с сообщением об ошибке «недостаточно памяти» (OOME), либо будут работать должным образом. [ нужна ссылка ]
Ранние операционные системы, такие как MS-DOS, не поддерживали многозадачность . Программам была выделена физическая память, которую они могли использовать по мере необходимости. Физическая память часто была дефицитным ресурсом, и когда она была исчерпана приложениями, например, с функцией резидентного завершения , дальнейшие приложения не могли быть запущены до тех пор, пока работающие приложения не были закрыты.
Современные операционные системы предоставляют виртуальную память, в которой процессам предоставляется определенный диапазон памяти, но эта память напрямую не соответствует фактической физической оперативной памяти. Виртуальная память может поддерживаться физической оперативной памятью, файлом на диске через mmap (в производных от Unix ) или MapViewOfFile (в Windows) или пространством подкачки, а операционная система может перемещать страницы виртуальной памяти по мере необходимости. Поскольку виртуальная память не нуждается в поддержке физической памяти, ее исчерпание происходит редко, и обычно существуют другие ограничения, налагаемые операционной системой на потребление ресурсов. [1]
Как и предсказывает закон Мура , объем физической памяти во всех компьютерах вырос почти в геометрической прогрессии, хотя это в некоторой степени компенсируется увеличением размеров самих программ и файлов. В некоторых случаях компьютеру с поддержкой виртуальной памяти, где большая часть загружаемых данных находится на жестком диске, может не хватать физической памяти, но не виртуальной памяти, что приводит к чрезмерному подкачиванию страниц . Это состояние, известное как тряска , обычно делает компьютер непригодным для использования до тех пор, пока некоторые программы не будут закрыты или компьютер не будет перезагружен. По этим причинам сообщение о нехватке памяти редко встречается в приложениях на современных компьютерах. [ нужна ссылка ]
Однако на современном компьютере все еще можно столкнуться с состоянием OOM. Типичный случай OOM на современных компьютерах возникает, когда операционная система не может больше создавать виртуальную память, поскольку все ее потенциальные резервные устройства были заполнены или конечный пользователь отключил их. Это условие может возникнуть из-за копирования при записи после fork().
Восстановление
[ редактировать ]Ядра операционных систем, таких как Linux, попытаются восстановиться после этого типа состояния OOM, завершив один или несколько процессов, механизм, известный как OOM Killer . [2] [3] Linux 4.6 (выпущенный в мае 2016 г.) внес изменения в ситуации OOM, улучшив обнаружение и надежность. [4] [5] Осведомленность о cgroup в OOM killer была реализована в ядре Linux 4.19, выпущенном в октябре 2018 года, что добавляет возможность уничтожать cgroup как единое целое. [6]
Из-за поздней активации OOM Killer в некоторых системах Linux [7] существует несколько демонов и патчей ядра, которые помогают восстановить память из состояния OOM, пока не стало слишком поздно.
earlyoom
[8]nohang
[9]systemd-oomd
- Исправления ядра PSI (информация о остановке давления) и сопутствующие
oomd
daemon, патчи объединены в ядро Linux 4.20. [10] [11]
Ограничения памяти для каждого процесса
[ редактировать ]Помимо общесистемных ограничений физической памяти, некоторые системы ограничивают объем памяти, который может использовать каждый процесс. Обычно это вопрос политики, такое ограничение также может произойти, когда ОС имеет большее адресное пространство, чем доступно на уровне процесса. Некоторые высокопроизводительные 32-разрядные системы (например, с включенным расширением физических адресов ) имеют 8 или более гигабайт системной памяти, хотя любой отдельный процесс может получить доступ только к 4 ГБ этой памяти в 32-разрядной модели плоской памяти .
Процесс, который превышает лимит для каждого процесса, а затем пытается выделить дополнительную память, столкнется с ошибкой. Например, стандартная функция C для выделения памяти: malloc()
, вернет NULL , и правильное приложение должно справиться с этой ситуацией.
Ссылки
[ редактировать ]- ^ «Полное руководство по обновлению Ram» . wincah.com . 2023.
- ^ Linux OOM-убийца
- ^ «Как настроить Linux-убийцу нехватки памяти» . Проверено 19 февраля 2015 г.
- ^ «К более предсказуемой и надежной обработке нехватки памяти [LWN.net]» . lwn.net .
- ^ «Linux_4.6 — новички в ядре Linux» . kernelnewbies.org .
- ^ «Linux_4.19 — новички в ядре Linux» . kernelnewbies.org .
- ^ «Ядро Linux — можно ли заставить убийцу OOM вмешаться раньше?» . Супер пользователь . Проверено 7 марта 2021 г.
- ^ rfjakob (7 марта 2021 г.), rfjakob/earlyoom , GitHub , получено 7 марта 2021 г.
- ^ Аврамов, Алексей (5 марта 2021 г.), hakavlad/nohang , GitHub , получено 7 марта 2021 г.
- ^ «linux-psi.git — показатели нагрузки на ресурсы Linux» . git.cmpxchg.org . Проверено 7 марта 2021 г.
- ^ facebookincubator/oomd , Инкубатор Facebook, 3 марта 2021 г. , дата обращения 7 марта 2021 г.
Внешние ссылки
[ редактировать ]- Обработка нехватки памяти
- Статья « Минимизация использования памяти для создания подпроцессов приложения ». Архивировано 12 июня 2006 г. в Wayback Machine Грегом Нахимовским.
- Статья « Укрощение убийцы ООМ » Голдвина Родригеса
- Статья « Когда в Linux не хватает памяти » Муляди Сантоса
- Статья «Обработка ошибок нехватки памяти», заархивированная 25 февраля 2021 г. в Wayback Machine . Джона Бойланда
- Исправить ошибку нехватки памяти