Вступление
Данная статья написана с целью концентрации знаний о сжатии данных оперативной памяти.
Я использую gentoo, поэтому имена пакетов будут приводиться в формате этого дистрибутива.
Подразумевается, что читающий имеет желание и возможность (одно из):
- произвести конфигурацию и/или сборку ядра;
- в случае отсутствия искомой функциональности в «ванильном» - найти и использовать ядро, в котором уже всё есть.
zram
zram это, если описать попроще, tmpfs со сжатием.
Необходимо включить zram в ядре: CONFIG_ZRAM=m
(или =y, но настоятельно рекомендуется загружать как модуль), либо в menuconfig:
Device Drivers --->
[*] Block devices --->
<M> Compressed RAM block device support
Также стоит обратить внимание на другие доступные опции конфигурации, например - метод компрессии ZRAM_BACKEND_XXX
.
Важно заметить, что zram может использоваться как простое блочное устройство и как приоритетный своп, аналогично zswap (см. ниже). В случае последнего необходимо собирать модуль с опцией CONFIG_ZRAM_WRITEBACK
, которая позволяет отгружать данные из zram-девайса на ФС.
Наличие zram можно проверить по наличию модуля zram
(только если zram собран модулем) или существованию /dev/zramX
(если модуль загружен или zram вшит в ядро).
Утилита zramctl
входит в состав sys-apps/util-linux
(которая, скорее всего, уже стоит в системе), с её помощью можно создать юзабельный zram диск. Описание утилиты можно прочитать на man 8 zramctl
.
Одновременно может существовать несколько устройств zram, каждое со своей собственной конфигурацией (объём, путь, права, writeback итд). Для zram есть вспомогательные проекты, например sys-apps/zram-generator
и sys-block/zram-init
, которые упрощают конфигурацию функциональности, но использовать их не является строгой необходимостью.
Ряд полезных инструкций можно найти тут: арчвики, гентувики.
zswap
zswap представляет из себя прослойку между RAM и swap: вместо простой выгрузки неактивных страниц в своп, сначала они подвергаются компрессии и помещаются в отдельное виртуальное хранилище в оперативной памяти; затем данные страницы выгружаются в своп при нехватке RAM или заполнении данного хранилища и при выгрузке производится декомпрессия.
Необходимо включить zswap в ядре: CONFIG_ZSWAP=y
, либо в menuconfig:
Memory Management options --->
[*] Support for paging of anonymous memory (swap) --->
[*] Compressed cache for swap pages
Также стоит обратить внимание на другие доступные опции конфигурации, например - выбрать дефолтные метод компрессии CONFIG_ZSWAP_COMPRESSOR_DEFAULT_XXX
и аллокатор CONFIG_ZSWAP_ZPOOL_DEFAULT_XXX
.
Проверить сессию на наличие zswap можно несколькими способами:
-
# dmesg | grep zswap
-
$ grep -r . /sys/module/zswap/parameters/
Настройку параметров можно производить либо в рантайме (через манипуляцию параметров в /sys/module/zswap/parameters/max_pool_percent
), либо в параметрах загрузки ядра. Доступные параметры и их расшифровка описаны здесь: https://docs.kernel.org/admin-guide/mm/zswap.html
Если используешь не очень старую версию htop, то там эта память будет учитываться в общих графах compressed и frontswap.
Если используются одновременно zswap и zram (конкректно для swap), то лучше выбрать что-то одно, особенно при использовании ZRAM_WRITEBACK
.
KSM
Kernel Samepage Merging - технология дедупликации одинаковых страниц памяти. Не является непосредственно сжатием, но позволяет получить больше свободной RAM, так что пусть тут будет.
На ядро должен быть наложен патч UKSM.
Необходимо включить KSM в ядре: CONFIG_KSM=y
, либо в menuconfig:
Memory Management options --->
[*] Enable KSM for page merging
Проверить сессию на присутствие и работоспособность KSM можно через проверку в /sys, например:
$ grep -r . /sys/kernel/mm/ksm
Если ядро настроено корректно, то каталог /sys/kernel/mm/ksm
должен существовать и значение /sys/kernel/mm/ksm/run
быть «1».
Слияние памяти происходит только для процессов, помеченных madvise()
. Так как ручками мы делать это не будем, далее стоит установить sys-process/uksmd
. Данный демон работает в фоне и производит инициализацию слияния автоматически, достаточно закрепить его в системе как сервис.
Послесловие
Надеюсь, что тебе понравилось читать эту статью настолько же, насколько мне нравилось её писать.
Предложения/исправления/дополнения приветствуются.
Форумчанин kirill_rrr произвёл бенчмарк разных наборов конфигураций zram, swap и zswap в 2023.