Вы столкнулись с проблемой Linux Ate My Ram .
Не паникуйте.
Это не проблема.
Ваша система работает как задумано.
Проблема не в вашей ОС, а в том, что вы понимаете, что такое «свободная» память.
Системы Unix используют память не только для запуска программ. Память может быть использована для:
- Запущенные программы (активные / используемые)
- Буферизация данных в пути (буферы)
- Кэширование данных, недавно прочитанных / записанных на диск (кеш)
- Абсолютно ничего (бесплатно)
Далее следует краткий (и в основном неполный) обзор того, как современные системы Unix сообщают об использовании ОЗУ.
Что такое свободная память (определение ОС) ?
Когда система Unix сообщает об ОЗУ как о свободной, это означает: «Я не использую эту ОЗУ ни для чего».
Бесплатная оперативная память бесполезна - она не делает вашу систему быстрее, она просто «свободна» на случай, если что-то понадобится. Это может быть любой из трех других предметов, которые я упомянул выше.
Что такое кэш-память и буферная память?
Кэш-память и буферная память - это оперативная память, используемая операционной системой для ускорения работы системы.
Эта память не нужна для запуска программ прямо сейчас , поэтому ваша ОС использует ее для хранения данных, которые ей часто нужны - например, библиотека C (необходимая практически для каждой программы, которую вы запускаете) почти всегда хранится в cache
памяти, поэтому Система не должна идти на диск, чтобы найти инструкции, необходимые для печати «Hello World» на экране.
На самом деле все намного сложнее - есть общая память, проводная память и т. Д., Но для наших целей достаточно простого объяснения.
Что такое активная память?
Активная память - это часть, которую мы понимаем как «использованная» память - оперативная память, которую приложения используют для любых целей: сортировка электронных таблиц, обслуживание веб-страниц, редактирование графики и т. Д.
«Активная» память была «активной» в последнее время - - программа утверждает, что она использовала свое содержимое (чтение или запись), и она не считается хорошим кандидатом на обмен.
Что такое неактивная память?
Как и активная память, неактивная память - это оперативная память, которую приложения используют для любых целей. Разница в том, что к этой памяти давно никто не обращался, поэтому, если нажать кнопку push, операционная система решит, что она может быть выгружена на диск, и (если повезет немного) программе, которая утверждает, что больше не будет запрашивать ее, поэтому никогда не заметит.
Что такое «используемая» память (определение ЧЕЛОВЕКА)
То, что вы и я называем «используемой» памятью, по сути, является суммой активной и неактивной памяти. Вся оперативная память в настоящее время востребована приложениями для их использования.
Пока у вас больше установленной оперативной памяти, чем сумма активной и неактивной памяти (плюс хороший запас безопасности, скажем, 512-1024 МБ сверху), вы находитесь в нормальном месте: ваша ОС, вероятно , не будет ударять по производительности подкачки и убивать производительность ,
Что такое «свободная» память (определение ЧЕЛОВЕКА) ?
То, что вы и я называем «свободной» памятью, - это память, доступная для запуска программ.
Это немного сложнее, чем просто «Свободная» цифра в вашей ОС. Когда программа запрашивает ОЗУ, операционная система попытается получить эту ОЗУ как можно менее разрушительным образом:
- Если имеется свободная память (сидящая без дела), то ОЗУ будет выделено.
- Если свободной памяти нет, операционная система уничтожит кэш-память и буферное пространство: будет удалено самое последнее / наименее часто используемое содержимое в пуле буферов, и эта оперативная память будет передана программе.
- Если нет ОЗУ буфера / кеша для каннибализации, то подкачка будет смотреть на неактивную память и выбирать области, которые, по ее мнению, будут наименее вероятными для доступа. Эти данные будут выгружены на своп (диск), а недавно освобожденная оперативная память предоставлена программе.
- Если вся неактивная оперативная память была выгружена, программа подкачки начнет помещать активную оперативную память на диск.
(Это о том, где производительность обычно идет к собакам: Каждый раз , когда программа получает свою очередь на процессоре его перепутано-биты должны быть возвращены в оперативную память, что означает Активная память какой - нибудь другой программы должна быть выгружена - высокая текучесть кадров в свопе называется порка )
- Если система выгружала все, что могла (и заполняла раздел подкачки), или если вы работали с системой без раздела подкачки, случались плохие вещи . На этом этапе произойдет одно из двух:
malloc()
не удастся. Это поведение, соответствующее POSIX - операционная система сообщит программе, запрашивающей ОЗУ, что она не может удовлетворить запрос.
Программа может либо запросить меньше оперативной памяти, либо, если она не может обойтись с меньшим фрагментом памяти, она может очистить и выйти. (Если программа написана плохо, она просто рухнет.)
- Если вы работаете в Linux, OOM-Killer может перейти на диск-банду, убив веселье, останавливая другие процессы, пытаясь освободить достаточно оперативной памяти для удовлетворения запроса.
Если вы не можете судить по моему описанию здесь и моему ответу на связанный вопрос, я думаю, что это ужасный способ решить проблему.
Почему Free RAM увеличивается при удалении файлов?
В примере из этого вопроса вы заметили, что можно «освободить» ОЗУ, удалив файл резервной копии. Объяснение этого довольно простое: поскольку ничто не использует этот файл (без дескрипторов открытого файла), и он больше не доступен из файловая система (несвязанная) ОС знает, что никто больше никогда не получит доступ к этим данным, и она удаляет данные из кэша файловой системы.
Это заставляет ОС сообщать больше о свободной памяти, но не влияет на производительность системы.