Слабый VPS: swap-файл и чистка диска в Ubuntu

Дешёвый VPS на 1–2 ГБ памяти и 20 ГБ диска годится для бота, ноды или небольшого сайта, пока не упрётся в одно из двух: кончится память или место. Память кончается внезапно: процесс убивает OOM-killer, сервис падает без объяснений. Место кончается тихо: логи, кеш пакетов и старые образы Docker съедают диск, пока не перестанут писаться базы. Ниже — как добавить swap и что чистить, с проверкой на каждом шаге.

Как посмотреть память и свободное место на диске

Начните с диагностики, чтобы понять, что именно кончается:

free -h        # память и swap
df -h /        # место на корневом разделе
swapon --show  # какой swap уже подключён

Если в free -h колонка available близка к нулю, а swap пустой или нет вовсе — нужен swap. Если df -h показывает 90% и больше — переходите к чистке диска.

Вывод free -h, swapon --show и df -h на VPS с 4 ГБ памяти
Типичный недорогой VPS: 3,8 ГБ памяти, свободно 3,2 ГБ, swap всего 512 МБ, диск 10 ГБ занят на 69%

Что процесс убило из-за нехватки памяти, видно в журнале ядра:

sudo dmesg -T | grep -i "out of memory"

Swap: подушка для памяти

Swap — место на диске, куда система выгружает редко используемые страницы памяти, когда оперативной не хватает. Это медленнее RAM в десятки раз, поэтому swap не заменяет память, а спасает от падения при пиках. Если сервису постоянно не хватает памяти, он будет работать, но тормозить — тогда нужен тариф побольше.

Сколько ставить: на сервере с 1–2 ГБ памяти — 2 ГБ swap, с 4 ГБ — 2–4 ГБ. Учитывайте, что это место вычитается из диска.

Как создать swap-файл

Если swapon --show уже что-то показывает, сначала отключите старый swap и проверьте, как он записан в /etc/fstab (об этом ниже). Если swap нет, сразу создавайте файл:

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

fallocate выделяет место мгновенно. Если swapon ответит ошибкой «swapfile has holes» или «Invalid argument», файловая система такой файл не принимает — удалите его и создайте через dd, он записывает нули на самом деле и работает дольше:

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress

Права 600 обязательны: в swap попадает содержимое памяти, включая пароли и ключи, и читать его должен только root. mkswap ответит строкой вида «Setting up swapspace version 1, size = 2 GiB» — значит, всё в порядке.

Включить при загрузке

После перезагрузки swap сам не подключится, пока его нет в /etc/fstab. Проверьте, нет ли там уже записи, и только потом добавляйте:

grep swap /etc/fstab || echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

grep здесь страхует от повтора: без него каждый запуск tee -a добавит в fstab ещё одну такую же строку.

Как увеличить swap

Увеличить работающий swap-файл нельзя — его отключают, пересоздают и включают снова:

sudo swapoff /swapfile
sudo rm /swapfile
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

swapoff переносит всё из swap обратно в память. Если памяти для этого не хватает, команда долго думает или завершается ошибкой — поэтому перед ней остановите тяжёлые сервисы. Запись в fstab менять не нужно: имя файла то же.

Swappiness: когда система лезет в swap

Параметр vm.swappiness определяет, насколько охотно ядро выгружает память в swap. По умолчанию в Ubuntu 60. Для сервера, где swap — страховка, а не рабочее место, разумно 10:

cat /proc/sys/vm/swappiness
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system

Итог проверьте командой free -h: в строке Swap должен появиться новый объём.

Чистка диска

Сначала найдите, что занимает место, и только потом удаляйте. Чистить всё подряд по списку команд — способ удалить что-то нужное и ничего не освободить.

Чем занято место на диске

sudo du -xh --max-depth=1 / 2>/dev/null | sort -h | tail -15

Ключ -x не даёт du уходить в другие разделы и в /proc. Спускайтесь в самую большую папку и повторяйте команду. Удобнее то же самое делать в ncdu — он показывает дерево папок с размерами, по нему можно ходить стрелками и удалять клавишей d:

sudo apt install ncdu
sudo ncdu -x /

На маленьких VPS место обычно съедают четыре вещи: журнал systemd, кеш пакетов, Docker и логи самих приложений.

Очистка журнала journalctl

journalctl --disk-usage
sudo journalctl --vacuum-size=200M

Разовая чистка через время снова заполнит диск. Чтобы журнал не рос, задайте потолок в /etc/systemd/journald.conf:

[Journal]
SystemMaxUse=200M
sudo systemctl restart systemd-journald

Не опускайте лимит до 10–20 МБ: когда что-то сломается, логов за прошлую неделю уже не будет.

Пакеты APT и старые ядра

sudo apt clean
sudo apt autoremove --purge

apt clean удаляет скачанные .deb-файлы из /var/cache/apt/archives — при обновлении они скачаются заново. autoremove --purge удаляет зависимости, которые больше не нужны, и старые ядра, оставляя текущее и предыдущее. Посмотрите список перед подтверждением: если в нём пакет, которым вы пользуетесь, отметьте его как установленный вручную командой sudo apt-mark manual имя.

Snap

Snap хранит по несколько старых версий каждого пакета. Посмотреть и удалить отключённые:

snap list --all | awk '/disabled/{print $1, $3}'
snap list --all | awk '/disabled/{print $1, $3}' | while read name rev; do sudo snap remove "$name" --revision="$rev"; done

Чтобы старых версий не копилось больше двух:

sudo snap set system refresh.retain=2

Очистка Docker

Если на сервере есть Docker, скорее всего, место ушло к нему. Сколько и на что:

docker system df

Удалить остановленные контейнеры, неиспользуемые образы и кеш сборки:

docker system prune -a

Тома с данными эта команда не трогает. Ключ --volumes удалит и их — добавляйте его, только если точно знаете, что в неиспользуемых томах нет баз данных.

Логи контейнеров по умолчанию растут без ограничения. Лимит задаётся в /etc/docker/daemon.json и действует для контейнеров, созданных после перезапуска Docker:

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "10m", "max-file": "3" }
}

Кеш в домашней папке

В ~/.cache копятся загрузки pip, npm и других программ. Удалять можно — программы скачают нужное заново, но сначала посмотрите, что там:

du -sh ~/.cache/* | sort -h

Удаляйте конкретные папки, а не всё содержимое разом.

Проверить результат

df -h /

Если после чистки место не освободилось, а файлы удалены, их держит открытым какой-то процесс — обычно это удалённый, но ещё пишущийся лог. Найти такие файлы:

sudo lsof +L1

Перезапустите процесс из списка — место вернётся.

Про готовые скрипты

В чатах и гайдах часто советуют запустить скрипт одной строкой вида source <(wget -qO- https://...) или curl ... | bash. Такой скрипт выполняется с вашими правами, и вы не видите, что он делает. Так на серверы часто попадают вирусы-майнеры. Если хотите им воспользоваться, скачайте его отдельно, прочитайте и только потом запускайте. Все шаги из этой статьи — несколько команд, которые проще выполнить руками и понимать, что произошло.

Если на сервере планируется локальная нейросеть, памяти и диска понадобится особенно много — подробности в статье про Ollama.

Чтобы заранее видеть, что память или диск на исходе, настройте мониторинг — см. статью Prometheus и Grafana.

>

2 / 1
Оцените статью
Да будет Интернет!