Подробный гайд: Как настроить параметры swap для улучшения производительности

Настройка swap в Linux: оптимизация vm.swappiness и ZRAM для повышения производительности и стабильности системы

2026.04.24                  


Подробный гайд: Как настроить параметры swap для улучшения производительностиПодробный гайд: Как настроить параметры 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 (если поддерживается ядром)

  1. Проверка поддержки: 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
  1. Обновите 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 могут дать заметный прирост в специфичных сценариях.