(возможно, уже немного поздно для ОП, но об этом спрашивают довольно часто, поэтому я попробую)
free
обычно показывает что-то вроде этого:
total used free shared buffers cached
Mem: 8195284 8137708 57576 0 1232328 2651156
-/+ buffers/cache: 4254224 3941060
Swap: 18892216 759852 18132364
Люди склонны смотреть на строку Mem:
, пытаясь выяснить, сколько у них свободной памяти.К сожалению, эта строка вводит в заблуждение, потому что ядро Linux пытается оптимально использовать доступную память (по крайней мере) следующими способами:
Он будет кешировать данные из подсистемы ввода / вывода(например, диск), чтобы он был легко доступен при необходимости.
Он будет активно высылать процессы, которые в течение некоторого времени были неактивны, в пространство подкачки в пользу кэширования данных.для активных процессов.Это способствует пропускной способности, а не отзывчивости, поэтому некоторые люди настраивают свое ядро, чтобы изменить это поведение.
Первый пункт - источник путаницы в отношении free
, поскольку строка Mem:
включает в себя память, используемую для кэширования, в объеме используемой памяти.Ядро, однако, будет кэшировать как можно больше из соображений производительности.Фактически, в любой системе Linux, которая работала в течение некоторого времени, свободная память имеет тенденцию быть близкой к нулю - неиспользованная память - это потерянная память.
Однако кеш-память может быть освобождена ядром, еслинужен другой процесс.Хотя это в определенной степени повлияет на производительность ввода-вывода, другие процессы могут иметь больше памяти без использования пространства подкачки .Поэтому для большинства целей и задач эта память свободна .
Именно поэтому free
включает в себя вторую строку, где кэш-память считается свободной:
-/+ buffers/cache: 4254224 3941060
Эта вторая строка - это то, на что люди должны смотреть, когда они хотят знать, достаточно ли у них свободной памяти для определенной цели.
В приведенном выше примере, согласно строке Mem:
, имеется ~ 57МБ свободной памяти.Однако, если кто-то читает вторую строку, на самом деле существует около 3,9 ГБ , которые можно использовать без принудительной замены активных процессов.Кроме того, имеется около 760 МБ редко используемых данных, которые были выгружены, чтобы освободить место в основной памяти для процессов и кэширования.
Примерно в то же время содержимое /proc/meminfo
:
MemTotal: 8195284 kB
MemFree: 57660 kB
Buffers: 1232352 kB
Cached: 2651156 kB
SwapCached: 119936 kB
.
.
.
MemTotal
: доступная физическая память, обнаруженная ядром.
MemFree
: неиспользуемая физическая память - свободная память, показанная в строке Mem:
из free
.
Buffers
: относительно временное хранение блоков необработанного диска.
Cached
: кэш-память в памяти для файлов, считываемых с диска.Он не включает в себя память SwapCached.
SwapCached
: память, которая была когда-то выгружена, затем заменена обратно, но все еще находится в пространстве подкачки.При необходимости его содержимое может быть просто отброшено (очень быстро!) Без необходимости их замены (медленнее).
Таким образом, для получения полуточной оценки фактически доступной памяти
MemFree + Buffers + Cached + SwapCached
является хорошей отправной точкой - и тот, который free
показывает во второй строке.
Естественно, управление памятью и связанные с ней статистика и измерения более сложны, чем эта.Числа, показанные free
, в лучшем случае являются лишь приблизительными оценками, поскольку существует множество других переменных, которые необходимо учитывать, если вы хотите углубиться.Для людей, которые регулярно проводят оптимизацию использования памяти, это почти искусство.
РЕДАКТИРОВАТЬ:
Несколько юмористическая ссылка об этой "проблеме":
http://www.linuxatemyram.com/
РЕДАКТИРОВАТЬ 2:
Чтобы подтвердить комментарий об анализе использования памяти, который является почти искусством:
Даже free
пропускает большую часть кешируемых данных в современном Linuxсистемы.С /proc/meminfo
в моей системе:
SReclaimable: 2253576 kB
Это около 2 ГБ памяти, используемой системой slab распределитель для кэширования записей каталога и т. Д., И его можно восстановить (т. Е. Он может быть очищен и использован процессами при необходимости). Тем не менее, free
не считает его кэш-памятью и не вводит его в какие-либо вычисления, поэтому он отображается как использованная память.
Утилита slabtop
, если она доступна, позволяет системному администратору выяснить, для чего используется кэш slab .
Способ (только для пользователя root), чтобы free
показывал фактическое использование памяти системой, следующий:
# swapoff -a
# sync
# echo 3 > /proc/sys/vm/drop_caches
# free
total used free shared buffers cached
Mem: 8195284 3181468 5013816 0 8656 228832
-/+ buffers/cache: 2943980 5251304
Swap: 0 0 0
# swapon -a
Первая команда отключает пространство подкачки. Он не должен выдаваться, если доступной памяти может быть недостаточно для хранения данных, которые были выгружены, - в этом случае в расчетах использования памяти необходимо учитывать строку Swap:
free.
Вторая команда выталкивает все буферизованные данные на диск. Это позволяет освободить больше кэш-памяти на следующем шаге.
Третья команда является самой важной из набора - она заставляет ядро отбрасывать как можно больше кэшированных данных (кеш страниц, записи каталога, иноды и т. Д.).
Затем free
наконец показывает, что на самом деле используют запущенные процессы в своей строке -/+ buffers/cache:
. Весьма заметно, что даже после удаления всех кэшированных данных ядро быстро снова начинает кэширование - в этом случае оно уже достигло почти 250 МБ кэшированных данных в течение нескольких секунд.
Последняя команда снова включает пространство подкачки - это необходимо, только если первая команда также использовалась.
Следует отметить, что эти команды должны выполняться пользователем root для получения необходимых привилегий.