Zswap (Русский)

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

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

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

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

Совет: В ядрах linux-hardened, linux-lts, linux-rt и linux-rt-lts 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 с другим алгоритмом, нужно использовать параметр ядра, а соответствующий модуль ядра должен быть заранее загружен. Этого можно достичь, выполнив следующие шаги:

  1. Добавьте модули, необходимые для выбранного алгоритма сжатия, в массив mkinitcpio (Русский)#MODULES.
  2. Пересоберите образ initramfs.
  3. Укажите выбранный алгоритм, изменив 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

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

This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.