Ответ
Виртуальная память процесса (VSZ - Virtual Memory Size) включает всю память, которую процесс запросил у ядра: код, данные, стек, heap, разделяемые библиотеки и отображенные файлы. Вот как её мониторить.
1. Команда ps (наиболее часто используется):
# Показать VSZ для всех процессов (в килобайтах)
ps aux
# Колонки в выводе ps aux:
# USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
# VSZ - виртуальный размер, RSS - резидентный размер в RAM
# Показать только конкретный процесс с человеко-читаемым форматом
ps -p <PID> -o pid,user,vsz,rss,comm --size
# Показать VSZ в мегабайтах
ps -p <PID> -o pid,vsz=VSZ_KB,rss=RSS_KB,comm --size | awk 'NR>1 {print $1, $2/1024"MB", $3/1024"MB", $4}'
2. Команда top / htop:
# Запустить top, отсортировать по виртуальной памяти (нажмите 'M' для сортировки по резидентной памяти)
top
# В htop можно добавить колонку VSZ:
# F2 -> Setup -> Columns -> Available: VIRT (это VSZ)
# Запустить top для конкретного процесса
top -p <PID>
3. Прямой доступ через procfs:
# Самый точный метод - чтение из /proc
cat /proc/<PID>/status | grep -E "VmSize|VmRSS"
# Пример вывода:
# VmSize: 246832 kB # Виртуальная память
# VmRSS: 15368 kB # Резидентная память в RAM
# Альтернативно:
grep -E "VmSize|VmRSS" /proc/<PID>/status
# Получить только числовое значение VSZ в килобайтах
grep VmSize /proc/<PID>/status | awk '{print $2}'
4. Специализированные утилиты:
# Использование pmap для детального анализа
pmap <PID> | tail -1 # Последняя строка показывает итоговый размер
# Пример вывода pmap:
# total 246832K
# Использование smem для расширенной аналитики
smem -p -P <process_name>
5. Практические скрипты для мониторинга:
#!/bin/bash
# Мониторинг VSZ процесса с алармами
PID=$(pgrep -f "my_application")
THRESHOLD_MB=1024 # 1GB
if [ -n "$PID" ]; then
VSZ_KB=$(grep VmSize /proc/$PID/status | awk '{print $2}')
VSZ_MB=$((VSZ_KB / 1024))
echo "Process $PID: VSZ = ${VSZ_MB}MB"
if [ $VSZ_MB -gt $THRESHOLD_MB ]; then
echo "ALERT: VSZ превышает ${THRESHOLD_MB}MB!"
# Отправить алерт, дамп памяти и т.д.
fi
else
echo "Процесс не найден"
fi
6. Интерпретация значений:
- VSZ (VIRT): Вся виртуальная память, включая отображенные файлы и разделяемые библиотеки
- RSS (RES): Фактическая резидентная память в RAM
- Разница VSZ - RSS: Память, отображенная, но не загруженная в RAM (например, код библиотек, отображенные файлы)
DevOps применение:
- Мониторинг утечек памяти (постоянный рост VSZ)
- Настройка лимитов через
ulimit -vили cgroups - Анализ перед масштабированием приложения
- Диагностика проблем с отображением больших файлов в память (mmap)