Подробный гайд: Как настроить параметры swap для улучшения производительности
Введение: зачем настраивать swap?
Swap — не «расширитель ОЗУ», а механизм управления памятью.
Правильная настройка позволяет:
- Избежать внезапного OOM Killer при пиковых нагрузках
- Сохранить файловый кэш в RAM
- Снизить iowait и латентность на SSD/HDD
- Улучшить отзывчивость десктопных и серверных систем
Важно:
- если система постоянно активно использует swap (si/so > 0 в vmstat), значит не хватает физической памяти. Настройка параметров не решит проблему, а лишь сгладит симптомы.
1. Ключевые параметры ядра (sysctl)
| Параметр | Диапазон | По умолчанию | Что делает | Рекомендации |
|---|---|---|---|---|
| vm.swappiness | 0–100 | 60 | Склонность ядра выгружать страницы в swap. 0 ≠ отключение, а минимизация. | 10–30 (десктоп/сервер с SSD) 1–10 (БД, веб, контейнеры) 0 только для специфичных real-time задач |
| vm.vfs_cache_pressure | 0–200+ | 100 | Агрессивность освобождения кэша inode/dentry. | 50 (файловые серверы) 10–30 (десктопы, БД) >100 только при нехватке RAM |
| vm.dirty_background_ratio | 0–100 | 10 | % памяти, после которого фон-треды начинают сброс «грязных» страниц | 5–10 |
| vm.dirty_ratio | 0–100 | 20 | % памяти, после которого процессы блокируются и ждут записи | 10–20 |
| vm.page-cluster | 0–5 | 3 | Сколько страниц читается/пишется за раз при swap-операциях (2^N) | 3 (по умолчанию оптимально) 2 для NVMe/быстрых SSD |
| vm.watermark_scale_factor | 0–1000 | 10 | Масштабирует резерв памяти под новые выделения | Оставить 10 или 20 на нагруженных серверах |
2. Пошаговая настройка
Шаг 1: Проверка текущих значений
sysctl vm.swappiness vm.vfs_cache_pressure vm.dirty_ratio vm.dirty_background_ratio vm.page-cluster
Шаг 2: Временное применение (без перезагрузки)
sudo sysctl -w vm.swappiness=10
sudo sysctl -w vm.vfs_cache_pressure=50
sudo sysctl -w vm.dirty_background_ratio=5
sudo sysctl -w vm.dirty_ratio=10
Шаг 3: Сохранение настроек
Создайте файл /etc/sysctl.d/99-memory-tuning.conf:
# Минимизация агрессивного своппинга
vm.swappiness = 10
# Сохранение кэша файловой системы
vm.vfs_cache_pressure = 50
# Оптимизация записи "грязных" страниц
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
# Опционально: для быстрых NVMe можно снизить
# vm.page-cluster = 2
Примените:
sudo sysctl -p /etc/sysctl.d/99-memory-tuning.conf
Шаг 4: Оптимизация самого swap-устройства
Для SSD:
# Создаём файл 4–8 ГБ (хватит для страховки)
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
В /etc/fstab:
/swapfile none swap sw 0 0
Не используйте discard в fstab для swap. В современных ядрах (5.17+) TRIM для swap управляется автоматически или через fstrim. Вместо этого добавьте в /etc/systemd/system/fstrim.timer или используйте swapon --discard один раз при создании.
Проверка:
swapon --show
free -h
cat /proc/sys/vm/swappiness
3. Современные альтернативы классическому swap
| Технология | Принцип | Когда использовать |
|---|---|---|
| ZRAM | Сжатый RAM-диск, выступает как swap | < 16 ГБ ОЗУ, ноутбуки, встроенные системы, Raspberry Pi |
| Zswap | Прозрачный кэш сжатых страниц перед записью на диск | Есть SSD, нужна страховка от OOM, но не хочется терять производительность |
| Systemd-swap | Автоматическое переключение между ZRAM/Zswap/файлом | Десктопы с переменной нагрузкой |
Включение Zswap (если поддерживается ядром)
- Проверка поддержки:
zcat /proc/config.gz | grep ZSWAPилиgrep -i zswap /boot/config-$(uname -r)
2. В GRUB: добавьте в GRUB_CMDLINE_LINUX:
zswap.enabled=1 zswap.compressor=zstd zswap.zpool=z3fold zswap.max_pool_percent=20
- Обновите GRUB и перезагрузитесь.
Включение ZRAM (через zram-generator)
sudo apt install zram-generator # Debian/Ubuntu
sudo dnf install zram-generator # Fedora/RHEL
Создайте /etc/systemd/zram-generator.conf:
[zram0]
zram-size = min(ram, 8192) # 8 ГБ или объём ОЗУ
compression-algorithm = zstd
sudo systemctl daemon-reload
sudo systemctl start systemd-zram-setup@zram0.service
sudo systemctl enable systemd-zram-setup@zram0.service
Отключите классический swap, если используете только ZRAM.
4. Мониторинг и диагностика
| Команда | Что показывает | Как интерпретировать |
|---|---|---|
| vmstat 1 | si (swap in), so (swap out) | > 0 постоянно → нехватка RAM или завышен swappiness |
| sar -W 1 | Статистика swap-операций | Рост pgpgin/pgpgout → активный своппинг |
| iostat -x 1 | %util, await на диске | Высокий await + swap → троттлинг |
| pidstat -r 1 | Использование памяти процессами | Ищите процессы с резким ростом minflt/majflt |
| dmesg -T | grep -iE 'swap | oom' | Сообщения ядра | Out of memory → срочно увеличьте RAM или ограничьте процессы |
Признак правильной настройки: si/so ≈ 0 в простое, кратковременные всплески при запуске тяжёлых задач, отсутствие iowait > 10%.
5. Чек-лист лучших практик
- Не отключайте swap полностью (swapoff -a) → OOM Killer убьёт процессы без предупреждения
- Для БД (PostgreSQL/MySQL) → vm.swappiness=1, vm.vfs_cache_pressure=10, отключите NUMA swapping если нужно
- Для контейнеров (Docker/Podman) → ограничьте память через --memory, не полагайтесь на host swap
- Для десктопов с <16 ГБ ОЗУ → используйте ZRAM + swappiness=10
- Всегда тестируйте изменения на тестовом стенде перед продакшеном
- Не меняйте все параметры одновременно → вносите по 1–2, наблюдайте 24–48 часов
- Обновляйте ядро: в 6.1+ улучшены алгоритмы mglru, swap thrashing prevention
Заключение
Настройка swap — это баланс между отзывчивостью, стабильностью и ресурсами. Современные ядра хорошо справляются с памятью «из коробки», но тонкая настройка vm.swappiness, vfs_cache_pressure и переход на ZRAM/Zswap могут дать заметный прирост в специфичных сценариях.