Zram и zswap помогают пережить нехватку RAM без срочной покупки новых модулей памяти.
Память дорожает, а значит Linux снова подталкивает пользователей к старому, но очень полезному вопросу: как выжать больше из уже установленной RAM, не покупая новые модули. В такой момент особенно полезно вспомнить о двух встроенных механизмах сжатия памяти, zram и zswap. Первый вариант давно знаком многим владельцам Linux-систем, второй обсуждают заметно реже, хотя на обычных ПК и ноутбуках второй подход нередко оказывается даже практичнее.
Оба механизма опираются на swap, то есть на область подкачки, куда ядро отправляет часть данных, когда свободная оперативная память заканчивается. Команда swapon включает устройства и файлы, которые система использует для paging и swapping. Логика подкачки проста: ядро убирает из RAM страницы, которые сейчас не нужны, освобождает место для активных задач, а затем при необходимости возвращает данные обратно. Проблема в том, что накопитель работает намного медленнее оперативной памяти, поэтому активный swap почти всегда делает систему менее отзывчивой.
Поэтому популярная идея «памяти много, swap не нужен» обычно приносит больше вреда, чем пользы. Даже мощной машине полезен запасной клапан на случай неожиданной нагрузки, скачка потребления памяти или неудачно запущенного приложения. Swap нужен не для постоянной работы в аварийном режиме, а для устойчивости системы в неприятный момент.
В Linux по-прежнему есть два базовых варианта подкачки: swap-файл или отдельный swap-раздел. Для большинства современных систем разница между ними уже не выглядит критичной, поэтому выбор чаще упирается в удобство конфигурации. Дальше начинается самое интересное, потому что zram и zswap решают одну задачу разными путями.
zram создает в памяти сжатое блочное устройство. Ядро пишет страницы в такой RAM-диск, сжимает содержимое и держит данные прямо в оперативной памяти. В документации ядра сказано, что страницы, записанные на zram-устройства, сжимаются и хранятся в самой памяти, а использовать zram можно в том числе как swap. В типичной конфигурации доступные алгоритмы сжатия показываются через comp_algorithm, и среди них часто выбран LZ4. Управлять устройствами можно через sysfs или с помощью утилиты zramctl.
На словах подход кажется странным: система будто перекладывает память в память. На практике смысл вполне земной. Вместо медленной записи на диск Linux сжимает менее важные данные и удерживает их в RAM в более компактном виде. Когда данные снова понадобятся, ядро просто распакует содержимое обратно. Если процессор достаточно быстрый, задержка оказывается заметно ниже, чем при чтении и записи на накопитель. Такой подход особенно полезен на слабых устройствах с медленным хранилищем, например на одноплатных компьютерах, системах с eMMC и машинах, загружающихся с microSD.
При желании zram может не только дополнять обычный swap, но и частично брать его роль на себя. Для машин с небольшим объемом памяти или с накопителем, который не хочется лишний раз нагружать записью, такой вариант часто оказывается самым разумным.
zswap работает иначе. Документация ядра описывает механизм как lightweight compressed cache for swap pages. Иначе говоря, zswap не заменяет swap на диске, а встраивается перед ним как сжатый кэш. Когда системе нужно выгрузить страницу в подкачку, zswap сначала пытается сжать данные и поместить их в динамически выделяемый пул в RAM. Только если пул переполняется, старые страницы по LRU уходят на backing swap device. Такой обмен CPU-ресурсов на уменьшение swap I/O способен заметно улучшать производительность, если чтение из сжатого кэша оказывается быстрее чтения с устройства подкачки.
Для настольного Linux такой подход часто выглядит особенно привлекательно. zswap помогает смягчить последствия нехватки RAM, уменьшает нагрузку на swap и способен заметно сократить число записей на SSD. Включать механизм можно параметром ядра zswap.enabled= через загрузчик. В системах с GRUB правка обычно сводится к изменению параметров загрузки. В конфигурациях с systemd-boot задача решается похожим способом через параметры загрузки.
Главный практический вывод очень простой. zram и zswap не стоит включать одновременно в надежде получить двойную выгоду. Оба механизма борются с одной и той же проблемой за счет сжатия памяти, поэтому параллельная работа чаще добавляет накладные расходы и съедает преимущества. Для Raspberry Pi, компактных систем и слабых устройств с медленным накопителем чаще логичнее смотреть в сторону zram. Для обычного ноутбука или настольного ПК нередко удобнее и чище выглядит zswap.
Итог у истории вполне практичный. Пока цена на память растет, Linux уже предлагает встроенные инструменты, которые помогают растянуть возможности установленной RAM без апгрейда. zram сжимает данные и держит их в самой памяти. zswap старается как можно реже доводить дело до медленного swap на накопителе. Для пользователя результат выглядит просто: меньше тормозов, меньше лишних операций записи и более устойчивая система в момент, когда свободная память почти закончилась.