Это канонический вопрос о том, как операционные системы 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 МБ сверху), у вас все в порядке: ваша ОС наверное не будет сбивать своп и убивать производительность.
То, что мы с вами называем «свободной» памятью, - это память, доступная для запуска программ.
Это немного сложнее, чем просто цифра «Бесплатно», которую сообщает ваша ОС. Когда программа запрашивает оперативную память, операционная система будет пытаться получить эту оперативную память наименее разрушительным способом:
malloc()
не удастся. Это поведение, соответствующее стандарту POSIX - операционная система сообщит программе, запрашивающей ОЗУ, что она не может удовлетворить запрос.В примере из вопроса здесь вы заметили, что можно «Освободить» оперативную память, удалив файл резервной копии - объяснение этому довольно простое: поскольку ничто не использует этот файл (нет дескрипторов открытых файлов), и он больше не доступен из файловая система (несвязанная), ОС знает, что никто больше не будет обращаться к этим данным, и очищает данные из кеша файловой системы.
Это заставляет ОС сообщать о большем количестве свободной памяти, но не влияет на производительность системы.
Это та же "проблема", что и у Сервер отказывается использовать раздел подкачки и еще несколько подобных вопросов на этом сайте. ( Высокое использование памяти на сервере Linux, Использование памяти в LINUX, Веб-серверу не хватает памяти, и т.д.)
Обратите внимание на то, что расход памяти от тайник. Это означает, что он хранит файл в памяти. Кэшированная память - это «свободная» память. Вместо того, чтобы оставлять блок памяти пустым, ваша ОС хранит в нем недавно прочитанные файлы. Если приложению действительно нужна эта память, она будет использована приложением. До тех пор у вас есть шанс избавить вас от необходимости снова читать файл с диска, если на него часто ссылаются.
Согласно этому графику, ваше эффективное потребление памяти вообще не изменилось за все время графика.
Что-то еще, чтобы проверить, не удается ли вышеуказанное:
Проверьте использование кэша Slab (
Slab:
,SReclaimable:
иSUnreclaim:
в/proc/meminfo
). Это кеш структур данных в ядре, отдельный от кеша страниц, о котором сообщаетfree
.Если блочный кеш отвечает за большую часть вашей «недостающей памяти», отметьте
/proc/slabinfo
чтобы увидеть, куда он делся. Если это dentries или inodes, вы можете использоватьsync ; echo 2 > /proc/sys/vm/drop_caches
избавиться от них.Вы также можете использовать
slabtop
инструмент для отображения текущего использования кэша Slab в удобном формате.c
отсортирует список по текущему размеру кеша.