Подробный гайд: Снижение 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 исчезнет!
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.