Zswap (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Zswap. Дата последней синхронизации: 26 марта 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Zswap — это функция ядра, предоставляющая сжатый кэш в оперативной памяти для страниц подкачки. Она перехватывает страницы памяти, выгружаемые в подкачку, и вместо выгрузки они сжимаются и сохраняются в пуле в ОЗУ. Когда пул заполняется или свободная память заканчивается, давно не использовавшиеся страницы (least recently used, LRU) разжимаются и выгружаются в подкачку, а сжатая её версия удаляется из пула.

Отличие от ZRAM в том, что zswap работает в связке с обычной подкачкой, в то время как zram — это самостоятельное устройство подкачки, которое расположено в ОЗУ и не требует использования обычной подкачки на диске.

Включение и выключение zswap

В официальном стабильном ядре linux zswap включен по умолчанию. Это управляется флагом CONFIG_ZSWAP_DEFAULT_ON в конфигурации ядра.

Чтобы отключить zswap в работающей системе, выполните следующую команду:

# echo 0 > /sys/module/zswap/parameters/enabled

Чтобы выключить zswap навсегда, добавьте zswap.enabled=0 в параметры ядра.

Совет: Также можно использовать systemd-swap — скрипт для управления подкачкой с файлом настроек /etc/systemd/swap.conf. Для его использования запустите и включите службу systemd-swap.service.

Настройка zswap

Текущие параметры

Zswap имеет несколько настраиваемых параметров. Посмотреть их текущие значения можно так:

$ grep -R . /sys/module/zswap/parameters
/sys/module/zswap/parameters/same_filled_pages_enabled:Y
/sys/module/zswap/parameters/enabled:Y
/sys/module/zswap/parameters/max_pool_percent:20
/sys/module/zswap/parameters/compressor:lz4
/sys/module/zswap/parameters/zpool:z3fold
/sys/module/zswap/parameters/accept_threshold_percent:90

Описание параметров доступно в документации zswap.

Посмотреть сообщение, отображающееся при загрузке системы, можно так:

# dmesg | grep zswap:
[    0.317569] zswap: loaded using pool lz4/z3fold

Изменение параметров

С помощью sysfs

Каждый параметр можно изменить в работающей системе через интерфейс sysfs. Например, для изменения параметра compressor:

# echo lz4 > /sys/module/zswap/parameters/compressor

С помощью параметров ядра

Чтобы сделать изменения постоянными, нужно указать соответствующие настройки в параметры ядра, например zswap.compressor=lz4. Таким образом, для постоянной установки всех вышеперечисленных параметров необходимо добавить следующие параметры ядра:

zswap.enabled=1 zswap.compressor=lz4 zswap.max_pool_percent=20 zswap.zpool=z3fold

При изменении алгоритма сжатия через параметр загрузки необходимо обеспечить раннюю загрузку соответствующего модуля сжатия во время загрузки (смотрите раздел #Алгоритм сжатия).

С помощью systemd-swap

Скрипт systemd-swap изменяет параметры через sysfs в процессе загрузки системы, основываясь на настройках, хранящихся в /etc/systemd/swap.conf.

Максимальный размер пула

Память для пула не выделяется заранее, он может расти до определённого предела в процентах от общего объёма доступной памяти, по умолчанию до 20%. При достижении этого порога страницы вытесняются из пула в устройство подкачки. Максимальный размер сжатого пула контролируется параметром max_pool_percent.

Распределитель пула сжатой памяти

Параметр zpool регулирует управление пулом сжатой памяти.

Распределитель zbud хранит 2 сжатых объекта в 1 странице памяти, что ограничивает коэффициент сжатия значением 2 или меньше.

Более совершенный распределитель z3fold[устаревшая ссылка 2022-09-23] позволяет хранить до 3 сжатых объектов в одной странице. Коэффициент сжатия при использовании z3fold обычно составляет в среднем 2,7, в то время как для zbud он равен 1,7.

По умолчанию создаётся zpool типа z3fold. С помощью параметра ядра zswap.zpool можно выбрать другой метод во время загрузки. Распределитель данных также можно изменить позднее через интерфейс sysfs.

Алгоритм сжатия

Для сжатия страниц zswap использует модули, предоставляемые криптографическим API ядра. По умолчанию используется алгоритм сжатия lz4, но можно выбрать другой алгоритм с помощью параметра ядра zswap.compressor. Доступны варианты deflate, lz4hc, lzo, lzo-rle, 842 и zstd.

Можно переключить алгоритм в работающей системе через sysfs или systemd-swap, но в этом случае zswap изначально запускается с lz4, а позже переключается на указанный алгоритм. Чтобы сразу запустить zswap с другим алгоритмом, нужно использовать параметр ядра, а соответствующий модуль ядра должен быть заранее загружен. Этого можно достичь, выполнив следующие шаги:

  1. Добавьте модули, относящиеся к выбранному алгоритму сжатия, в массив mkinitcpio (Русский)#MODULES.
  2. Пересоздайте образ ramdisk после изменения конфигурации mkinitcpio: смотрите mkinitcpio (Русский)#Создание загрузочного образа.
  3. Укажите нужное значение zswap.compressor в параметрах ядра.

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

Смотрите также