Хотите знать, достаточно ли памяти на компьютере с Linux для развертывания нового приложения? - PullRequest
41 голосов
/ 24 сентября 2010

У меня есть машина с 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 ГБ, и у меня есть приложение для развертывания на нем, которое будет иметь 3 экземпляра jvm, а общая потребность в памяти для них будет близка к 1 ГБ.

Я хотел знать, будет ли безопасно развертывать это приложение, не затрагивая другие приложения, в настоящее время работающие на этом компьютере. Глядя на приведенный выше снимок памяти, мы можем узнать?

Какие еще статистические данные помогут мне решить это и как собирать эти статистические данные?

1 Ответ

128 голосов
/ 11 декабря 2010

(возможно, уже немного поздно для ОП, но об этом спрашивают довольно часто, поэтому я попробую)

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 для получения необходимых привилегий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...