Подробный гайд по zswap: ускоряем Linux, заменяя запись на диск быстрым сжатием данных в RAM
Вопрос "Что лучше: потратить циклы CPU на сжатие данных или ждать, пока медленный HDD/SSD запишет их?" давно имеет однозначный ответ в мире современных Linux-систем: сжатие в оперативной памяти почти всегда выигрывает.
Многоядерные процессоры легко справляются со сжатием данных на лету, а задержка (latency) даже быстрого NVMe-накопителя измеряется десятками или сотнями микросекунд, тогда как сжатие/распаковка в RAM занимает единицы микросекунд. Для HDD или SATA SSD эта разница становится колоссальной.
zswap — это легковесный сжатый кэш в оперативной памяти, который перехватывает страницы, предназначенные для свопа, сжимает их и хранит в RAM. Запись на физический диск происходит только тогда, когда этот кэш переполняется. Это снижает износ SSD, устраняет троттлинг системы из-за медленного свопа на HDD и делает работу системы отзывчивой даже при нехватке памяти.
1. Как работает zswap (в отличие от классического swap и zram)
1. Классический swap:
Система переносит неиспользуемые страницы памяти напрямую на диск. Медленно, создает нагрузку на диск.
2. zram:
Создает виртуальное блочное устройство в RAM, которое используется как swap. Все данные хранятся только в сжатом виде в RAM. Если память переполняется, система может зависнуть или вызвать OOM-killer, так как нет резервного хранилища.
3. zswap: Работает как прозрачный кэш перед обычным swap-устройством.
- Страница памяти → сжимается → помещается в пул zswap в RAM.
- Если пул zswap заполнен → наименее используемые сжатые страницы выгружаются (write-back) на физический диск.
- При чтении: если страница есть в zswap, она мгновенно распаковывается в RAM. Если нет – читается с диска.
Итог:
zswap дает лучшее из двух миров: скорость RAM и надежность дискового свопа как "последнего рубежа".
2. Выбор алгоритма сжатия
Ядро Linux поддерживает несколько алгоритмов.
Выбор зависит от баланса между скоростью CPU и степенью сжатия:
| Алгоритм | Скорость | Степень сжатия | Рекомендация |
|---|---|---|---|
| lz4 | (Очень быстро) | Низкая | Идеален для слабых CPU или когда важна минимальная задержка. |
| zstd | (Быстро) | Высокая | Рекомендуемый выбор по умолчанию в современных ядрах (5.x+). Отличный баланс. |
| lzo | (Средне) | Средняя | Устарел, лучше использовать lz4 или zstd. |
| zlib | (Медленно) | Очень высокая | Не рекомендуется для zswap, так как задержка сжатия может нивелировать выгоду. |
Рекомендация:
Используйте zstd для большинства современных систем или lz4, если у вас очень старый или слабый процессор.
3. Пошаговая настройка zswap
Шаг 1: Проверка текущего состояния
Узнайте, включен ли zswap и какие параметры используются:
cat /sys/module/zswap/parameters/enabled
# Должно вернуть: Y или N
cat /sys/module/zswap/parameters/compressor
cat /sys/module/zswap/parameters/max_pool_percent
cat /sys/module/zswap/parameters/zpool
Шаг 2: Включение и настройка через параметры ядра
Самый надежный способ настроить zswap – передать параметры ядру при загрузке через GRUB.
1. Откройте конфигурационный файл GRUB:
sudo nano /etc/default/grub
2. Найдите строку GRUB_CMDLINE_LINUX_DEFAULT и добавьте в нее следующие параметры:
zswap.enabled=1 zswap.compressor=zstd zswap.max_pool_percent=20 zswap.zpool=z3fold
Пояснение параметров:
zswap.enabled=1– включает zswap.zswap.compressor=zstd– устанавливает алгоритм сжатия (альтернатива:lz4).zswap.max_pool_percent=20– ограничивает размер пула zswap до 20% от общей RAM. Это предотвращает поглощение всей памяти самим кэшем. (Для систем с 8 ГБ RAM это ~1.6 ГБ, что обычно достаточно).zswap.zpool=z3fold– использует аллокатор памятиz3fold, который позволяет упаковывать до 3 сжатых страниц в один физический блок памяти, повышая эффективность использования RAM по сравнению со стандартнымzsmalloc. (Еслиz3foldне поддерживается вашим ядром, используйтеzsmalloc).
3. Обновите конфигурацию GRUB:
- Для Ubuntu/Debian:
sudo update-grub - Для Fedora/RHEL:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg(или/boot/efi/EFI/fedora/grub.cfgдля UEFI) - Для Arch Linux:
sudo grub-mkconfig -o /boot/grub/grub.cfg
4. Перезагрузите систему:
sudo reboot
Шаг 3: Проверка после перезагрузки
Убедитесь, что zswap активен и работает:
dmesg | grep zswap
# Ожидаемый вывод: zswap: loaded using pool zstd/z3fold
4. Тонкая настройка производительности (Tuning)
Настройка swappiness
Параметр vm.swappiness определяет, насколько агрессивно ядро будет использовать swap.
- По умолчанию:
60. - С включенным zswap вы можете оставить 60 или даже немного повысить его, так как "своп" теперь происходит в RAM и почти бесплатен по задержкам. Это позволит ядру активнее освобождать чистую память для кэша файловой системы, что ускорит общую работу системы.
- Если вы предпочитаете максимально держать данные в несжатой RAM, установите
10или30.
Для временной проверки:
sudo sysctl vm.swappiness=30
Для постоянного применения добавьте в /etc/sysctl.conf:
vm.swappiness=30
Включение или отключение writeback
По умолчанию zswap выгружает старые сжатые страницы на диск, когда пул заполняется (zswap.writeback=Y). Это хорошо для стабильности.
Если у вас очень медленный диск и вы хотите любой ценой избежать записи на него (готовы к риску OOM при экстремальной нехватке памяти), можно отключить writeback:
zswap.writeback=0
Но для 99% сценариев оставьте zswap.writeback=1 (по умолчанию).
5. Мониторинг эффективности zswap
Чтобы увидеть, сколько данных было сжато и сколько операций записи на диск было предотвращено, используйте debugfs.
1. Смонтируйте debugfs (если еще не смонтирован):
sudo mount -t debugfs none /sys/kernel/debug
2. Просмотрите статистику:
grep . /sys/kernel/debug/zswap/*
Ключевые метрики:
stored_pages: количество страниц, хранящихся в сжатом виде в RAM.pool_total_size: реальный размер, который занимает сжатый пул в RAM.written_back_pages: количество страниц, которые были выгружены на диск (если число растет медленно – zswap работает отлично).reject_compress_poor: страницы, которые не были сжаты достаточно хорошо и были отправлены напрямую на диск.
Для удобного мониторинга в реальном времени можно использовать простой скрипт:
watch -n 2 'grep . /sys/kernel/debug/zswap/*'
6. zswap vs zram: что выбрать?
| Характеристика | zswap | zram |
|---|---|---|
| Архитектура | Кэш перед дисковым swap | Отдельное блочное устройство вместо дискового swap |
| Защита от OOM | Высокая (есть резерв в виде диска) | Низкая (при переполнении RAM система падает) |
| Использование RAM | Динамическое, до max_pool_percent |
Фиксированный или динамический лимит, но всегда "съедает" часть RAM под swap |
| Лучший сценарий | Системы с медленным диском, ноутбуки, серверы с умеренной RAM | Устройства с крайне медленным eMMC/флеш-памятью (например, Raspberry Pi, старые Chromebook), где диск не должен использоваться вообще |
Совет:
Не используйте zswap и zram одновременно для одного и того же свопа – это создаст избыточное сжатие (сжатие сжатых данных) и пустую трату циклов CPU. Выберите один: zswap для универсальных ПК/серверов, zram для ультрабюджетных устройств без нормального диска.
7. Контрольный чек-лист
- Убедитесь, что у вас включен swap-файл или swap-раздел (zswap нуждается в "тыле").
- Включите
zswap.enabled=1с алгоритмомzstdи аллокаторомz3fold. - Установите
zswap.max_pool_percent=15или20. - Настройте
vm.swappiness=30(или оставьте 60, если хотите агрессивнее использовать кэш). - Проверьте статистику через
/sys/kernel/debug/zswap/после недели работы: еслиwritten_back_pagesрастет медленно, аstored_pagesстабилен – вы настроили систему идеально.
Эта конфигурация гарантирует, что ваша система будет тратить ничтожные доли процента времени CPU на сжатие, экономя при этом сотни миллисекунд задержки ввода-вывода и значительно продлевая срок службы SSD за счет снижения записи.
Мы делимся этой технической информацией, чтобы помочь вам в решении задач — используйте её с пониманием. Статья носит рекомендательный характер, поэтому, пожалуйста, применяйте описанные методы осмотрительно.