Почему у сервера «свободно» всего 372 МБ и стоит ли волноваться. Разбираем free -h, available, кэш и своп на живом выводе.
Вы запускаете free -h на сервере с 2 ГБ памяти и видите: свободно всего 372 МБ. Кажется, пора увеличивать тариф. Но чаще всего с сервером всё в порядке: Linux намеренно занимает свободную память под кэш. Разберём команду на живом выводе и покажем, на какой столбец смотреть, а какой можно не бояться.
Коротко. Смотрите на столбец
available, а не наfree: он показывает, сколько памяти реально можно отдать программам.buff/cache- это дисковый кэш, ядро освободит его, как только понадобится память. Тревожные признаки:availableдолго держится у нуля и вvmstatпостоянно ненулевыеsiиso(своп работает). Найти виновника поможетpsс сортировкой по памяти.
Что показывает free -h
Команда free выводит сводку по оперативной памяти и свопу. Ключ -h печатает размеры понятными единицами (МБ, ГБ), а не байтами. Вот ответ нашего сервера:
Читаем по столбцам. total - вся память. used - занята программами. free - вообще ничем не занята. shared - память, которую делят процессы (у нас пустяк). buff/cache - кэш файлов и буферы. available - оценка ядра, сколько можно выдать новым программам, не вытесняя их в своп. Строка Swap - файл или раздел подкачки на диске.
Куда делась «свободная» память
Из 1,9 ГБ у нас занято программами лишь 609 МБ, а 1,2 ГБ лежит в buff/cache. Это не потеря: ядро держит там недавно прочитанные файлы, чтобы не читать их с диска второй раз. Если программе понадобится память, кэш сразу уменьшится. Поэтому «свободной» памяти у здорового сервера почти всегда мало, а available заметно больше. Те же числа можно увидеть в системном файле:
Здесь размеры в килобайтах. MemAvailable примерно равен MemFree плюс та часть кэша, которую можно вернуть. Точная формула сложнее: ядро оставляет себе небольшой запас, поэтому полностью считать «руками» не нужно, берите готовое значение.
Когда памяти правда не хватает
Есть три признака. Первый: available стабильно ниже 10% от total. Второй: в строке Swap занято много и число растёт. Третий, самый надёжный: система активно перекладывает данные между памятью и диском. Это видно в vmstat, который печатает статистику раз в секунду три раза:
Нас интересуют столбцы si (данные читаются из свопа в память) и so (данные уходят из памяти в своп). У нас везде нули: сервер не подкачивает. Если оба столбца показывают сотни и не затихают, а процессор простаивает в ожидании диска (столбец wa растёт), памяти действительно мало. Занятые 780 КБ свопа при этом ничего не значат: ядро могло вытеснить пару давно не нужных страниц.
Как найти, что съело память
Выведем пять самых «толстых» процессов. -e берёт все процессы, -o задаёт столбцы, --sort=-rss ставит самые большие первыми, head оставляет начало списка:
Столбец RSS - память процесса в килобайтах, %MEM - доля от всей памяти. Самый большой потребитель на нашем сервере держит 190 МБ, это около десятой части. Если у вас один процесс занимает половину памяти и растёт от часа к часу, это утечка: ищите её в приложении, а не в тарифе.
Быстрая проверка одной строкой
Чтобы не разбирать таблицу глазами, можно вывести одно число: долю доступной памяти. free -m печатает размеры в мегабайтах, awk берёт вторую строку (Mem) и делит седьмой столбец (available) на второй (total):
Замер сделан через несколько минут после первых, поэтому цифры чуть отличаются от таблицы выше. Если число держится ниже 10%, это повод заняться памятью. Такую строку удобно положить в скрипт мониторинга или проверять ею сервер по cron.
Нужно ли чистить кэш вручную
В интернете советуют команду echo 3 > /proc/sys/vm/drop_caches, чтобы «освободить память». Делать так не стоит. Кэш не лишний: он ускоряет чтение, и ядро и так отдаёт его мгновенно, когда нужна память. После ручного сброса сервер лишь на время станет медленнее, потому что файлы придётся читать с диска заново. Освободить память по-настоящему можно только остановив лишнюю программу или увеличив тариф.
Частые вопросы
Что значит available в free?
Это оценка ядра: сколько памяти можно выдать новым программам без обращения к свопу. Она учитывает ту часть кэша, которую система готова вернуть. Именно это число показывает, хватает ли вам памяти.
Почему почти вся память занята?
Потому что Linux использует свободную память под кэш файлов. Это нормально и полезно. Тревожно, когда мал не free, а available.
Сколько свопа считать нормой?
Небольшое число, как наши 780 КБ из 1 ГБ, ничего не значит. Тревожит, когда своп занят в основном и si с so в vmstat постоянно ненулевые.
Как понять, что памяти не хватает именно серверу, а не программе?
Если available мал у всей системы и много процессов по чуть-чуть, нужен больший тариф. Если один процесс съел почти всё и растёт, ищите ошибку в нём.
Итог
free -hсмотрим по столбцуavailable, а неfree.buff/cache- дисковый кэш, ядро вернёт его, когда понадобится память.- Своп работает, если в
vmstat 1 3столбцыsiиsoдержатся выше нуля. - Виновника ищем командой
ps -eo pid,comm,%mem,rss --sort=-rss | head -6. - Кэш вручную не сбрасываем: это замедляет сервер и не лечит нехватку.
🎁 -40% на первый месяц нового VPS. Промокод GUIDE40
Хотите посмотреть на память живого сервера? Первый месяц со скидкой.
ВведитеGUIDE40при оформлении заказа. Работает один раз на клиента.
Выбрать VPS и забрать скидку →
