Хотите узнать, достаточно ли свободного места на Linux-машине для развертывания нового приложения

У меня есть 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, чтобы иметь необходимые привилегии.