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.