zswap (Русский)
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 с другим алгоритмом, нужно использовать параметр ядра, а соответствующий модуль ядра должен быть заранее загружен. Этого можно достичь, выполнив следующие шаги:
- Добавьте модули, относящиеся к выбранному алгоритму сжатия, в массив mkinitcpio (Русский)#MODULES.
- Пересоздайте образ ramdisk после изменения конфигурации mkinitcpio: смотрите mkinitcpio (Русский)#Создание загрузочного образа.
- Укажите выбранный алгоритм изменив
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