У меня есть Linux-машина с моментальным снимком памяти, когда я делаю /proc/meminfo:
MemTotal: 16413388 kB
**MemFree: 48296 kB**
Buffers: 193600 kB
Cached: 1986448 kB
SwapCached: 874512 kB
Active: 15034264 kB
Inactive: 713672 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 16413388 kB
LowFree: 48296 kB
SwapTotal: 8385920 kB
SwapFree: 4682408 kB
Dirty: 3124 kB
Writeback: 0 kB
Mapped: 13005560 kB
Slab: 257784 kB
CommitLimit: 16592612 kB
Committed_AS: 59624324 kB
PageTables: 233748 kB
VmallocTotal: 536870911 kB
VmallocUsed: 267064 kB
VmallocChunk: 536603555 kB
HugePages_Total: 0
HugePages_Free: 0
Hugepagesize: 2048 kB
Это 16-гигабайтный компьютер, и у меня есть приложение Java для развертывания на нем, которое будет иметь 3 экземпляра jvm, а общая потребность в них для них будет близка к 1 ГБ.
Я хотел знать, будет ли безопасно развертывать это приложение, не затрагивая другие приложения, которые в настоящее время работают на этом компьютере. Посмотрев на вышеупомянутый снимок памяти, мы можем узнать?
Какие другие статистические данные помогут мне решить, как и как собирать эти статистические данные?
Ответ 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:
Несколько юмористическая ссылка об этой "проблеме":
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:
в расчетах использования памяти.
Вторая команда нажимает на диск все буферизованные данные. Это позволяет освободить больше кэш-памяти на следующем шаге.
Третья команда является самой важной из множества - она заставляет ядро отбрасывать как можно больше кэшированных данных (кеш страниц, записи каталога, inodes и т.д.).
Затем free
наконец показывает, какие запущенные процессы фактически используют в своей строке -/+ buffers/cache:
. Весьма заметно, что даже после удаления всех кэшированных данных ядро снова начинает кэширование - в этом случае он уже достиг почти 250 МБ кэшированных данных за несколько секунд.
Последняя команда снова включает пространство подкачки - это необходимо, только если была использована первая команда.
Следует отметить, что эти команды должны выполняться пользователем root, чтобы иметь необходимые привилегии.