Определение простыми словами
Команда free читает /proc/meminfo и выводит сводку: сколько памяти всего, сколько занято процессами, сколько кешируется, сколько в swap. Главное число для админа — available: сколько RAM можно отдать новым процессам без вытеснения чужих данных. Колонка free часто маленькая, но это не повод для паники: Linux агрессивно использует свободную память под disk cache.
В отличие от htop, free выдаёт срез на момент вызова и подходит для скриптов и cron-алертов. Совместно с vmstat и /proc/pressure/memory покрывает 90% задач по диагностике RAM-проблем.
Сравнение колонок free -h
| Колонка | Что значит | Когда смотреть |
|---|---|---|
| total | Вся физическая RAM | Capacity planning |
| used | Занято процессами + ядром | Всегда |
| free | Совсем не использована | Почти не информативна |
| shared | tmpfs, разделяемая память | Подозрение на /dev/shm |
| buff/cache | Disk-кеш ядра | Для понимания «псевдо-used» |
| available | Реально доступно процессам | Главная метрика |
Кейсы использования
- Алерт «available < 10% от total на протяжении 5 минут» — гораздо точнее, чем «free < 100 MB», потому что учитывает кеш. Часто связан с ростом Load Average.
- Swap usage растёт при available > 0 → проблема в vm.swappiness, можно понизить до 10 без потери производительности.
- Проверка перед деплоем: free -m показывает 200 MB available, новый Java-сервис требует 512 MB → не запускайте, увеличьте VPS или закройте лишнее.
- Negative-сценарий: алерт настроен на свободную память (free), считает кеш «утечкой», ложно срабатывает каждые 10 минут. Бесполезный шум.
- Для VPS: free показывает память контейнера (cgroup memory.limit), а не всю ноду. Полезно для понимания реального лимита от хостера.
Технические детали
# Основной вызов с человекочитаемыми единицами
free -h
# total used free shared buff/cache available
# Mem: 7.7Gi 1.2Gi 3.4Gi 128Mi 3.1Gi 6.0Gi
# Swap: 2.0Gi 0B 2.0Gi
# В мегабайтах для скриптов
free -m
# С обновлением каждые 2 секунды (как top)
free -h -s 2
# Алерт через cron + bc
* * * * * MEM=$(free | awk '/Mem:/ {print int($7/$2*100)}');
[ "$MEM" -lt 10 ] && echo "low memory: ${MEM}%" | mail admin
# Очистка кешей (диагностика, не для прода под нагрузкой)
sync && echo 3 > /proc/sys/vm/drop_caches
free -h
# Понижение агрессивности swap
sysctl vm.swappiness=10
echo "vm.swappiness=10" >> /etc/sysctl.d/99-mem.conf
# Источник данных
cat /proc/meminfo | head -5
Главный совет: смотрите available, а не free. Linux всегда «занимает» свободную RAM под page cache, потому что пустая память — потерянная память. available показывает, сколько ядро готово быстро отдать новому процессу без принудительного swap-out. Это та цифра, на которой строятся все нормальные алерты.
🔥 Где это применяется
Частые вопросы
Почему free показывает мало свободной памяти?
Linux забирает свободную RAM под disk cache (buff/cache), это не утечка. Смотрите колонку available — это реально доступная память для новых процессов с учётом сбрасываемого кеша.
В чём разница total в free и реальной памяти ноды?
На VPS free показывает память контейнера (cgroup memory.limit), а не всей физической ноды хостера. Это лимит вашего инстанса, и больше него процессы не получат.
Как настроить алерт по памяти правильно?
По проценту available к total: «available < 10% за 5 минут». Алерт по free даёт ложные срабатывания, потому что Linux агрессивно кеширует диск и free всегда низкий.