Смотрите на available, а не на free
Linux использует незанятую память как дисковый кэш, поэтому малый объём свободной памяти на исправном сервере — нормальное явление. Столбец available — это оценка ядром объёма памяти, который можно выделить новым задачам без обращения к swap. Следите именно за этим числом. Точный расчёт used зависит от версии утилиты, поэтому не сравнивайте его между разными системами.
free -h
grep -E 'MemAvailable|Shmem:|SReclaimable' /proc/meminfoЧто в кэше можно и нельзя освободить
Страничный кэш обычно можно освободить, когда приложениям требуется память. Разделяемая память и tmpfs (Shmem) тоже отображаются в cache, но просто отбросить их нельзя: они содержат данные, копии которых нет на диске. Поэтому большой кэш при малом объёме доступной памяти часто означает большой tmpfs или сегмент разделяемой памяти.
df -h -t tmpfs
sudo slabtop -o | head -15Занятый swap сам по себе не проблема
Сервер может неделями без вреда хранить редко используемые страницы в swap. Проблемы вызывает непрерывное перемещение. Следите за столбцами si и so в vmstat: значения, постоянно превышающие ноль, означают активный обмен между памятью и swap, что указывает на реальную нехватку памяти.
swapon --show
vmstat 1 5Найдите потребителей памяти
Отсортируйте процессы по резидентной памяти. RSS учитывает общие для нескольких процессов страницы у каждого из них, поэтому значения нескольких процессов нельзя просто сложить. Утилиты с поддержкой PSS, например smem, дают более корректную сумму, если они установлены.
ps -eo pid,user,rss,comm --sort=-rss | head -15Как распознать реальную нехватку
Признаки — мало доступной памяти, постоянный обмен с swap и процессы, завершённые механизмом out-of-memory killer. Проверьте журнал ядра. Не запускайте drop_caches ради более красивых показателей: это лишь заставит сервер снова читать с диска и ничего не решит.
sudo journalctl -k --no-pager | grep -iE 'out of memory|oom-kill'Память в CH-J Server Manager
System Monitor считывает эти значения по SSH. В Linux used определяется как MemTotal − MemFree − Buffers − Cached − SReclaimable, а available — как оценка ядра. Разделяемая память входит в Cached и не подлежит освобождению; категории на полосе не пересекаются. Поскольку формула отличается от используемой в некоторых версиях free, числа могут не совпадать в точности. Также отображается swap с историей использования. ZFS ARC отдельно не учитывается, поэтому на хостах с ZFS он считается занятой памятью.