Подробный гайд по zswap: ускоряем Linux, заменяя запись на диск быстрым сжатием данных в RAM

Ускорьте Linux: zswap сжимает данные в RAM быстрее, чем диск их записывает. Это снижает износ SSD, устраняет лаги при нехватке памяти и экономит ресурсы.

2026.07.19                  


Подробный гайд по zswap: ускоряем Linux, заменяя запись на диск быстрым сжатием данных в RAMПодробный гайд по 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. Контрольный чек-лист

  1. Убедитесь, что у вас включен swap-файл или swap-раздел (zswap нуждается в "тыле").
  2. Включите zswap.enabled=1 с алгоритмом zstd и аллокатором z3fold.
  3. Установите zswap.max_pool_percent=15 или 20.
  4. Настройте vm.swappiness=30 (или оставьте 60, если хотите агрессивнее использовать кэш).
  5. Проверьте статистику через /sys/kernel/debug/zswap/ после недели работы: если written_back_pages растет медленно, а stored_pages стабилен – вы настроили систему идеально.

Эта конфигурация гарантирует, что ваша система будет тратить ничтожные доли процента времени CPU на сжатие, экономя при этом сотни миллисекунд задержки ввода-вывода и значительно продлевая срок службы SSD за счет снижения записи.


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


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

Комментарии

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