LinuxRuLinux без лишней теории
Память и подкачка

ZRAM и swap в Linux: как настроить память, чтобы система не тормозила

Редакция LinuxRu6 мин чтенияИнструкции

ZRAM в Linux создаёт сжатую подкачку прямо в оперативной памяти, и при нехватке RAM система не уходит в фризы с дисковым swap. Настраивается за пять минут через zram-generator: один конфиг на четыре строки, перезапуск службы и проверка командой zramctl. Ниже размеры, алгоритмы, swappiness и откат.

ZRAM и swap в Linux: как настроить память, чтобы система не тормозила
Фото: Peter Fiskerstrand, CC BY-SA 4.0, Wikimedia Commons
Содержание
  1. Разница
  2. Проверка
  3. По умолчанию
  4. zram-generator
  5. zram-tools
  6. Размер и алгоритм
  7. Swappiness
  8. ZRAM и диск
  9. Проблемы
  10. Откат
  11. Частые вопросы

ZRAM, zswap и обычный swap: в чём разница

Когда оперативная память заканчивается, ядро выгружает редко используемые страницы в подкачку. Вопрос только в том, куда именно.

  • Обычный swap это раздел или файл на диске. Объём большой, но на HDD и даже медленном SSD система при активной подкачке начинает заметно подтормаживать.
  • ZRAM создаёт в оперативной памяти сжатое блочное устройство /dev/zram0 и использует его как swap. Страницы сжимаются и остаются в RAM. Работает быстро, диск не изнашивается, но объём ограничен самой памятью.
  • zswap это сжатый кэш перед обычным swap на диске. Страницы сначала сжимаются в памяти, а когда кэш переполняется, самые старые уходят на диск. Без дискового swap zswap бесполезен.

Для домашнего компьютера с 4-16 ГБ памяти ZRAM обычно даёт самый заметный эффект: браузер с кучей вкладок и IDE перестают вызывать фризы. Нужна гибернация (сон с сохранением на диск) или регулярно заканчивается вообще вся память? Тогда понадобится и дисковый swap, о связке ниже.

Как посмотреть, что сейчас используется

# все активные области подкачки и их приоритеты
swapon --show

# устройства zram: алгоритм, размер, сколько данных и сколько они занимают
zramctl

# общая картина памяти
free -h

# включён ли zswap: Y или N
cat /sys/module/zswap/parameters/enabled

# текущее значение swappiness
sysctl vm.swappiness

В выводе zramctl столбец DATA показывает объём выгруженных данных до сжатия, COMPR после сжатия, TOTAL с учётом служебных структур. Отношение DATA к TOTAL и есть реальная экономия на вашей нагрузке.

Что настроено по умолчанию в популярных дистрибутивах

ДистрибутивПодкачка из коробкиПакет для ZRAM
Fedora 44ZRAM через zram-generator, размер min(ram, 8192) МБ, дискового swap нетzram-generator, уже стоит
Ubuntu 26.04 LTSфайл подкачки на диске, ZRAM не включёнsystemd-zram-generator или zram-tools
Debian 13раздел или файл swap, если создан в установщикеsystemd-zram-generator или zram-tools
Arch Linuxчто сами создали, zswap в ядре включён по умолчаниюzram-generator

Значения в Ubuntu и Debian зависят от варианта установки, поэтому всегда сверяйтесь с swapon --show на своей машине.

Настройка ZRAM через zram-generator

zram-generator это официальный инструмент systemd: он читает конфиг при загрузке, создаёт устройство и включает подкачку. Способ одинаков во всех дистрибутивах.

# Debian, Ubuntu
sudo apt install systemd-zram-generator

# Arch Linux
sudo pacman -S zram-generator

# Fedora: уже установлен, пакет zram-generator

Создайте файл /etc/systemd/zram-generator.conf:

[zram0]
# половина памяти, но не больше 8 ГБ
zram-size = min(ram / 2, 8192)
compression-algorithm = zstd
swap-priority = 100

Применить без перезагрузки:

sudo systemctl daemon-reload
sudo systemctl restart systemd-zram-setup@zram0.service
zramctl

Выражение zram-size считается в мегабайтах, ram подставляется автоматически. Без этой строки генератор берёт min(ram / 2, 4096). В Fedora файл в /etc переопределяет системный /usr/lib/systemd/zram-generator.conf. Если служба не поднялась, смотрите systemctl status systemd-zram-setup@zram0, разбор типовых ошибок есть в статье о упавших службах systemd.

Вариант для Debian и Ubuntu: пакет zram-tools

Более старый, но простой способ. Пакет zram-tools ставит службу zramswap с конфигом в /etc/default/zramswap.

sudo apt install zram-tools
sudoedit /etc/default/zramswap

В файле достаточно двух строк:

ALGO=zstd
PERCENT=50
sudo systemctl restart zramswap
swapon --show

Не ставьте zram-tools и systemd-zram-generator одновременно: оба попытаются занять /dev/zram0.

Какой размер и алгоритм сжатия выбрать

Размер ZRAM задаёт предел несжатых данных, которые можно туда положить. Память выделяется не сразу, а по мере заполнения, поэтому устройство на 8 ГБ при пустом swap почти ничего не стоит.

  • 2-4 ГБ RAM: ZRAM на 100 процентов памяти вполне разумен, система будет держать больше вкладок и программ.
  • 8-16 ГБ: половина памяти или настройка Fedora min(ram, 8192).
  • 32 ГБ и больше: ZRAM почти не нужен, но и не мешает. 4-8 ГБ хватит как подушки.

Алгоритмы: zstd сжимает сильнее и подходит почти всем, lz4 быстрее и меньше нагружает слабый процессор, lzo-rle исторический вариант по умолчанию во многих ядрах. Какие доступны на вашем ядре, видно в cat /sys/block/zram0/comp_algorithm, текущий отмечен квадратными скобками. На очень старом двухъядерном ноутбуке попробуйте lz4, на остальном оставьте zstd. Советы по выбору системы для такого железа собраны в подборке Linux для слабого компьютера.

Swappiness и другие параметры ядра для ZRAM

Значение vm.swappiness по умолчанию 60 рассчитано на медленный дисковый swap. Для ZRAM выгрузка дешёвая, поэтому ядру можно разрешить активнее ей пользоваться: допустимый диапазон 0-200. Набор ниже советуют в ArchWiki, он взят из Pop!_OS:

# /etc/sysctl.d/99-zram.conf
vm.swappiness = 180
vm.watermark_boost_factor = 0
vm.watermark_scale_factor = 125
vm.page-cluster = 0
sudo sysctl --system
sysctl vm.swappiness

page-cluster = 0 отключает чтение страниц пачками, для памяти это бессмысленно. Если после изменения система ведёт себя хуже, просто удалите файл и снова выполните sudo sysctl --system.

Меняйте по одному параметру за раз и проверяйте на своей обычной нагрузке: браузер, мессенджеры, IDE или игра. Сравнивайте не цифры в free, а ощущение: пропали ли фризы при переключении окон. Красивое значение swappiness, найденное на форуме, может не подойти вашей машине.

ZRAM вместе с дисковым swap и гибернацией

ZRAM и дисковый swap прекрасно уживаются: ядро сначала использует область с большим приоритетом. Для ZRAM ставим 100, для диска меньше, например 10.

# файл подкачки на ext4
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon --priority 10 /swapfile

# на Btrfs файл создаётся отдельной командой
sudo btrfs subvolume create /swap
sudo btrfs filesystem mkswapfile --size 8g /swap/swapfile
sudo swapon --priority 10 /swap/swapfile

Для постоянного подключения добавьте строку в /etc/fstab:

/swapfile none swap defaults,pri=10 0 0

Гибернация в ZRAM невозможна: содержимое памяти при выключении теряется. Для неё нужен дисковый swap размером не меньше занятой памяти и настроенный параметр resume. Если вы держите и zswap, и ZRAM, zswap лучше выключить параметром ядра zswap.enabled=0, иначе страницы будут сжиматься дважды. Как выделить место под отдельный раздел подкачки, описано в статье про разметку диска.

Если ZRAM не помог или не запустился

  • После перезагрузки zramctl пустой. Проверьте systemctl status systemd-zram-setup@zram0 и наличие модуля командой modinfo zram. В самосборных и некоторых облачных ядрах модуль zram выключен.
  • Устройство есть, но swapon его не показывает. Скорее всего, одновременно стоят zram-tools и zram-generator и мешают друг другу. Оставьте один инструмент.
  • Система всё равно намертво зависает. ZRAM откладывает нехватку памяти, но не отменяет её. Когда сжатый swap заполнен, работу должен спасать убийца процессов: в Fedora и Ubuntu это systemd-oomd, проверить его можно командой oomctl. На других системах поставьте пакет earlyoom.
  • Процессор нагружен, ноутбук греется. Сжатие стоит тактов. Переключитесь на lz4 или уменьшите размер ZRAM. Другие способы снизить нагрев и расход заряда описаны в советах про батарею ноутбука.
  • Swap растёт, хотя память не кончилась. С высоким swappiness так и должно быть: ядро заранее сжимает неактивные страницы и оставляет место под кэш файлов.

Как отключить ZRAM и вернуть всё как было

# выключить подкачку на zram прямо сейчас
sudo swapoff /dev/zram0

# zram-generator: удалить свой конфиг
sudo rm /etc/systemd/zram-generator.conf

# Fedora: пустой конфиг отключает ZRAM по умолчанию
sudo touch /etc/systemd/zram-generator.conf

# zram-tools
sudo systemctl disable --now zramswap

# убрать свои параметры sysctl
sudo rm /etc/sysctl.d/99-zram.conf
sudo sysctl --system

После перезагрузки проверьте swapon --show: в списке должен остаться только дисковый swap или ничего. Подробное описание модуля, всех атрибутов в /sys/block/zram0 и режима writeback есть в документации ядра по zram.

Частые вопросы

Нужен ли swap, если стоит ZRAM?

Для обычной работы ZRAM достаточно. Дисковый swap нужен для гибернации и как запас, если память регулярно заканчивается полностью.

Сколько памяти отдавать под ZRAM?

Обычно половину RAM, на 2-4 ГБ можно до 100 процентов. Память занимается только по мере заполнения устройства.

Чем ZRAM отличается от zswap?

ZRAM это самостоятельное сжатое устройство подкачки в памяти. zswap это сжатый кэш перед дисковым swap и без него не работает.

Какой алгоритм сжатия выбрать?

zstd для большинства машин. На слабых процессорах можно попробовать lz4, он быстрее, но сжимает слабее.

Работает ли гибернация с ZRAM?

Нет, содержимое ZRAM пропадает при выключении. Для гибернации нужен дисковый swap размером не меньше используемой памяти.

Документация и источники

Читайте также

Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.