Как узнать, сколько виртуальной памяти (VSZ) использует процесс в Linux?

«Как узнать, сколько виртуальной памяти (VSZ) использует процесс в Linux?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Виртуальная память процесса (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)