Ответ 1
(Вероятно, немного поздно для OP, но это задается довольно часто, поэтому я дам ему шанс)
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
, являются в лучшем случае приблизительными оценками, так как есть много других переменных, которые нужно учитывать, если вы хотите глубже. Для людей, которые регулярно выполняют оптимизацию использования памяти, это почти форма искусства.
EDIT:
Несколько юмористическая ссылка об этой "проблеме":
ИЗМЕНИТЬ 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:
в расчетах использования памяти.
Вторая команда нажимает на диск все буферизованные данные. Это позволяет освободить больше кэш-памяти на следующем шаге.
Третья команда является самой важной из множества - она заставляет ядро отбрасывать как можно больше кэшированных данных (кеш страниц, записи каталога, inodes и т.д.).
Затем free
наконец показывает, какие запущенные процессы фактически используют в своей строке -/+ buffers/cache:
. Весьма заметно, что даже после удаления всех кэшированных данных ядро снова начинает кэширование - в этом случае он уже достиг почти 250 МБ кэшированных данных за несколько секунд.
Последняя команда снова включает пространство подкачки - это необходимо, только если была использована первая команда.
Следует отметить, что эти команды должны выполняться пользователем root, чтобы иметь необходимые привилегии.