zswap (Русский) - ArchWiki

Jump to content
From ArchWiki

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

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

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

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

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

- 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 (Русский)