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

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

Ответ

Анализ использования памяти в Linux требует понимания, что ядро активно использует свободную память для кэширования (cache/buffer), поэтому показатель "free" часто вводит в заблуждение. Ключевой метрикой является available — память, доступная для новых процессов без вытеснения кэша.

Основные команды и их интерпретация:

  1. free -h — быстрый обзор:

    free -h

    Пример вывода и анализ:

                   total        used        free      shared  buff/cache   available
    Mem:            15Gi        4.2Gi       1.1Gi       245Mi        10Gi        10Gi
    Swap:          2.0Gi        0.0Gi       2.0Gi
    • used (4.2Gi): Включает память процессов + часть кэша.
    • buff/cache (10Gi): Память, использованная ядром для дискового кэша и буферов. Она может быть быстро освобождена при необходимости.
    • available (10Gi): Наиболее важный показатель. Оценка памяти, доступной для запуска новых приложений. Она включает free + часть buff/cache.
  2. htop / top — анализ по процессам:

    • htop (интерактивный, с цветом) — мой фаворит. Устанавливается отдельно.
    • Сортирую по %MEM (процент от общей RAM) или RES (resident set size — фактическая физическая память процесса).
    • Смотрю на Mem строку вверху, которая также показывает использование.
  3. Детальная информация (/proc/meminfo): Для скриптов или глубокой диагностики.

    cat /proc/meminfo | grep -E "^(MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree)"

Практический пример — расследование утечки: Если available память постоянно падает:

  1. Запускаю htop и сортирую по %MEM.
  2. Если процесс-виновник неочевиден, использую smem для группировки по пользователю или команде:
    sudo smem -u -s pids
  3. Для профилирования приложения в среде контейнеризации подключаюсь к контейнеру и использую встроенные в язык инструменты (например, jstat для JVM) или смотрю cgroup-лимиты через cat /sys/fs/cgroup/memory/memory.usage_in_bytes.