ZRAM/ZSWAP: различия между версиями
Дым (обсуждение | вклад) |
Дым (обсуждение | вклад) (→ZSWAP) |
||
Строка 1: | Строка 1: | ||
=ZSWAP= | =ZSWAP= | ||
{{W|zswap}} | {{W|zswap}} | ||
Модуль ядра Linux, который сжимает данные, перехватывая попытки записи страниц памяти в swap-раздел на диске. | |||
Интегрирован в поставку ядра начиная с версии 3.11. Использует алгоритмы сжатия, предоставляемые модулем Linux Crypto API. | Интегрирован в поставку ядра начиная с версии 3.11. Использует алгоритмы сжатия, предоставляемые модулем Linux Crypto API. | ||
Увеличивает скорость подкачки страниц памяти в системе путём предотвращения выгрузки их на физический носитель, сжимая страницы и размещая их в оперативке до тех пор, пока не появится необходимость использовать реальный файл подкачки на накопителе. Фактически выступает кэшем страниц между памятью и разделом подкачки. Страницы, выгружаемые в реальный раздел не сжимаются. За счет того, что сжатая страница кэшируется в памяти и даже может быть никогда не выгружена в реальный раздел подкачки, уменьшается количество операций ввода-вывода, а следовательно, уменьшается износ физических носителей, что особенно актуально для SSD. | |||
{{Примечание|Для работы этой технологии необходим подмонтированный своп-раздел — без него zswap не работает.}} | |||
{{Примечание|Для работы этой технологии необходим подмонтированный своп-раздел — без него zswap не работает | |||
Включить её можно, конечно, параметром ядра, но вовсе не обязательно — достаточно отправить правильную букву в нужный файл: | Включить её можно, конечно, параметром ядра, но вовсе не обязательно — достаточно отправить правильную букву в нужный файл: | ||
# echo Y >/sys/module/zswap/parameters/enabled | # echo Y >/sys/module/zswap/parameters/enabled |
Версия от 10:44, 15 июля 2023
ZSWAP
Модуль ядра Linux, который сжимает данные, перехватывая попытки записи страниц памяти в swap-раздел на диске.
Интегрирован в поставку ядра начиная с версии 3.11. Использует алгоритмы сжатия, предоставляемые модулем Linux Crypto API.
Увеличивает скорость подкачки страниц памяти в системе путём предотвращения выгрузки их на физический носитель, сжимая страницы и размещая их в оперативке до тех пор, пока не появится необходимость использовать реальный файл подкачки на накопителе. Фактически выступает кэшем страниц между памятью и разделом подкачки. Страницы, выгружаемые в реальный раздел не сжимаются. За счет того, что сжатая страница кэшируется в памяти и даже может быть никогда не выгружена в реальный раздел подкачки, уменьшается количество операций ввода-вывода, а следовательно, уменьшается износ физических носителей, что особенно актуально для SSD.
Включить её можно, конечно, параметром ядра, но вовсе не обязательно — достаточно отправить правильную букву в нужный файл:
# echo Y >/sys/module/zswap/parameters/enabled
Юнит запуска/перезапуска/остановки:
/lib/systemd/system/zswap.service |
---|
[Unit]
Description = Enable and configure zswap
DefaultDependencies = no
After = multi-user.target
[Service]
ExecStart = /usr/bin/zswap on
ExecStop = /usr/bin/zswap off
RemainAfterExit = yes
[Install]
WantedBy = swap.target
|
Посмотреть текущие настройки и статистику можно скриптом, разместив его по доступному для рута пути, соответствующему значению в юните:
/usr/bin/zswap |
---|
#!/bin/sh
LANG=en_US.UTF-8
MODUL=/sys/module/zswap
DEBUG=/sys/kernel/debug/zswap
SWTCH=$MODUL/parameters/enabled
SWAPS=`swapon | grep -cv zram`
ZRAMS=`swapon | grep -c zram`
Protect(){
echo "$1"
exit 1
}
Show(){
printf "========\n$1\n========\n"
grep -R . $2 2>&1 | sed '/uevent/d;/\/enabled/d;s|_percent|, %|;s|.*/||;s|:|: |;s|_| |g'
}
case $1 in # switch zswap on/off
1|Y|y|on) [ $ZRAMS -gt 0 ] && Protect "can't start: zram-swap is already in use"
[ $SWAPS -lt 2 ] && Protect "swap partition not found"
echo Y >$SWTCH;;
0|N|n|off) echo N >$SWTCH
esac
case `cat $SWTCH` in # is zswap in use?
N) echo zswap disabled ;;
Y) Show Settings $MODUL
Show Stats $DEBUG
PAGE=`cat $DEBUG/stored_pages`
POOL=`cat $DEBUG/pool_total_size`
[ $POOL -gt 0 ] &&
printf "compression ratio: %s\n" `echo "scale=2;4096*$PAGE/$POOL" | bc` ||
printf "\nzswap is not in use\n"
esac
|
Пример вывода скрипта |
---|
# zswap
========
Settings
========
same filled pages enabled: Y
enabled: Y
max pool, %: 20
compressor: zstd
zpool: zbud
accept threshold, %: 90
========
Stats
========
same filled pages: 1247
stored pages: 14351
pool total size: 26836992
duplicate entry: 0
written back pages: 0
reject compress poor: 0
reject kmemcache fail: 0
reject alloc fail: 0
reject reclaim fail: 0
pool limit hit: 0
compression ratio: 2.19
|
ZRAM
zRam — модуль ядра Linux (ранее известный как compcache). Он создаёт в оперативной памяти сжатое блочное устройство (другими словами, RAM-диск со сжатием данных "на лету"), которое может использоваться, например, как устройство подкачки страниц, хранения временных файлов (/tmp) или же просто как RAM-диск общего назначения.
Хотя стоимость оперативной памяти сейчас относительно низкая, zRam всё же позволяет получить преимущества на компьютерах с малым количеством оперативной памяти, при виртуализации и во встраиваемых системах, использующих флеш-память, которая имеет ограниченное количество циклов перезаписи.[1] Скорость обмена с оперативной памятью выше, чем с жёстким диском, поэтому zRam, с учётом сжатия, как правило, позволяет Linux'у повысить производительность. При этом использование алгоритмов сжатия увеличивает нагрузку на центральный процессор, но освобождает значительное количество оперативной памяти по сравнению с использованием обычного RAM-диска.
Использует алгоритмы сжатия, предоставляемые модулем Linux Crypto API. По умолчанию это обычно LZO или LZ4.
zram часто путают со сходным модулем zswap, который сжимает данные, перехватывая попытки записи страниц памяти в swap-раздел на диске.
В отличие от zswap, zram-устройство, использующееся в качестве раздела подкачки страниц памяти, до версии ядра 4.14 не имело возможности выгружать страницы памяти в какое-либо резервное хранилище.
Начиная с версии ядра 4.14 пользователь имеет возможность указать для zram-устройства любое другое блочное устройство в качестве резервного хранилища, в которое могут выгружаться несжимаемые/неиспользуемые страницы памяти. При этом выгрузка страниц в резервное хранилище происходит в несжатом виде и, в отличие от zswap, только по команде администратора системы
Недостатки zram как раздела подкачки
При наличии в системе нескольких разделов подкачки zram-устройство, использующееся в качестве раздела подкачки страниц памяти, будет иметь более высокий приоритет, таким образом все выгружаемые страницы попадут в первую очередь в zram-устройство. При переполнении этого раздела вновь выгружаемые страницы будут попадать в следующие, более медленные, swap-разделы, в результате чего появляется высокая вероятность возникновения LRU-инверсии.
Таким образом, использование zram-устройства в качестве раздела подкачки страниц имеет смысл при отсутствии в системе разделов подкачки других типов.
Настройка
В дистрибутиве уже есть пакет по фамилии alterator-zram-swap
для работы этого типа оптимизации памяти, но он:
- несколько выморочно высчитывает желаемый размер сжатого свопа;
- не учитывает уже, возможно, задействованной и несовместимой с ним технологии
zswap
(см. п. выше); - обременён двумя отдельными скриптами запуска и останова службы, когда достаточно одного на всё про всё.
Пакет, в общем-то, и не нужен: достаточно всего пары файлов — юнита и скрипта к нему. Ниже приведён мой вариант обоих, не из пакета.
Юнит:
/lib/systemd/system/zram-swap.service |
---|
[Unit]
Description = Enable and configure zram-swap module
DefaultDependencies = no
After = multi-user.target
[Service]
ExecStop = /usr/bin/zram-swap stop
ExecStart = /usr/bin/zram-swap start
ExecReload = /usr/bin/zram-swap restart
RemainAfterExit = yes
[Install]
WantedBy = swap.target
|
Скрипт:
/usr/bin/zram-swap |
---|
#!/bin/sh
COEFF=512 # Использовать половину ОЗУ (за счёт сжатия получится меньше четверти).
#COEFF=1024 # Использовать ОЗУ полностью (за счёт сжатия получится меньше половины).
COMPRESS=lz4
PART=zram0
DEV=/dev/$PART
SYSDIR=/sys/block/$PART
ALGO=$SYSDIR/comp_algorithm
ZSWAP=`cat /sys/module/zswap/parameters/enabled`
start(){
[ "$ZSWAP" == "Y" ] && echo "can't start: zswap is already in use" || {
modprobe -q zram
grep -q $COMPRESS $ALGO && echo $COMPRESS >$ALGO
awk '/MemTotal/{printf "%.0f\n",$2*'$COEFF'}' /proc/meminfo >$SYSDIR/disksize
mkswap $DEV -L $PART &>/dev/null
swapon -p 100 $DEV
}
}
stop(){
ZRAM=`awk '/zram/{print $1}' /proc/swaps`
[ -z "$ZRAM" ] || {
for PART in $ZRAM; do
swapoff "$PART"
done && rmmod zram
}
}
restart(){
stop
start
}
status(){
swapon
}
case $1 in
start|stop|restart|status) $1;;
*) restart
esac
|