SWAP — це область на диску, куди ядро Linux вивантажує сторінки пам'яті, коли фізичної RAM не вистачає. На VDS із невеликим обсягом пам'яті swap не дає процесам падати через OOM, але платить за це швидкістю: диск у тисячі разів повільніший за оперативну пам'ять.
Створення swap-файлу
# Створюємо файл 2 ГБ
fallocate -l 2G /swapfile
# Встановлюємо права — swap-файл із відкритими правами ядро відмовиться використовувати
chmod 600 /swapfile
# Форматуємо як swap
mkswap /swapfile
# Активуємо
swapon /swapfile
# Перевірка
swapon --show
free -h
Якщо fallocate недоступний (рідко, на деяких файлових системах на кшталт btrfs зі стисненням), файл створюється повільніше, але надійніше через dd if=/dev/zero of=/swapfile bs=1M count=2048.
Автомонтування swap при завантаженні
# Додати в /etc/fstab
/swapfile none swap sw 0 0
Без цього рядка swap-файл активний лише до перезавантаження — після рестарту сервера free -h знову покаже нуль у колонці Swap, і доведеться повторювати swapon вручну.
Налаштування swappiness
# Перевірити поточне значення (0-100)
cat /proc/sys/vm/swappiness # За замовчуванням: 60
# Змінити (10 = використовувати swap тільки за гострої потреби)
sysctl vm.swappiness=10
# Постійно
echo "vm.swappiness=10" >> /etc/sysctl.conf
Значення 60 за замовчуванням розраховане на десктопи, де чуйність інтерфейсу важливіша за пропускну здатність сервера. На VDS із базою даних чи вебсервером нижче значення (10–20) відкладає перехід у swap до моменту, коли пам'яті реально не вистачає, а не за першої нагоди звільнити трохи RAM під файловий кеш.
Розбір типових помилок
Помилка swapon: /swapfile: insecure permissions 0644, 0600 suggested — ядро попереджає, що права на файл занадто відкриті: без chmod 600 непривілейований користувач теоретично може прочитати вміст swap, а там може опинитися що завгодно з пам'яті інших процесів, включно з паролями.
swapon: /swapfile: swapon failed: Invalid argument
Ця помилка зазвичай означає, що файл не було відформатовано командою mkswap перед swapon, або файлова система під ним не підтримує swap-файли в поточній конфігурації (наприклад, деякі мережеві ФС чи btrfs без спеціальної підготовки).
Swap заповнюється, а RAM при цьому вільна — ознака не нестачі пам'яті, а високого swappiness у поєднанні з рідко використовуваними, але давно наявними в пам'яті процесами. Ядро може витіснити їх у swap заздалегідь, звільняючи RAM під кеш, навіть коли прямої потреби в цьому немає. Перевіряється через vmstat 1: колонки si/so (swap in/out) мають бути близькі до нуля в спокійному режимі, стійка ненульова активність — уже тривожний сигнал.
Zswap як альтернатива звичайному swap-файлу
Zswap — прошарок у ядрі, який стискає сторінки перед вивантаженням і тримає частину з них у стисненому вигляді прямо в RAM, звертаючись до диска лише коли стиснений пул переповнено. На VDS із SSD це знижує кількість реальних операцій запису на диск за помірного свопінгу:
# Увімкнути zswap на льоту (до наступного перезавантаження)
echo 1 > /sys/module/zswap/parameters/enabled
# Постійно — через параметр ядра в GRUB
# додати zswap.enabled=1 у GRUB_CMDLINE_LINUX
update-grub
Zswap не замінює swap-файл повністю — йому все одно потрібен звичайний swap як резервний рівень, він лише скорочує звернення до нього. Для VDS з 1–2 ГБ RAM і без NVMe-диска це зазвичай дає помітний виграш у чуйності під короткочасними піками пам'яті.
Рекомендації щодо розміру SWAP
| RAM сервера | Розмір SWAP | Застосування |
|---|---|---|
| До 2 ГБ | 2x RAM | Буфер при нестачі пам'яті |
| 2–8 ГБ | = RAM | Стандартна конфігурація |
| 8–32 ГБ | 4–8 ГБ | Тільки для екстрених ситуацій |
| Понад 32 ГБ | 2–4 ГБ | Тільки для дампів OOM killer |
Коли swap не вирішує проблему
- Робочий набір бази даних стабільно більший за RAM плюс swap — сервер постійно свопитиметься під навантаженням, і правильна відповідь тут не збільшення swap, а апгрейд пам'яті чи оптимізація запитів.
- Диск — мережеве сховище з високою затримкою — swap на такому носії перетворює будь-яке звернення до витісненої сторінки на операцію із затримкою в десятки мілісекунд, що для інтерактивних сервісів відчувається як зависання.
- Процес регулярно вбивається OOM killer ще до того, як swap встигає заповнитися — це означає не повільний, а надто різкий стрибок споживання пам'яті, і тут допомагає обмеження пам'яті самого процесу (наприклад, через systemd
MemoryMax), а не більший swap.
Перевірка результату
- Переконайтеся, що swap видно після перезавантаження, а не лише одразу після ручного
swapon: перезапустіть сервер і виконайтеfree -hзнову. - Перевірте пріоритет і реальне використання:
swapon --showпокаже заповненість у стовпціUsed. - Порівняйте значення
vm.swappinessдо і після правки/etc/sysctl.conf:sysctl vm.swappinessмає повернути нове значення і після перезавантаження, а не лише в поточній сесії. - Поспостерігайте за
vmstat 1 10під звичайним навантаженням — стійкі ненульовіsi/soозначають, що пам'яті все ще не вистачає, і swap-файл лише пом'якшує симптом, а не вирішує першопричину, розібрану в статті про профілювання продуктивності Linux.