Почему Linux странно сообщает о "свободной" памяти?

Это канонический вопрос о том, как операционные системы Unix сообщают об использовании памяти.
Похожие вопросы:

У меня есть рабочий сервер под управлением Debian 6.0.6 Squeeze

#uname -a

Linux debsrv 2.6.32-5-xen-amd64 #1 SMP Sun Sep 23 13:49:30 UTC 2012 x86_64 GNU/Linux

Каждый день cron выполняет скрипт резервного копирования от имени пользователя root:

#crontab -e

0 5 * * * /root/sites_backup.sh > /dev/null 2>&1

#nano /root/sites_backup.sh

#!/bin/bash
str=`date +%Y-%m-%d-%H-%M-%S`
tar pzcf /home/backups/sites/mysite-$str.tar.gz /var/sites/mysite/public_html/www
mysqldump -u mysite -pmypass mysite | gzip -9 > /home/backups/sites/mysite-$str.sql.gz
cd /home/backups/sites/
sha512sum mysite-$str* > /home/backups/sites/mysite-$str.tar.gz.DIGESTS
cd ~

Все работает отлично, но я замечаю, что график памяти Мунина показывает увеличение кеша и буферов после резервного копирования.

Тогда я просто скачиваю файлы резервных копий и удаляю их. После удаления граф памяти Мунина возвращает кеш и буферы в состояние, которое было до резервного копирования.

Вот график Мунина:

Внешне размещенное изображение было мертвой ссылкой.

3 ответа

Решение

Это та же "проблема", что и от сервера, отказывающегося использовать раздел подкачки и несколько других подобных вопросов на этом сайте. ( Высокое использование памяти на сервере Linux, использование памяти в LINUX, веб-серверу не хватает памяти и т. Д.)

Обратите внимание на то, что потребление памяти из кеша. Это означает, что он хранит файл в памяти. Кэшируемая память является "свободной" памятью. Вместо того чтобы оставлять блок памяти пустым, ваша ОС сохраняет недавно прочитанные файлы в этом пространстве. Если приложению нужна эта память, она будет использоваться приложением. А до тех пор у вас есть шанс избавить вас от необходимости снова читать файл с диска, если на него часто ссылаются.

Согласно этому графику, ваше эффективное потребление памяти не изменилось вообще за всю продолжительность графика.

Вы столкнулись с проблемой Linux Ate My Ram.

Не паникуйте.

Это не проблема.

Ваша система работает как задумано.

Проблема не в вашей ОС, а в том, что вы понимаете, что такое "свободная" память.


Системы Unix используют память не только для запуска программ. Память может быть использована для:

  • Запущенные программы (активные / используемые)
  • Буферизация данных в пути (буферы)
  • Кэширование данных, недавно прочитанных / записанных на диск (кеш)
  • Абсолютно ничего (бесплатно)

Далее следует краткий (и в основном неполный) обзор того, как современные системы Unix сообщают об использовании ОЗУ.

Что такое свободная память (определение ОС)?

Когда система Unix сообщает об ОЗУ как о свободной, это означает: "Я не использую эту ОЗУ ни для чего".
Бесплатная оперативная память бесполезна - она ​​не делает вашу систему быстрее, она просто "свободна" на случай, если что-то понадобится. Это может быть любой из трех других предметов, которые я упомянул выше.

Что такое кэш-память и буферная память?

Кэш-память и буферная память - это оперативная память, используемая операционной системой для ускорения работы системы.
Эта память не нужна для запуска программ прямо сейчас, поэтому ваша ОС использует ее для хранения данных, которые ей часто нужны - например, библиотека C (необходимая практически для каждой программы, которую вы запускаете) почти всегда хранится в cache памяти, поэтому системе не нужно идти на диск, чтобы найти инструкции, необходимые для печати "Hello World" на экране.
На самом деле все намного сложнее - есть общая память, проводная память и т. Д., Но для наших целей достаточно простого объяснения.

Что такое активная память?

Активная память - это часть, которую мы понимаем как "использованная" память - оперативная память, которую приложения используют для любых целей: сортировка электронных таблиц, обслуживание веб-страниц, редактирование графики и т. Д.
"Активная" память была "активной" в последнее время - программа утверждает, что она использовала свое содержимое (чтение или запись), и это не считается хорошим кандидатом для замены.

Что такое неактивная память?

Как и активная память, неактивная память - это оперативная память, которую приложения используют для любых целей. Разница в том, что к этой памяти давно никто не обращался, поэтому, если нажать кнопку push, операционная система решит, что она может быть выгружена на диск, и (если повезет немного) программе, которая утверждает, что больше не будет запрашивать ее, поэтому никогда не заметит.

Что такое "используемая" память (определение ЧЕЛОВЕКА)

То, что вы и я называем "используемой" памятью, по сути, является суммой активной и неактивной памяти. Вся оперативная память в настоящее время востребована приложениями для их использования.
Если у вас больше установленной оперативной памяти, чем сумма активной и неактивной памяти (плюс хороший запас прочности, скажем, 512-1024 МБ сверху), вы находитесь в хорошем месте: ваша ОС, вероятно, не будет ударять по производительности подкачки и убивать производительность,

Что такое "свободная" память (определение ЧЕЛОВЕКА)?

То, что вы и я называем "свободной" памятью, - это память, доступная для запуска программ.
Это немного сложнее, чем просто "Свободная" цифра в вашей ОС. Когда программа запрашивает ОЗУ, операционная система попытается получить эту ОЗУ как можно менее разрушительным образом:

  • Если имеется свободная память (сидящая без дела), то ОЗУ будет выделено.
  • Если свободной памяти нет, операционная система уничтожит кэш-память и буферное пространство: будет удалено самое последнее / наименее часто используемое содержимое в пуле буферов, и эта оперативная память будет передана программе.
  • Если нет ОЗУ буфера / кеша для каннибализации, то подкачка будет смотреть на неактивную память и выбирать области, которые, по ее мнению, будут наименее вероятными для доступа. Эти данные будут выгружены на своп (диск), а недавно освобожденная оперативная память предоставлена ​​программе.
  • Если вся неактивная оперативная память была выгружена, программа подкачки начнет помещать активную оперативную память на диск.
    (Речь идет о том, где производительность обычно сводится к собакам: каждый раз, когда программа запускает ЦП, ее выгруженные биты необходимо возвращать в ОЗУ, что означает, что активная память какой-либо другой программы должна быть выгружена - высокая текучесть кадров в свопе называется порка)
  • Если система выгружала все, что могла (и заполняла раздел подкачки), или если вы работали с системой без раздела подкачки, случались плохие вещи. На этом этапе произойдет одно из двух:
    • malloc() не удастся. Это поведение, соответствующее POSIX- операционная система сообщит программе, запрашивающей ОЗУ, что она не может удовлетворить запрос.
      Программа может либо запросить меньше оперативной памяти, либо, если она не может обойтись с меньшим фрагментом памяти, она может очистить и выйти. (Если программа написана плохо, она просто рухнет.)
    • Если вы работаете в Linux, OOM-Killer может перейти на диск-банду, убив веселье, останавливая другие процессы, пытаясь освободить достаточно оперативной памяти для удовлетворения запроса.
      Если вы не можете судить по моему описанию здесь и моему ответу на связанный вопрос, я думаю, что это ужасный способ решить проблему.

Почему Free RAM увеличивается при удалении файлов?

В примере из этого вопроса вы заметили, что можно "освободить" ОЗУ, удалив файл резервной копии. Объяснение этому довольно простое: поскольку ничто не использует этот файл (без дескрипторов открытого файла), и он больше не доступен из файловая система (несвязанная) ОС знает, что никто больше никогда не получит доступ к этим данным, и она удаляет данные из кэша файловой системы.
Это заставляет ОС сообщать больше о свободной памяти, но не влияет на производительность системы.

Что-то еще, чтобы проверить, если вышеперечисленное не помогает

Проверьте использование кеша Slab (Slab:, SReclaimable: а также SUnreclaim: в /proc/meminfo). Это кеш структур данных в ядре, он отделен от кеша страниц, о котором сообщает free,

Если кэш-память slab ответственна за большую часть вашей "недостающей памяти", проверьте /proc/slabinfo чтобы увидеть, куда это ушло. Если это зубные или иноды, вы можете использовать sync ; echo 2 > /proc/sys/vm/drop_caches чтобы избавиться от них.

Вы также можете использовать slabtop инструмент, чтобы показать текущее использование кэша Slab в дружественном формате. c отсортирует список по текущему размеру кэша.

От: https://stackoverflow.com/a/5467207

Другие вопросы по тегам