
Почему Linux-серверу не хватает памяти: RAM, swap и OOM
Разбираем MemAvailable, RSS, swap и OOM killer: как диагностировать нехватку памяти Linux, безопасно добавить swap и не скрыть утечку.
Содержание
Высокое использование RAM само по себе не доказывает проблему: Linux заполняет свободную память полезным кешем. Тревожная комбинация — низкий MemAvailable, устойчивый swap I/O, рост задержек, завершение процессов или записи OOM в журнале.
Сначала определите, действительно ли память заканчивается. Низкое значение free само по себе нормально: Linux использует незанятую RAM как файловый кеш. Проблему подтверждают низкий available, постоянная работа со swap, рост задержек или запись OOM о принудительном завершении процесса.
Как Linux использует память
Строка free в выводе free -h часто мала, потому что ядро кеширует файлы. Этот кеш ускоряет повторные чтения и обычно может быть освобождён. Поле available оценивает, сколько памяти можно предоставить новым приложениям без активного вытеснения в swap.
Сравните сводку free с основными полями ядра. Обе команды только читают состояние и не освобождают память:
free -h
grep -E 'MemTotal|MemAvailable|Cached|SwapTotal|SwapFree' /proc/meminfo
Не очищайте кеши командами из случайной инструкции. Это временно ухудшит работу и не исправит потребление процесса. Сравнивайте значения во времени и с реальной задержкой сервиса.
Зафиксируйте симптомы
Зафиксируйте время, общую память, действующий swap и двадцать крупнейших потребителей RAM. Все четыре команды читают состояние и не перезапускают приложение:
date --iso-8601=seconds
free -h
swapon --show --output=NAME,TYPE,SIZE,USED,PRIO
ps -eo pid,ppid,user,%mem,rss,vsz,stat,comm --sort=-rss | head -n 20
RSS приблизительно показывает резидентную память процесса, но сумма RSS может переоценивать общие разделяемые страницы. VSZ — виртуальное адресное пространство, а не объём занятой RAM. Для решения ищите динамику: какой процесс растёт, после какого запроса или релиза и возвращается ли потребление к норме.
Если сервер отвечает, не перезапускайте главный процесс до сбора данных. Restart освобождает память, но стирает важный симптом.
Найдите OOM killer
Когда ядро не может удовлетворить запрос памяти, механизм OOM выбирает процесс для завершения. Ищите сообщения за нужный период:
sudo journalctl -k --since "today" | grep -Ei 'out of memory|oom-kill|killed process'
sudo journalctl -u myapp.service --since "today"
Отсутствие строки в коротком интервале не исключает более раннее событие. У контейнера или systemd-службы может сработать собственный лимит cgroup без глобального OOM всего узла. Проверьте состояние службы:
systemctl status myapp.service
systemctl show myapp.service -p MemoryCurrent -p MemoryMax
Если приложение работает в контейнере, сопоставьте лимит контейнера и доступную память узла. Не повышайте оба значения автоматически: узлу нужна память для ядра, Nginx, базы и служебных процессов.
Что показывает swap
Swap хранит вытесненные страницы на диске. Небольшое ненулевое использование после прошлого пика не обязательно означает текущую проблему. Важнее рост использования, постоянный ввод-вывод и задержки.
Если доступна vmstat, наблюдайте несколько интервалов:
vmstat 1 10
Колонки si и so показывают обмен со swap. Одиночный снимок слабее серии. На VPS интенсивный swap конкурирует с приложением за I/O, поэтому большой swap может превратить явный отказ в долгую деградацию.
Параметр vm.swappiness влияет на склонность ядра использовать swap, но не имеет универсального идеального значения:
sysctl vm.swappiness
Не меняйте его до измерений. Низкое значение не создаёт дополнительную RAM, а слишком жёсткая настройка способна приблизить OOM при пике.
Как безопасно добавить swap-файл
Этот вариант подходит обычной файловой системе, поддерживающей swap-файлы. Сначала проверьте существующий swap, свободное место и документацию файловой системы. Пример создаёт файл размером 2 GiB; размер должен соответствовать нагрузке и доступному диску:
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
swapon --show
free -h
Не размещайте файл на почти заполненном корне. Команда mkswap применяется только к новому подтверждённому файлу, не к устройству с данными.
После успешной проверки сохраните fstab, затем откройте его редактором:
sudo cp -a /etc/fstab /etc/fstab.before-swap
sudoedit /etc/fstab
Добавьте ровно одну строку, предварительно убедившись, что её ещё нет:
/swapfile none swap sw 0 0
Теперь проверьте синтаксис и ссылки на файловые системы без перезагрузки:
sudo findmnt --verify
Перед перезагрузкой убедитесь, что дубликата нет. Если запись добавляет автоматический скрипт, он должен сначала проверить её наличие, иначе каждый повторный запуск будет портить fstab.
Найдите причину, а не только симптом
Разделите ситуации:
- единичный пик после тяжёлой задачи — ограничьте параллелизм или перенесите задачу;
- монотонный рост процесса — ищите утечку и сравнивайте версии;
- база держит прогнозируемый кеш — проверьте её собственный бюджет памяти;
- приложение превышает cgroup — согласуйте лимит с ёмкостью VPS;
- несколько сервисов по отдельности нормальны, но вместе не помещаются — пересмотрите архитектуру или тариф.
Используйте диагностику процессов и ресурсов и journalctl, а перед изменением диска прочитайте руководство по файловым системам.
Проверка и откат
После исправления наблюдайте MemAvailable, swap I/O, задержки и число рестартов службы в обычный и пиковый период. Запишите исходное значение и критерий успеха.
Чтобы убрать временный swap-файл, сначала убедитесь, что RAM достаточно принять его страницы:
sudo swapoff /swapfile
swapon --show
Только после успешного swapoff удалите соответствующую строку из fstab, проверьте findmnt --verify и затем удалите файл. Если swapoff не хватает памяти, не форсируйте операцию: уменьшите нагрузку или добавьте RAM.
Первоисточники
- proc_meminfo(5) — определения MemAvailable, Cached и полей swap.
- swapon(8) — активация swap и ограничения swap-файлов.
- proc_sys_vm(5) — параметры виртуальной памяти ядра.
Самопроверка
Проверьте, что материал усвоен
Ответьте на все вопросы. Результат сохранится только в этом браузере и будет учтён в статистике прочитанных материалов.
Разбираем коротко
Частые вопросы
Почему Linux показывает мало свободной памяти, хотя сервер работает нормально?
Ядро использует незанятую RAM под файловый кеш и освобождает его при необходимости. Для общей оценки полезнее MemAvailable, а для диагноза нужны RSS процессов, swap, давление на память и события OOM.
Решает ли большой swap проблему нехватки оперативной памяти?
Swap способен смягчить короткий пик и сохранить доступность, но он значительно медленнее RAM. Постоянный активный обмен обычно означает недостаток памяти, неверные лимиты или утечку, которую нужно устранить.
Как узнать, завершал ли ядро процесс из-за OOM?
Проверьте журнал ядра через journalctl -k за нужный период и ищите сообщения Out of memory, oom-kill или Killed process. Сопоставьте время с журналом службы и изменениями нагрузки.


