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


44

Это канонический вопрос о том, как операционные системы 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
Поздравляю, этот вопрос был канонизирован (это как 6-й вопрос, который сегодня задают об этом, и у него самый интересный и самый красивый пример :-)
voretaq7

Ответы:


27

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

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

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


Можно ли дать команду серверу не кэшировать эти файлы? Я думаю, я должен бежать sync; echo 3 > /proc/sys/vm/drop_cachesпосле резервного копирования?

13
@ stan31337 Да, это возможно, нет, вы не должны этого делать. Наличие этого файла в памяти ничего не стоит. Если вы очистите все свои кэши, каждый файл, который кэшируется и должен быть снова прочитан с диска, просто замедлит работу вашей системы. Позвольте ему делать то, для чего он предназначен.
Джефф Ферланд

2
@ stan31337 Когда вы удаляете файл резервной копии, ОС автоматически выгружает его из кэша (поэтому ваша свободная память снова скачет после удаления) - Linux достаточно умен, чтобы знать, что файл не открыт и не может быть достигнутым из дерева файловой системы, никогда не будет снова доступен. Как Джефф сказал, что вы определенно не хотите выгружать весь кеш FS (системе просто нужно перечитать и повторно кэшировать эти данные с диска, что на некоторое время замедлит работу вашего сервера)
voretaq7

61

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


Теперь это совершенно ясно для меня ... Мой опыт работы с Linux составляет около 2 месяцев, все началось с этого сервера Debian. Месяц назад я установил Gentoo на свой домашний ноутбук и был настолько поражен его производительностью, что полностью перешел с пользователя Windows на пользователя Linux даже на моем рабочем компьютере. Замечательно изучать Linux с Gentoo, и все же есть чему поучиться.

@ stan31337 Вы не единственный, для кого это неясно - это особенно трудно для людей, выходящих из Windows, потому что, если вы не углубитесь в это, Windows не сообщит об использовании памяти с таким уровнем детализации - она ​​просто «используется» (программами). ) и «Бесплатно» (для программ, чтобы взять). Для пользователей Mac это немного проще, потому что Activity Monitor представляет собой графическую версию topи сообщает о свободной / проводной / активной / неактивной оперативной памяти.
voretaq7

Раньше я работал с Process Explorer в Windows, в нем было много чего показать в памяти, но большинство из них были настолько неясны для меня, что я даже не смотрел на них ...

2
Кроме того, следует отметить, что, хотя Windows обычно не показывает это в таких подробностях, она имеет очень похожую настройку.
Иоахим Зауэр

Знаете, даже в Windows считывание памяти сбивает с толку. Это то, на что производители ОС, возможно, захотят сделать больший акцент, или, скорее, то, о чем пользователи должны заботиться меньше, чем сейчас.
gparent

2

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

Проверьте использование кэша 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.