Назад | Перейти на главную страницу

Почему 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 ~

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

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

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

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

Вы испытываете Linux съел мой баран вопрос.

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Что-то еще, чтобы проверить, не удается ли вышеуказанное:

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

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

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

Из: https://stackoverflow.com/a/5467207