ZRAM
ZRAM — модуль ядра Linux, создает в ОЗУ блочное устройство, сжимаемое каким-либо алгоритмом. Как это устройство использовать — зависит от вашей фантазии. Самое частое использование — в качестве разделов подкачки.
Q: Я ранее использовал ZRAM, но скорость работы в его SWAP была ниже скорости работы в SWAP на SSD.
A: Довольно распространенный аргумент в Linux чатах от тех, кто перепробовал много способов настройки ZRAM из интернета. В Debian ZRAM отлично затюнили, вам остается только поправить несколько настроек — и вы получите быстрый SWAP, который практически не будет уступать по скорости работы ОЗУ даже на старых компьютерах (вроде Core2Duo). Впрочем, об оптимальных алгоритмах для старых и новых ПК поговорим ниже.
Q: У меня достаточно ОЗУ и я не хочу отдавать в резервирование ZRAM память и давать лишнюю нагрузку процессору.
A: Тоже довольно часто приходится это слышать, но ZRAM уже давно не отъедает фиксированный объем ОЗУ: пока в ZRAM устройство не пишутся данные — оно не занимает ОЗУ, следовательно, не помешает вам, если вы практически никогда не проваливаетесь в SWAP. При поступлении данных в ZRAM SWAP — начинается сжатие и потребление ОЗУ. Если коэффициент сжатия 1:2, то полезный объем будет в два раза больше потребляемого, а самый легковесный алгоритм сжатия (lz4) не заметит даже процессор десятилетней давности. Следовательно, ZRAM — не компромисс, а бонус.
Q: Где можно использовать ZRAM?
A: На десктопах, одноплатниках и серверах на Linux (кстати, на Fedora активен из коробки), на некоторых роутерах (на OpenWRT) и на смартфонах (например, на PostmarketOS, также, некоторые Android прошивки имеют активный ZRAM, например, LineageOS).
В этой статье поговорим об использовании ZRAM на компьютере с Debian. В Debian не принято что-либо предоставлять из коробки, поэтому ZRAM в нем выключен, а его утилиты — не установлены. В Debian wiki описано, как его настроить. Я попытаюсь рассказать подробней и популярней:
Так как ZRAM уже в ядре, нам остается его включить и немного настроить.
Ставим утилиты для управления ZRAM:
# apt update
# apt install zram-tools
Установились утилиты, создался конфиг /etc/default/zramswap, создался systemd unit zramswap.service для активации ZRAM. Сервис запустился, по умолчанию он enabled, следовательно, будет запускаться при старте системы.
Глянем на файл конфигурации:
# nano /etc/default/zramswap

Сверху в комментариях пояснения по скорости и степени компрессии алгоритмов: lz4 самый быстрый, а lzo самый медленный; zstd самый эффективный, а lz4 самый неэффективный. Также видим сообщение, что для просмотра всех алгоритмов поддерживаемых ядром надо выполнить соответствующую команду:
$ cat /sys/block/zram0/comp_algorithm

Видим алгоритмы, поддерживаемые установленным ядром (у меня Debian 12, ядро версии 6.1). Из не перечисленного в конфиге видим: lzo-rle — более производительный брат lzo с такой же степенью компрессии, он уже практически вытеснил lzo; lz4hc — брат lz4, который обеспечивает более лучшее сжатие, но также требует больше ресурсов процессора, зато скорость распаковки не пострадала и равна lz4.
Выбираем алгоритм:
- Все варианты lzo не имеют большого смысла на ПК, но иногда оправданы на ARM устройствах. Или на устройствах с мизерным объемом ОЗУ (например, роутер с OpenWRT и c ОЗУ 32 МБ), ибо с другими алгоритмами в таких условиях ZRAM SWAP скорее всего не инициализируется, а со старым добрым lzo все начнет работать;
- Если у вас медленный компьютер, выбирайте lz4. Или может быть у вас быстрый компьютер и достаточно ОЗУ, но вы не хотите тратить много процессорных ресурсов при уходе в SWAP, ибо уходите туда редко и не сильно? Тогда тоже выбирайте lz4. Примеры медленных компьютеров: Core2Duo E6600 (нахождение в SWAP с lz4 практически не заметно); Atom N570 (нахождение в SWAP с lz4 немного заметно, но сильно быстрее SWAP на SSD);
- Если у вас более-менее приличный компьютер, используйте zstd. Это очень мощный алгоритм, дающий в некоторых условиях 200+ процентов сжатия. Для него рекомендуется как минимум i5-i7 третьего-четвертого поколения.
С алгоритмом определились, и следующий вопрос — сколько ядер для работы забирает ZRAM? Ответ: на ПК — все. Для ПК это оптимальный вариант, в конфиге даже убрали соответствующую настройку. Но на роутерах и ARM устройствах (одноплатники, смартфоны) для ZRAM оптимально выделять только одно ядро. Выделение большего количества скорее всего отрицательно скажется на производительности.
Двигаемся дальше, и видим в конфиге PERCENT и SIZE. Не используйте их одновременно: используйте PERCENT чтобы задать максимальный процент использования ОЗУ или SIZE, чтобы задать максимальный объем явно. Лучшим выбором будет PERCENT, так как при изменении объема ОЗУ не потребуется править конфиг. Безопасным процентом является 50, тем не менее, при >= 2 ГБ ОЗУ 70 процентов тоже нормально. На своих компьютерах я выставляю 70. Но в Fedora и на Chromebooks рискуют из коробки делать 100%. Выше ставить рискованно, тем не менее, если вы знаете, что делаете, то и выше 100 процентов значения допустимы. В этом случае вы должны быть уверены, что алгоритм сможет сжать данные до соответствующей степени и не вылететь за границы доступной памяти.
Далее, видим в конфиге PRIORITY. Это приоритет раздела подкачки ZRAM. Он должен быть выше приоритета раздела подкачки, расположенного на диске (если такой имеется). Проверить приоритеты разделов подкачек можно командой:
# swapon -s
Вот и все основные опции. Остается только настроить значения в соответствии с вашими потребностями и перезапустить сервис ZRAM. Я привожу пример настройки слабого компьютера, поэтому выбираю lz4. ОЗУ у меня 4 ГБ, поэтому выставляю 70 процентов. Приоритет мне не нужен, ибо SWAP разделов сейчас в системе нет, тем не менее, раскомментирую, ибо в будущем дисковый SWAP раздел может появиться. lz4 и приоритет 100 в ZRAM и так являются опциями по умолчанию, но раскомментирование является хорошим тоном и гарантией неизменности настроек при обновлениях. По итогу получилось следующее:

Сохраняем изменения и перезапускаем сервис:
# systemctl restart zramswap.service
Проверяем результат:
# zramctl

$ free -h

Раньше раздела подкачки у меня не было вообще, теперь появился ZRAM раздел объемом в 70 процентов от ОЗУ.
Я использую ZRAM SWAP без раздела подкачки на диске, и в интернете многие рекомендуют так делать. И вот почему: предположим, что в системе есть ZRAM раздел подкачки и есть раздел подкачки на диске. При заполнении ОЗУ все полетит на раздел ZRAM SWAP, далее при заполнении ZRAM SWAP все полетит на подкачку диска. Когда заполнение ОЗУ нормализуется, данные из ZRAM SWAP и с дискового SWAP удалены не будут, ведь из SWAP не удаляются ненужные данные, пока в ОЗУ и на SWAP есть свободное место. Получается, что в ОЗУ (в ZRAM) останутся уже (скорее всего) не актуальные данные , и при следующем заполнении ОЗУ система сначала добьет место на дисковом разделе SWAP, и только потом начнет удалять данные с ZRAM SWAP, если это будет возможно.
Почему так происходит? Потому что система не знает, что раздел подкачки ZRAM практически такой же быстрый, как и ОЗУ, и соответственно, относится к нему как к обычному медленному SWAP на диске.
Избежать подобной ситуации можно, надо всего лишь не проваливаться в SWAP глубоко, а еще лучше — не использовать дисковый SWAP раздел при активном ZRAM SWAP (гибернация и гибридный сон в таком случае работать не будут, для их работы потребуется настроить использование неактивного SWAP раздела или отдельного файла).
А если хочется оставить SWAP раздел на диске, используйте ZSWAP.
ZSWAP
ОЗУ + ZRAM SWAP не хватает? Тогда мы переходим к ZSWAP. Он тоже является модулем ядра Linux. В отличии от ZRAM он работает в связке с обычным дисковым разделом подкачки. При попытке системы вытеснить страницу в SWAP, он сжимает ее, оставляя в ОЗУ. При окончании пула в ОЗУ он разжимает редко используемые страницы и сбрасывает их на дисковую подкачку. Также на дисковую подкачку поступают несжимаемые страницы. В итоге, мы существенно выигрываем по I/O и немного проигрываем по CPU. ZSWAP не создает в ОЗУ блочных устройств, поэтому его пул система не воспринимает как SWAP.
Приступим к настройке: для начала проверим, что ZRAM SWAP в системе отсутствует и его утилиты (и сервис) удалены, ибо использовать ZRAM и ZSWAP вместе неэффективно. Настройка ZSWAP выполняется несколькими параметрами ядра, и кратко описана в Debian wiki. Приведем более подробную инструкцию:
Чтобы не использовался менее эффективный распределитель сжатия страниц zbud, добавим в initrd модуль распределителя z3fold с модулем выбранного алгоритма сжатия. Для этого:
добавим z3fold и lz4 с новых строк соответственно в файл /etc/initramfs-tools/modules:
# nano /etc/initramfs-tools/modules

и пересоберем initrd:
# update-initramfs -u -k all
Теперь активируем ZSWAP: так как у ZSWAP отсутствуют утилиты настройки, нам нужно сказать ядру о том, что мы хотим включить модуль ZSWAP с определенными опциями. Следовательно, нам нужно передать параметры ядру. Параметры ядру передает загрузчик, загрузчик в Debian 12 — grub. Идем в конфиг утилиты конфигурирования граба:
# nano /etc/default/grub

Нас интересует переменная GRUB_CMDLINE_LINUX_DEFAULT, её значение будет отдано ядру как строка параметров (при загрузке в обычном режиме). Параметры ядра разделяются пробелами, поэтому, если в этой переменной уже что-то есть — отступаем пробел. Для включения ZSWAP c z3fold, lz4 и 25 процентным пулом в ОЗУ нам необходимо добавить параметры: zswap.enabled=1 zswap.compressor=lz4 zswap.max_pool_percent=25 zswap.zpool=z3fold. В этом случае при достижении 25 процентов пула в ОЗУ редко используемые страницы начнут разжиматься и вытесняться на дисковый SWAP. Разработчики не рекомендую выставлять значения > 30 процентов: если у вас < 2 ГБ ОЗУ, выставляйте <= 15 процентов, если >= 2 ГБ — выставляйте <= 30. По итогу, получилось следующее:

Сохраняем изменения и запускаем утилиту обновления конфигурации grub.
# grub-update
Перезагружаемся и проверяем результат:
ZSWAP (в отличии от ZRAM) не создает блочных устройств, а оперирует сжатием прямо в ОЗУ; также он не имеет утилит настройки и статуса. Поэтому, проверить работу ZSWAP можно только по логам, параметрам модуля в /sys/module/zswap/parametrs, или по отладочным данным ядра для модуля в /sys/kernel/debug/zswap/.
Проверяем параметр модуля enabled:
$ cat /sys/module/zswap/parametrs/enabled

Проверяем в сообщениях ядра:
# dmesg | grep zswap:

Настройка завершена.
Вывод:
Если вам хватает ZRAM SWAP — используйте ZRAM без дискового SWAP. Это быстрее, и немного продлит жизнь SSD.
Если вы проваливаетесь в SWAP довольно сильно и дисковый SWAP необходим — используйте ZSWAP.
Одновременное использование ZRAM SWAP и ZSWAP неэффективно.