К содержанию
Siberian V

Swap на сервере: когда нужен и как включить

Схема: swap помогает при коротких пиках памяти, а при постоянной работе в swap нужна оперативная память

Сервер с небольшим объёмом памяти падает не от нагрузки, а от пика: обновление пакетов, бэкап или сборка на минуту забирают всю RAM, и ядро завершает процесс. Swap, он же файл подкачки, даёт запас на диске и время пережить всплеск. Диск в разы медленнее памяти, поэтому постоянная работа в swap означает нехватку RAM. Дальше — как отличить одно от другого и включить swap.

Что swap делает и чего не делает

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

Swap не ускоряет сервер и не заменяет память: он лишь откладывает момент, когда ядро включит OOM killer и завершит процесс. Диск отвечает в разы медленнее RAM, а на VPS к этому добавляется нагрузка соседей по хосту. Небольшой обмен незаметен, постоянный превращает сервер в тормозящую машину.

На VPS swap делают файлом.

Когда swap действительно нужен

Swap имеет смысл в трёх случаях.

Если памяти много и пиков нет, swap можно не включать.

Когда swap — признак нехватки памяти

Признак простой: swap занят постоянно, а не только в часы пик. Если free -h показывает растущий Swap used, а vmstat 1 5 выдаёт ненулевые si и so минутами, данные не помещаются в RAM.

Увеличение swap помогает недолго: места больше, но каждое обращение к выгруженным страницам ждёт диск. Ответ — добавить память, ограничить прожорливый сервис или разнести нагрузку.

OOM killer работает и при swap. Когда заканчивается и он, ядро завершает процесс; след остаётся в журнале: journalctl -k | grep -i "killed process".

Сколько swap делать

Ориентиры ниже — отправная точка: размер зависит от пикового потребления.

Память сервераSwapКогда подходит
512 МБ — 1 ГБ1–2 ГБНебольшой сайт, бот, панель
2–4 ГБ2–4 ГБСайт с базой или несколько сервисов
4–8 ГБ2–4 ГБЗапас на пики и обновления
Больше 8 ГБ2–4 ГБ или без swapЕсли пиков нет, можно обойтись

Больше 4 ГБ swap на обычном VPS редко полезны: если система уходит туда целиком, сервер тормозит задолго до заполнения файла. Проверьте место: df -h /.

Правило «swap равен RAM» пришло с домашних компьютеров с гибернацией. Серверу она не нужна: для 1 ГБ RAM хватит 2 ГБ, а 16 ГБ swap при 16 ГБ RAM редко нужны. Как считается память под сайт — в статье про оперативную память.

Как проверить, есть ли уже swap

Три команды:

free -h
swapon --show
cat /proc/swaps

free -h показывает размер и занятое место в строке Swap, но не тип. swapon --show выводит активные области и тип: file или partition; пустой вывод значит, что swap нет.

Проверьте автозагрузку: grep swap /etc/fstab. Без строки swap не поднимется после перезагрузки.

Включение swap-файла на Debian и Ubuntu

Порядок для свежего сервера. Выполняйте команды по одной и читайте вывод.

Шаг 1. Создайте файл

Для 2 ГБ:

sudo fallocate -l 2G /swapfile

fallocate резервирует место сразу и работает не на всех файловых системах. Если он выдал ошибку, создайте файл через dd:

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

На btrfs файл должен быть выделен заранее, без copy-on-write и сжатия. Проще держать swap на ext4.

Шаг 2. Закройте файл от посторонних

В swap попадают страницы памяти, поэтому читать его должен только root:

sudo chmod 600 /swapfile

Шаг 3. Разметьте файл как область подкачки

sudo mkswap /swapfile

Шаг 4. Включите swap

sudo swapon /swapfile

Шаг 5. Проверьте результат

swapon --show
free -h

В выводе появится строка с типом file; free -h покажет объём в строке Swap.

Автозагрузка и проверка после перезагрузки

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

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

Поля строки: путь, none, swap, опции sw, два нуля. Примените записи:

sudo swapon -a
swapon --show

swapon -a включает всё из fstab, что ещё не активно; молчание команды значит, что строка читается. После перезагрузки повторите swapon --show. Ошибка в fstab может помешать загрузке.

swappiness: когда система уходит в swap

vm.swappiness задаёт, насколько охотно ядро выгружает анонимные страницы. Диапазон — 0–200, по умолчанию 60. Выше — активнее выгружает страницы, ниже — дольше держит их в памяти.

Для файла на VPS начните с 10–20. Проверить и изменить:

cat /proc/sys/vm/swappiness
sudo sysctl vm.swappiness=10

Временное значение сбросится после перезагрузки; постоянное — в /etc/sysctl.d/90-swap.conf:

echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/90-swap.conf
sudo sysctl --system

Для zram логика обратная: swap лежит в памяти, и значение выше 100 не ошибка.

vm.vfs_cache_pressure (по умолчанию 100) управляет кешем имён файлов; понижают до 50–100 на серверах с множеством мелких файлов.

zram: swap в сжатом виде в памяти

zram создаёт в RAM блочное устройство, которое сжимает страницы. Для системы это обычный swap, но данные не уходят на диск. На VPS с малой RAM это быстрый запас без ожидания диска.

В Debian и Ubuntu пакет zram-tools настраивается через /etc/default/zramswap: PERCENT (доля RAM), SIZE (размер в МиБ), ALGO, PRIORITY. Значения по умолчанию отличаются между версиями — откройте свой файл. Установка:

sudo apt install zram-tools
sudo systemctl restart zramswap
swapon --show

В выводе появится /dev/zram0. Сжатие показывает zramctl или sudo zramswap status. zram и файл работают вместе: устройство с большим приоритетом используется первым.

Текст сжимается хорошо, уже сжатые файлы — почти нет; загруженному процессору сжатие добавит работы.

Swap и контейнеры

Контейнер без ограничений использует swap хоста. В Docker --memory ограничивает RAM, --memory-swap — сумму RAM и swap. Если задан только --memory, контейнер может занять ещё столько же в swap; равные значения выключают swap, -1 снимает ограничение.

Внутри контейнера free показывает swap хоста, поэтому проверять надо снаружи. В compose сумму задаёт memswap_limit, в systemd — MemorySwapMax.

Как следить за swap

free -h показывает занятое место, но важнее динамика: vmstat 1 5 печатает si и so — чтение и запись swap. Нули в обычное время — норма, устойчивые ненулевые значения говорят о давлении.

Найти процесс, занявший swap:

sudo grep -H VmSwap /proc/[0-9]*/status | sort -k2 -nr | head

Когда swap и RAM закончились, ядро пишет об убитом процессе в журнал: journalctl -k | grep -i "killed process".

Частые ошибки

  1. Увеличивать swap, когда система живёт в нём постоянно: места больше, скорость не растёт.
  2. Забыть fstab: после перезагрузки swap исчезает.
  3. Создавать файл на заполненном диске: свободного запаса не останется.
  4. Ставить swappiness в 0: при пике ядро сразу дойдёт до OOM killer.
  5. Удалять активный файл без swapoff: сначала sudo swapoff /swapfile, потом fstab и rm.
  6. Держать swap на медленном сетевом диске: каждый промах будет заметен.

Если свой сервер нужен для подключения устройств

Сервер под устройства требует времени на настройку, обновления и дежурство. Если администрировать машину не хочется, в Siberian V подключение настраивается через приложение: российские сайты идут напрямую, остальное — через зарубежный сервер. Разница разобрана в статье про сервер для роутера.

Подключить

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

Зачем нужен swap, если памяти хватает?

Небольшой файл страхует от редкого пика: обновлений, сборок, бэкапа. В обычной работе он почти не используется.

Сколько swap делать на 1 ГБ RAM?

Ориентир — 1–2 ГБ. Если сервер регулярно уходит в swap целиком, дело не в размере файла, а в нехватке памяти.

Почему swap не включается после перезагрузки?

Чаще всего нет строки в /etc/fstab или в ней ошибка. Проверьте swapon --show, grep swap /etc/fstab и вывод sudo swapon -a.

Вреден ли swap для SSD?

Сам по себе swap диск не изнашивает: запись идёт только при давлении на память. Постоянная запись — признак нехватки RAM.

Чем zram отличается от swap-файла?

Swap-файл лежит на диске и переживает перезагрузку. zram — сжатый swap в памяти: быстрее, но занимает часть RAM. Их можно использовать вместе, задав zram больший приоритет.