Jump to content
From ArchWiki

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

Ссылки по теме

- Параметры ядра
- Mkinitcpio (Русский)

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` в параметры ядра.

## Настройка 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

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

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

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

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

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

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

Более совершенный распределитель z3fold позволяет хранить до 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, но в этом случае zswap изначально запускается с lz4, а позже переключается на указанный алгоритм. Чтобы сразу запустить zswap с другим алгоритмом, нужно использовать параметр ядра, а соответствующий модуль ядра должен быть заранее загружен. Этого можно достичь, выполнив следующие шаги:

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

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

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

- zswap: How to determine whether it is compressing swap pages?.
- IBM Support Article "New Linux zswap compression functionality" (benchmarks images do not load).
- Ask Ubuntu: zram vs. zswap vs. zcache.
- Arch Linux forum thread.
- LWN.net technical article by the main developer of zswap.

Category:

- Kernel (Русский)