Многие, особенно после Windows, теряются при анализе памяти в Linux. Диспетчер задач в Win наглядно показывает, сколько ОЗУ занято, сколько свободно - всё просто. В Linux же понимание, что и сколько потребляет, требует большего погружения.
Разберемся на примере анализа потребления памяти процессом, например, nginx или php-fpm.
1️⃣ Находим PID процесса
ps ax | grep nginx
Допустим, PID мастер-процесса - 1947.
2️⃣ Используем pmap. Эта утилита показывает, какие участки памяти использует процесс и сколько они занимают.
📍 Виртуальная память (VIRT/VSZ):
pmap 1947 -p
Внизу увидим итоговое значение виртуальной памяти - все, включая разделяемые библиотеки и даже то, что может быть в swap. Для многопроцессных сервисов (как nginx) эта цифра будет одинаковой у всех дочерних процессов. Поэтому она мало информативна в отрыве от контекста.
📍 Резидентная память (RES/RSS):
pmap 1947 -x
Это объем оперативной памяти, реально занятой процессом (без учета swap). Но и тут не всё идеально - при наличии форков каждый из них покажет одинаковую RSS, хотя они могут разделять память.
📍 Приватная память:
pmap 1947 -d
А вот здесь интересно: writeable/private показывает именно ту часть памяти, которую процесс использует исключительно сам. Без общих библиотек и форков. Это значение важно при планировании числа одновременно работающих процессов (например, php-fpm).
❓ Как применять эти данные?
Если планируешь запустить 50 PHP-процессов, и каждый из них использует ~30 МБ приватной памяти, нужно минимум 1.5 ГБ ОЗУ только под них. А ещё есть сама ОС, веб-сервер, БД и кэш - нужно считать с запасом, иначе словишь oom-killer.
❓ Где берёт данные pmap?
Из
/proc/<PID>/smaps, но pmap красиво их парсит. Хочешь больше деталей - загляни туда напрямую.
cat /proc/1947/smaps
Анализ потребления памяти в Linux - это не только
top или htop. Используй pmap, чтобы понять реальное потребление и не попасть в просак при настройке сервисов.#linux #memory
🧑💻 NetworkAdmin