Zswap (Русский)
zswap — это функция ядра, предоставляющая сжатый кэш в оперативной памяти для страниц подкачки. Она перехватывает страницы памяти, выгружаемые в подкачку, и вместо выгрузки они сжимаются и сохраняются в пуле в ОЗУ. Когда пул заполняется или свободная память заканчивается, давно не использовавшиеся страницы (LRU) разжимаются и выгружаются в подкачку на диске, а затем их сжатые версии удаляются из пула.
Отличие от zram в том, что zswap работает в связке с обычной подкачкой, в то время как zram с созданным на нём swap — это самостоятельное устройство подкачки, которое расположено в ОЗУ и не требует использования обычной подкачки на диске.
Включение и выключение zswap
zgrep CONFIG_ZSWAP_DEFAULT_ON /proc/config.gz
.В ядре linux zswap по умолчанию отключен. Для его переключения во время работы системы запишите 1
для включения или 0
для отключения в файл /sys/module/zswap/parameters/enabled
. Изменения будут действовать до перезагрузки. Пример команды для отключения:
# echo 0 > /sys/module/zswap/parameters/enabled
Чтобы включить zswap навсегда, добавьте zswap.enabled=1
в параметры ядра. Чтобы выключить 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 zstd/zsmalloc
Изменение параметров
С помощью 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.
Начиная с версии ядра 6.3, доступен новый распределитель zsmalloc. Он хорошо работает в условиях малого количества доступной RAM и не тратит лишний раз память.
По умолчанию создаётся zpool типа zsmalloc. С помощью параметра ядра zswap.zpool
можно выбрать другой распределитель во время загрузки. Распределитель данных также можно изменить позднее через интерфейс sysfs.
Алгоритм сжатия
Для сжатия страниц zswap использует модули, предоставляемые криптографическим API ядра. В официальных ядрах по умолчанию используется алгоритм сжатия zstd, но можно выбрать другой алгоритм с помощью параметра ядра zswap.compressor=
. Доступны варианты deflate, lzo, 842, lz4 и lz4hc.
Можно переключить алгоритм в работающей системе через sysfs, но в этом случае zswap изначально запускается с zstd, а позже переключается на указанный алгоритм. Чтобы сразу запустить zswap с другим алгоритмом, нужно использовать параметр ядра, а соответствующий модуль ядра должен быть заранее загружен. Этого можно достичь, выполнив следующие шаги:
- Добавьте модули, необходимые для выбранного алгоритма сжатия, в массив mkinitcpio (Русский)#MODULES.
- Пересоберите образ initramfs.
- Укажите выбранный алгоритм, изменив
zswap.compressor=
в параметрах ядра.
При следующей загрузке посмотрите #Текущие параметры, чтобы проверить, использует ли zswap нужный алгоритм сжатия.
Статистика использования zswap
Чтобы посмотреть статистику zswap, используйте следующую команду:
# grep -r . /sys/kernel/debug/zswap
/sys/kernel/debug/zswap/same_filled_pages:26274 /sys/kernel/debug/zswap/stored_pages:159898 /sys/kernel/debug/zswap/pool_total_size:171565056 /sys/kernel/debug/zswap/written_back_pages:787323 /sys/kernel/debug/zswap/reject_compress_poor:0 /sys/kernel/debug/zswap/reject_compress_fail:15860 /sys/kernel/debug/zswap/reject_kmemcache_fail:0 /sys/kernel/debug/zswap/reject_alloc_fail:0 /sys/kernel/debug/zswap/reject_reclaim_fail:31 /sys/kernel/debug/zswap/pool_limit_hit:0