ServerAID
Найти гайд, команду, тег… ⌘ K
Сервер

Swap в Linux: настройка swap-файла и раздела на Ubuntu

Swap — пространство на диске, куда Linux выгружает страницы памяти, когда не хватает оперативки. Без swap процесс с превышением лимита просто убивается OOM-killer; со swap — продолжает работать, но медленнее. Разбираем разницу между swap-файлом и swap-разделом, как создать swap-файл на Ubuntu, что такое swappiness, как настроить swap для SSD и сколько swap реально нужно на современном сервере.

Что такое swap и зачем он нужен

Swap (от англ. to swap — менять местами) — это пространство на диске, которое Linux использует как «вторичную память». Когда заканчивается физическая RAM, ядро выгружает редко используемые страницы памяти в swap. При обращении к ним они загружаются обратно.

Что даёт swap:

  • Защиту от OOM. Без swap при превышении RAM ядро запускает OOM-killer, который выбирает и убивает процесс по эвристике. Со swap — процесс просто становится медленнее, но живёт.
  • Возможность hibernate. Спящий режим (suspend-to-disk) использует swap для сохранения снимка RAM.
  • Cushion для пиков нагрузки. Кратковременные всплески потребления памяти не приводят к падению сервиса.

Что НЕ даёт swap:

  • Не заменяет RAM. Чтение из swap в 1000 раз медленнее, чем из памяти. Если swap активно используется — это симптом дефицита RAM, а не нормальное состояние.
  • Не ускоряет диск. Swap — пользователь дискового I/O, не оптимизатор.

Swap-раздел vs swap-файл

Два варианта организации:

Swap-раздел

Отдельный раздел диска, отформатированный как swap. Исторический стандарт. Плюсы:

  • Чуть быстрее (нет файловой системы между ядром и блочным устройством).
  • Поддерживает hibernate без вопросов.

Минусы:

  • Размер фиксирован при создании раздела. Менять — через gparted или пересоздание.
  • Требует свободного места на диске вне ФС.

Swap-файл

Обычный файл на файловой системе, помеченный как swap. Современный подход — Ubuntu 18.04+ по умолчанию создаёт swap-файл, не раздел.

Плюсы:

  • Гибкий размер: создать, удалить, изменить за минуту.
  • Не требует отдельного раздела на диске.
  • Работает на любой ФС (ext4, xfs, btrfs с оговорками).

Минусы:

  • Микроскопически медленнее раздела (на современных дисках разница незаметна).
  • На btrfs требует особой настройки (отдельный subvolume без CoW).

Рекомендация: на современном Ubuntu — swap-файл. Разделы оставьте старым системам и тем, кому нужен hibernate в специфической конфигурации.

Посмотреть текущий swap

# Общий обзор памяти и swap
free -h

# Активные swap-области
swapon --show

# Подробно
sudo swapon -v

# Сколько swap использовано каким процессом (приблизительно)
sudo smem -t -k -s swap | head

Пример вывода free -h:

              total        used        free      shared  buff/cache   available
Mem:           7.7Gi       2.3Gi       1.1Gi       0.2Gi       4.3Gi       4.9Gi
Swap:          2.0Gi       0.0Gi       2.0Gi

Если Swap → used стабильно растёт — значит RAM реально не хватает. Если близок к нулю — система комфортно живёт без swap.

Создать swap-файл на Ubuntu

Типовой сценарий: добавить 2 ГБ swap-файла.

# 1. Проверить, что нет уже активного swap
sudo swapon --show

# 2. Создать файл нужного размера
sudo fallocate -l 2G /swapfile

# 3. Выставить права (читать может только root)
sudo chmod 600 /swapfile

# 4. Форматировать как swap
sudo mkswap /swapfile

# 5. Активировать
sudo swapon /swapfile

# 6. Проверить
swapon --show
free -h

fallocate создаёт файл за миллисекунды (резервирует место в ФС без записи нулей). Альтернатива на ФС, которые не поддерживают fallocate (старые ext4 с особыми настройками):

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

dd медленнее (физически пишет нули), но работает везде.

Сделать постоянным

После перезагрузки swap отключится. Чтобы остался — добавить в /etc/fstab:

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

Проверить:

sudo swapoff /swapfile
sudo swapon -a   # читает /etc/fstab
swapon --show

Если активировалось — /etc/fstab корректен.

Настройка swappiness

vm.swappiness — параметр ядра от 0 до 200, который определяет «жадность» к использованию swap:

  • 0 — swap используется только при критической нехватке RAM.
  • 60 — значение по умолчанию на Ubuntu. Ядро начинает swap-ить уже при заполнении 60–70% RAM.
  • 100 — равная вероятность swap-а и сброса кэша.
  • 200 — агрессивно использовать swap.

Для сервера обычно ставят 10:

# Текущее значение
cat /proc/sys/vm/swappiness

# Временно (до перезагрузки)
sudo sysctl vm.swappiness=10

# Постоянно
echo "vm.swappiness=10" | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system

Это даёт ядру сильнее сопротивляться swap-у и удерживать активные страницы в RAM. На десктопе значение 60 обычно ок (там swap полезен для длительных операций в фоне).

Сколько swap нужно

Старое правило «swap = 2× RAM» устарело — оно из эпохи RAM по 32 МБ. Современные ориентиры:

RAM Swap Сценарий
≤ 2 ГБ 1.5× RAM старые VPS, IoT
2–8 ГБ 1× RAM стандартные серверы
8–16 ГБ 0.5× RAM средние нагрузки
16–64 ГБ 4–8 ГБ большинство серверов
> 64 ГБ 4 ГБ или нет swap мощные серверы; swap — cushion, не storage

Для hibernate на ноутбуке swap должен быть больше RAM (чтобы вместить весь snapshot). На сервере hibernate не нужен.

Swap на SSD

Распространённый миф: «swap на SSD убивает диск». Реальность:

  • Современные SSD выдерживают сотни TBW. Swap пишет десятки ГБ в день в худшем случае — это десятилетия работы.
  • Wear leveling в SSD распределяет запись равномерно.
  • Без swap альтернатива — OOM-killer, что хуже для стабильности.

Что не делать:

  • Не выставляйте swappiness=100 на SSD — это ускорит износ, не давая пользы.
  • Не размещайте swap на дешёвых USB-флешках или SD-картах — они быстро деградируют.

С NVMe-диском swap-файл практически неотличим по скорости от swap-раздела. Используйте файл, никаких компромиссов.

Swap на btrfs

Btrfs до версии 5.0 вообще не поддерживала swap-файлы. Сейчас поддерживает, но с ограничениями:

# Создать swap на btrfs
sudo truncate -s 0 /swapfile
sudo chattr +C /swapfile      # отключить copy-on-write
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

chattr +C отключает CoW (copy-on-write) для swap-файла — без этого btrfs не разрешит mkswap. Файл должен быть в рутовом subvolume или субtoме без snapshots.

Swap в облаках (AWS, DigitalOcean, Yandex Cloud)

Большинство облачных провайдеров не создают swap по умолчанию — стандартный образ Ubuntu идёт без swap. Решения:

# DigitalOcean / Yandex Cloud / AWS EC2 — типичный сценарий
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
sudo sysctl vm.swappiness=10
echo "vm.swappiness=10" | sudo tee /etc/sysctl.d/99-swappiness.conf

На некоторых провайдерах (например, AWS Lightsail с диском EBS gp2/gp3) активный swap может неожиданно тратить IOPS-кредиты. Мониторьте через CloudWatch или аналог.

Удалить swap

# Деактивировать
sudo swapoff /swapfile

# Удалить файл
sudo rm /swapfile

# Убрать запись из /etc/fstab
sudo sed -i '/swapfile/d' /etc/fstab

# Проверить
swapon --show   # должно быть пусто

Для swap-раздела — swapoff /dev/sdaN, удалить запись из fstab, потом через parted/gparted пересоздать раздел.

Мониторинг и диагностика

# Кто кладёт страницы в swap (приблизительно)
sudo smem -t -k -s swap | head

# Процессы с наибольшим RSS+swap (более точно)
sudo top -b -n 1 -o %MEM | head -20

# Сколько раз ядро делало swap-in/swap-out
vmstat 1 5
# колонки si (swap-in) и so (swap-out) — активность swap

# Алерт: swap используется больше 50%
free | awk '/Swap/ {if ($3/$2 > 0.5) print "ALERT: swap > 50%"}'

Если si/so стабильно ненулевые — система реально тратит время на swap. Либо добавить RAM, либо уменьшить нагрузку.

Частые вопросы

Сколько swap нужно на сервере с 16 ГБ RAM?

Обычно 4–8 ГБ. Это cushion для пиков, не основное хранилище. Если в Production swap стабильно используется на 50%+ — нужно либо больше RAM, либо профилировать память приложения. Если близко к нулю — это нормально, swap просто страхует от OOM.

Что лучше — swap-файл или swap-раздел?

На современном Ubuntu — swap-файл. Он гибкий по размеру, не требует пересоздания диска, на NVMe не уступает разделу по скорости. Разделы остались в системах, где нужен hibernate с особой конфигурацией, и в очень старых установках.

Что такое swappiness и какое значение поставить?

vm.swappiness — параметр ядра от 0 до 200, регулирующий склонность системы к использованию swap. Дефолт Ubuntu — 60. Для сервера разумно 10 (меньше swap-а, больше RAM-приоритета). Для десктопа — 60 ок. Для баз данных в RAM (PostgreSQL, Redis) часто ставят 1 или даже 0.

Можно ли использовать swap на SSD?

Да. Современные SSD выдерживают многие десятилетия типичной swap-нагрузки благодаря wear leveling и большому ресурсу записи (TBW). Без swap единственная альтернатива при дефиците RAM — OOM-killer, что хуже для стабильности сервера.

Что делать, если swap заполнен на 100%?

Сначала проверьте free -h и top -o %MEM — найдите процесс, который ест память. Если это нормальная нагрузка (не утечка) — нужно либо добавить RAM, либо расширить swap. Если утечка — перезапустите процесс. Принудительно очистить swap можно командой sudo swapoff /swapfile && sudo swapon /swapfile, но это безопасно только если в RAM есть место принять выгруженные страницы.

Что запомнить

  • Swap — резервная память на диске, защита от OOM-killer.
  • На современном Ubuntu — swap-файл, не раздел.
  • Создание: fallocate -l 2G /swapfile && mkswap && swapon.
  • Постоянное монтирование — через /etc/fstab.
  • vm.swappiness=10 для сервера, 60 для десктопа.
  • Размер: 4–8 ГБ для большинства серверов, для hibernate — больше RAM.
  • На SSD — безопасно, миф об износе не подтверждается.
  • Btrfs требует chattr +C для swap-файла.
  • Мониторинг через vmstat, free, smem; постоянное использование swap — сигнал к апгрейду RAM.

Похожие материалы

Сервер

cron в Linux: расписание задач, crontab и альтернативы на Ubuntu

cron — классический планировщик задач Unix. Запускает команды по расписанию: каждую минуту, ежедневно, по сложным паттернам времени. Разбираем синтаксис crontab, разницу между пользовательским и системным cron, типичные ошибки с PATH и окружением, как читать логи cron и когда лучше выбрать systemd timer вместо классического cron.

Редакция
Сервер

rsync на Linux: рабочие команды для бэкапа, деплоя и переноса

rsync — стандартный инструмент Linux для синхронизации файлов между каталогами и серверами по SSH. Делает инкрементальную копию (только изменения), сохраняет атрибуты, переживает обрывы. Разбираем главные флаги, инкрементальные бэкапы через `--link-dest`, типовые сценарии и грабли — наклонную черту в конце пути и `--delete`.

Редакция
Сервер

Установка Ubuntu Server 24.04 LTS: пошаговый гайд от ISO до первого SSH

Ставим Ubuntu Server 24.04 LTS с нуля: загрузочная флешка, разметка диска под LVM, статический IP, OpenSSH с ключами и базовая защита перед первым `apt update`. Гайд работает и для свежих установок 22.04 / 26.04 — отличия минимальные, отметили по тексту.

Редакция
Сервер

systemd unit и systemctl enable: что делают, чем отличаются от start

Команда `systemctl enable` создаёт симлинки, чтобы сервис стартовал при загрузке системы. Разбираем разницу с `start`, шорткат `--now`, свой unit-файл с `Restart=always`, пользовательские сервисы и частые ошибки на Ubuntu 24.04 LTS.

Редакция