zswap (Русский)

From ArchWiki

Состояние перевода: На этой странице представлен перевод статьи zswap. Дата последней синхронизации: 1 октября 2023. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

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

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

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

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

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

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

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

Настройка 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:zstd
/sys/module/zswap/parameters/non_same_filled_pages_enabled:Y
/sys/module/zswap/parameters/zpool:zsmalloc
/sys/module/zswap/parameters/exclusive_loads:N
/sys/module/zswap/parameters/accept_threshold_percent:90

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

Подробности о exclusive_loads параметре, которого на текущий момент нет в документации, написаны в комментарии к исходному коду ядра.

Посмотреть сообщение со статусом 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

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

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

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

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

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

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

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

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

В последних ядрах (старше 6.3.arch1-1) добавлен распределитель zsmalloc. Он хорошо работает в условиях малого количества доступной RAM и не тратит лишний раз память.

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

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

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

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

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

Статистика использования Zswap

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

# grep -r . /sys/kernel/debug/zswap
duplicate_entry:0
pool_limit_hit:13404213
pool_total_size:6184960 (pool size in total in pages)
reject_alloc_fail:5
reject_compress_poor:0
reject_kmemcache_fail:0
reject_reclaim_fail:13404213
stored_pages:4251 (pool size after compression)
written_back_pages:0

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