Как анализировать вывод /proc/meminfo в Linux

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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

Файловая система /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-инженер приглашаем на страницу курса для более подробного ознакомления с программой и процессом обучения.

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

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

Источник: https://habr.com/ru/company/otus/blog/565494/


Интересные статьи

Интересные статьи

В более ранней публикации  компания Google объявила, что в Android теперь поддерживается язык программирования Rust, применяемый в разработке этой ОС как таковой. В связи с этим автор...
Продать новую идею может быть тяжело, особенно в случае, если аудитория может ее не принять. Возможно, ей интересно было бы попробовать новый продукт, но только если усилия окажутся мин...
Давно уже на Хабре не было новостей про неттопы от SolidRun, которые выпускаются под брендом CuBox. На этот раз компания выпустила нового малютку, который получил название CuBox-M. Он о...
Ещё в августе 2019 года я проводил конкурс Sing-Along Week по синхронизации MIDI-файла с речевым синтезатором, который поёт песню. На своём складе я нашел MIDI-карту MQX-32M (клон R...
Предупреждение: эта статья относится ко всем CoW файловым системам в Linux, поддерживающим reflink при копировании. В данный момент это: BTRFS, XFS и OCFS2. Прошу воздержаться от холиваров...