Подробный гайд: Снижение iowait в Linux: как zswap убирает тормоза системы, сжимая swap в ОЗУ

Zswap сжимает страницы в RAM, заменяя медленную запись на диск. Это радикально снижает iowait и устраняет тормоза Linux при нехватке оперативной памяти.

2026.07.19                  


Подробный гайд: Снижение iowait в Linux: как zswap убирает тормоза системы, сжимая swap в ОЗУПодробный гайд: Снижение iowait в Linux: как zswap убирает тормоза системы, сжимая swap в ОЗУ Классический swap на диске (особенно на HDD, но и на SSD при высоких нагрузках) — это «бутылочное горлышко», которое вызывает простои процессора (iowait) и жуткие тормоза системы.

Использование zswap — это одно из самых элегантных решений для снижения iowait на машинах с ограниченным объёмом оперативной памяти или при специфических паттернах нагрузки.

Ниже представлен подробный гайд по внедрению, настройке и оптимизации zswap в Linux.


1. Как работает zswap (Краткая теория)

Когда ядру не хватает RAM, оно начинает вытеснять (evict) страницы памяти.

  • Без zswap: Ядро пишет страницы напрямую в файл/раздел подкачки на диске. Возникает iowait.
  • С zswap: Ядро перехватывает эти страницы, сжимает их (используя CPU) и помещает в динамический пул в оперативной памяти.
  • Если пул zswap переполняется: Только тогда самые «старые» (Least Recently Used) сжатые страницы сбрасываются (evict) на диск в классический swap.

Итог:

Мы меняем медленный дисковый ввод-вывод на быстрое сжатие процессором. Современные алгоритмы сжатия работают на скоростях гигабайт в секунду, что в десятки раз быстрее даже самых быстрых NVMe SSD.


2. Подготовка и включение zswap

Важное правило:

Для работы zswap в системе должен быть настроен классический swap (файл или раздел), так как он используется как "тыловой" (backing) накопитель для сброса данных при переполнении пула в RAM.


Шаг 2.1. Проверка поддержки ядром

Убедитесь, что ваше ядро собрано с поддержкой zswap:

grep CONFIG_ZSWAP /boot/config-$(uname -r)

Ожидаемый вывод:

CONFIG_ZSWAP=y (встроено) или CONFIG_ZSWAP=m (модуль).


Шаг 2.2. Включение zswap

По умолчанию в большинстве дистрибутивов он выключен.

Временное включение (до перезагрузки):

echo 1 | sudo tee /sys/module/zswap/parameters/enabled

Постоянное включение (через GRUB):

1. Откройте файл конфигурации GRUB:

   sudo nano /etc/default/grub

2. Найдите строку GRUB_CMDLINE_LINUX_DEFAULT (или GRUB_CMDLINE_LINUX) и добавьте параметр zswap.enabled=1.

Пример:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash zswap.enabled=1"


3. Обновите GRUB:

  • Для Debian/Ubuntu: sudo update-grub
  • Для RHEL/CentOS/Alma: sudo grub2-mkconfig -o /boot/grub2/grub.cfg

4. Перезагрузитесь.


3. Оптимизация и тонкая настройка (Самое важное)

Просто включить zswap недостаточно. Чтобы получить максимальный прирост производительности и минимальный iowait, нужно настроить алгоритм сжатия и аллокатор памяти.


Шаг 3.1. Выбор алгоритма сжатия (Compressor)

От этого зависит баланс между скоростью работы CPU и степенью сжатия (сколько данных влезет в RAM).


Доступные варианты (зависит от ядра):

  • lz4Рекомендуется для максимальной скорости. Очень быстрое сжатие/расжатие, минимальная нагрузка на CPU. Степень сжатия средняя.
  • zstdРекомендуется для максимальной экономии RAM. Отличная степень сжатия, чуть медленнее lz4, но все равно невероятно быстр по сравнению с диском.
  • lzo / lzo-rle — Старый стандарт, сейчас лучше использовать lz4 или zstd.

Как проверить доступные алгоритмы:

cat /sys/kernel/debug/zswap/available_compressor

Как установить zstd (или lz4) в качестве основного:

echo zstd | sudo tee /sys/module/zswap/parameters/compressor

Для постоянного сохранения добавьте zswap.compressor=zstd в GRUB_CMDLINE_LINUX (см. Шаг 2.2).


Шаг 3.2. Выбор аллокатора пула (Pool)

Аллокатор определяет, как именно сжатые страницы размещаются в RAM.

  • zbud — Старый, ограничивает сжатие максимум 2:1.
  • z3fold — Более новый, позволяет сжимать до 3:1. Рекомендуется.
  • zsmalloc — Используется по умолчанию в zram, но для zswap лучше подходит z3fold.

Как переключить на z3fold:

echo z3fold | sudo tee /sys/module/zswap/parameters/zpool

Для постоянного сохранения: zswap.zpool=z3fold в GRUB.


Шаг 3.3. Ограничение размера пула (max_pool_percent)

Этот параметр задает, какой процент от общей RAM может занять пул сжатых страниц. По умолчанию стоит 20%.
Если у вас 16 ГБ RAM, пул займет до 3.2 ГБ. В сжатом виде это может вместить 6-9 ГБ "грязных" данных.
Обычно 20% достаточно. Если у вас очень мало RAM (например, 2 ГБ), можно увеличить до 30-40%, но не стоит жадничать, чтобы оставить место для файлового кэша.


4. Настройка swappiness

Поскольку zswap находится в RAM и работает очень быстро, мы можем позволить ядру более агрессивно вытеснять страницы из RAM, чтобы освобождать место для файлового кэша (что тоже ускоряет систему).


Проверьте текущее значение:

cat /proc/sys/vm/swappiness

С классическим swap на HDD ставят 10. С zswap можно смело ставить 60 (дефолт) или даже 80-100, так как "штраф" за свопинг теперь минимален (это просто сжатие в RAM).

# Временно
echo 80 | sudo tee /proc/sys/vm/swappiness

# Постоянно (в /etc/sysctl.conf)
echo "vm.swappiness=80" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

5. Мониторинг: работает ли zswap?

Чтобы убедиться, что zswap перехватывает страницы и снижает iowait, нужно посмотреть его статистику. Для этого должна быть смонтирована debugfs (обычно смонтирована по умолчанию).


Посмотреть все метрики:

cat /sys/kernel/debug/zswap/*

На что смотреть (ключевые метрики):

  • stored_pages — количество страниц, которые сейчас хранятся в сжатом виде в RAM.
  • pool_total_size — реальный объем RAM, который занимает этот сжатый пул. (Если stored_pages много, а pool_total_size мало — значит, сжатие работает отлично!).
  • written_back_pagesсамая важная метрика для вас. Показывает, сколько страниц было сброшено на диск (в классический swap). Если это число растет медленно или стоит на месте — вы победили iowait.
  • reject_alloc_pools / reject_compress_poor — страницы, которые zswap отказался сжимать (например, если они не сжимаются или пул переполнен).

6. zswap vs zram: что выбрать?

Важно не путать zswap с zram, так как они решают смежные, но разные задачи:

Характеристика zswap zram
Суть Кэш для классического swap на диске. Блочное устройство в RAM (сам является swap).
Нужен ли диск? Да, обязателен backing swap (файл/раздел). Нет, работает полностью в RAM.
Что делает при нехватке места? Сбрасывает старые страницы на диск. Вызывает OOM (Out of Memory) и убивает процессы.
Когда использовать? Когда есть диск, но нужно убрать iowait при свопинге. Когда диска нет вообще (LiveCD, роутеры, специфичные контейнеры) или нужен максимальный упор в RAM.

Важно:

Если у вас сервер/десктоп с SSD/HDD и вам нужно убрать лаги при нехватке RAM — используйте zswap. Если вы собираете embedded-систему или хотите полностью отказаться от дискового swap — используйте zram.


Шпаргалка для быстрого копирования (GRUB)

Для того чтобы один раз настроить систему и забыть, добавьте следующие параметры в GRUB_CMDLINE_LINUX_DEFAULT:

zswap.enabled=1 zswap.compressor=zstd zswap.zpool=z3fold zswap.max_pool_percent=20

После обновления GRUB и перезагрузки ваша система будет сжимать вытесняемые страницы алгоритмом zstd, хранить их в эффективном пуле z3fold, и диск будет отдыхать, а iowait исчезнет!


Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.


Статью подготовил: Денис Аверко @Nymexis г. Омск

Комментарии

Загрузка...
Если комментарии не загружаются, можете попробовать отключить блокировщик рекламы для этого сайта