Статья переведена. Оригинал доступен по ссылке

Файловая система /proc — это виртуальная файловая система. Она не хранится на диске, а создается в памяти и используется для предоставления информации о системе (первоначально о процессах, отсюда и название).

Из /proc/meminfo можно получить информацию о свободной памяти, об используемой (и физической, и swap), а также о разделяемой (shared memory) и буферах.

Подробно файловая система /proc описана в man.

Пример вывода:

# cat /proc/meminfo
MemTotal: 16344972 kB
MemFree: 13634064 kB
Buffers: 3656 kB
Cached: 1195708 kB
SwapCached: 0 kB
Active: 891636 kB
Inactive: 1077224 kB
HighTotal: 15597528 kB
HighFree: 13629632 kB
LowTotal: 747444 kB
LowFree: 4432 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 968 kB
Writeback: 0 kB
Mapped: 280372 kB
Slab: 684068 kB
Committed_AS: 1576424 kB
PageTables: 24448 kB
ReverseMaps: 1080904
VmallocTotal: 112216 kB
VmallocUsed: 428 kB
VmallocChunk: 111088 kB

Другой пример:

$ cat /proc/meminfo
MemTotal: 16464260 kB
MemFree: 5206868 kB
Buffers: 17980 kB
Cached: 7395552 kB
SwapCached: 114124 kB
Active: 5590956 kB
Inactive: 4426264 kB
Active(anon): 2191992 kB
Inactive(anon): 416676 kB
Active(file): 3398964 kB
Inactive(file): 4009588 kB
Unevictable: 32204 kB
Mlocked: 13808 kB
SwapTotal: 2096476 kB
SwapFree: 1264996 kB
Dirty: 144 kB
Writeback: 0 kB
AnonPages: 2547488 kB
Mapped: 55404 kB
Shmem: 56 kB
Slab: 956820 kB
SReclaimable: 884568 kB
SUnreclaim: 72252 kB
KernelStack: 4792 kB
PageTables: 44052 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 10328604 kB
Committed_AS: 3304140 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 307816 kB
VmallocChunk: 34359426296 kB
HardwareCorrupted: 0 kB
AnonHugePages: 1689600 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 7488 kB
DirectMap2M: 16764928 kB

Сначала посмотрим показатели, на которые следует обращать внимание в первую очередь.

Основные показатели

MemTotal : доступный объем оперативной памяти (физическая память за вычетом нескольких зарезервированных битов и бинарного кода ядра).

MemFree : Сумма LowFree и HighFree.

MemShared : 0; приведен здесь из соображений совместимости и всегда равен нулю.

Buffers : память в буферном кеше. В настоящее время бесполезен в качестве метрики. Это временное хранилище для страниц, ожидающих записи на диск. Не должно быть слишком большим (обычно около 20 МБ).

Cached : память в кэше страниц за вычетом SwapCache.

SwapCache: память, которая когда-то была выгружена в своп, но потом загружена обратно и все еще находится в файле подкачки. Если будет необходимость в выделении памяти, то эту память не нужно будет выгружать повторно, так как она уже находится в свопе. Это экономит операции ввода-вывода.

Прочие показатели

Cтраницы кэша делятся на "активные" и "неактивные". Идея заключается в том, что если вам нужна память и ее можно взять из кэша, то она будет забрана из неактивных страниц, поскольку ожидается, что она больше не будет использоваться. Подсистема виртуальной памяти постоянно отслеживает, какая память используется, и отмечает это в таблице страниц (pagetable) специальным битом.

Страницы также могут перемещаться обратно в активные. Активные страницы упорядочены в порядке "не использовалась дольше всех" (хотя это очень грубо и в реальности все немного сложнее). Давно не использованные страницы можно переместить в неактивные. В приведенном выше примере неактивная память разделена на две части. Иногда она разбивается на три.

Active : память, которая использовалась совсем недавно. Обычно не освобождается без крайней необходимости.

Inact_dirty : "грязная" означает, что "необходима запись на диск или в своп". Для ее освобождения требуется больше работы. Здесь могут быть файлы, которые еще не записаны на диск. Операции записи на диск происходят не сразу, чтобы не снижать производительность ввода-вывода. Например, если вы пишете логи, то, возможно, лучше подождать, пока у вас будет готова полная запись лога, прежде чем отправлять ее на диск.

Inact_clean: память, которую можно легко освободить. Ядро пытается сохранить немного чистых страниц, чтобы было проще "дышать".

Inact_target : целевая метрика, которую ядро использует, чтобы убедиться, в достаточном количестве неактивных страниц. При превышении этого значения ядро не будет перемещать страницы из активного состояния в неактивное. Страница может стать неактивной разными способами. Например, если вы выполняете длительный последовательный ввод-вывод, то ядро предполагает, что вы не собираетесь использовать эту память, и делает ее неактивной превентивно. Таким образом, вы можете получить больше неактивных страниц, чем целевое значение, потому что ядро помечает некоторый кэш как "скорее всего, никогда не будет использоваться" и позволяет обмануть порядок "использовался последним".

Статистика памяти

HighTotal : размер области верхней памяти. Область верхней памяти (highmem) - это вся память, выше (приблизительно) 860 МБ физической ОЗУ. Доступ к этой памяти осуществляется через косвенные механизмы доступа. Здесь может находиться кэш данных.

LowTotal: общий объем памяти без highmem-памяти.

LowFree : объем свободной памяти в нижней области памяти. Это память, к которой ядро может обращаться напрямую. Все структуры данных ядра должны находиться этой области.

SwapTotal : общий физический размер свопинга.

SwapFree : количество свободной памяти в свопинге. Swap - память, которая была выгружена из ОЗУ и временно находится на диске.

Dirty : память, ожидающая записи на диск.

Writeback: память, которая в настоящий момент записывается на диск.

Mapped : отображаемые в память файлы с помощью mmaped, например, библиотеки.

Slab : кеш внутренних структур ядра.

Committed_AS: оценка объема оперативной памяти, необходимой для 99,99% гарантии того, что для текущей нагрузки системы не будет OOM (out of memory, нехватки памяти). Обычно ядро позволяет выделять больше памяти, чем доступно в системе (overcommit). Например, при выделении 1 ГБ памяти через malloc, на самом деле ничего не происходит. Только когда вы начнете ИСПОЛЬЗОВАТЬ эту память, вам выделят столько памяти, сколько вы будете использовать. То есть вы берете ипотеку и надеетесь, что банк не разорится. Также могут быть случаи, когда вы используете mmap файл, который используется только при записи в него, и вы получаете приватную копию этих данных. Хотя обычно они разделяются между процессами. Committed_AS - это приблизительная оценка того, сколько памяти / свопинга вам понадобится в худшем случае.

PageTables : объем памяти, выделенный для таблиц страниц.

ReverseMaps : количество выполненных обратных отображений.

VmallocTotal : общий размер области памяти vmalloc.

VmallocUsed : используемая память vmalloc.

VmallocChunk : самый большой свободный непрерывный блок в области vmalloc.

Оценка использования ресурсов, особенно потребления памяти, намного сложнее, чем может показаться на первый взгляд. Неиспользуемый ресурс - это ресурс, потраченный впустую. Поэтому ядро старается использовать столько оперативной памяти, сколько может для кэширования информации с локальных и удаленных файловых систем и дисков. Кэш наполняется постепенно по мере выполнения операций чтения и записи, пытаясь сохранить данные, хранящиеся в ОЗУ, как можно более актуальными для процессов, запущенных в системе. При наличии свободной оперативной памяти будет выполняться больше кэширования и, следовательно, будет "потребляться" больше памяти. Однако на самом деле это не считается использованием ресурсов, поскольку эта память с кэшем доступна для процессов в любой момент. Кэш освобождается не при завершении процесса (возможно, появится другой процесс, которому нужны те же данные), а по запросу.

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

Обычно системной информации о памяти можно доверять, но даже она может быть легко истолкована неверно. Например, посмотрим на top.

00 processes: 397 sleeping, 2 running, 1 zombie, 0 stopped
CPU0 states: 0.1% user, 0.3% system, 0.0% nice, 99.1% idle
CPU1 states: 0.3% user, 2.0% system, 0.0% nice, 97.1% idle
CPU2 states: 2.3% user, 8.1% system, 0.0% nice, 88.4% idle
CPU3 states: 100.0% user, 0.0% system, 0.0% nice, 0.0% idle
Mem: 16167672K av, 16124948K used, 42724K free, 1710184K shrd, 351304K buff
Swap: 12582608K av, 15892K used, 12566716K free 13326028K cache

Другой пример:

top - 05:49:20 up 59 days, 19:01, 36 users,  load average: 3.00, 3.05, 3.01
Tasks: 344 total,   3 running, 340 sleeping,   0 stopped,   1 zombie
Cpu(s):  7.0%us, 27.8%sy,  0.0%ni, 64.7%id,  0.4%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:  16464260k total, 11263872k used,  5200388k free,    18148k buffers
Swap:  2096476k total,   831480k used,  1264996k free,  7400016k cached

Что может сбить с толку, так это буфер и кэш:

Mem: 16167672K av, 16124948K used, 42724K free, 1710184K shrd, 351304K buff
Swap: 12582608K av, 15892K used, 12566716K free 13326028K cache

Можно увидеть, что используется 16124948K, но почти все эти 15 ГБ используются под кэш и буфер, и в случае, если память потребуется другому процессу, то она будет немедленно освобождена.

$ free
total used free shared buffers cached
Mem: 16167672 16129820 37852 1710184 351312 13330324
-/+ buffers/cache: 2448184 13719488
Swap: 12582608 15892 12566716
Looking at the third line:
-/+ buffers/cache: 2448184 13719488

Система использует 2448184 КБ (= 2 ГБ) для приложений / процессов, при этом потенциально свободно 13 ГБ, используемой для буферизации и кэширования. Для оценки потребления памяти процессом, вы должны использовать команду free до, во время и после запуска процесса, проделывая это несколько раз, чтобы получить среднее значение оцениваемого показателя.

Для получения информации о потреблении памяти конкретного процесса можно использовать следующие команды:

$ cat /proc/<pid>/maps
...
$ cat /proc/<pid>/status

Материал подготовлен в рамках старта набора на специализацию "Administrator Linux".

Всех, кто хочет с нуля научиться управлять серверами и развиваться как системный / инфраструктурный инженер или DevOps-инженер приглашаем на страницу курса для более подробного ознакомления с программой и процессом обучения.

- УЗНАТЬ ПОДРОБНЕЕ ПРО СПЕЦИАЛИЗАЦИЮ

Статья переведена. Оригинал доступен по ссылке