ZRAM/ZSWAP: различия между версиями
Дым (обсуждение | вклад) |
Дым (обсуждение | вклад) |
||
Строка 5: | Строка 5: | ||
# echo Y >/sys/module/zswap/parameters/enabled | # echo Y >/sys/module/zswap/parameters/enabled | ||
Посмотреть текущие настройки и статистику можно скриптом, разместив его по доступному для рута пути: | Посмотреть текущие настройки и статистику можно скриптом, разместив его по доступному для рута пути: | ||
==/usr | ==/usr/bin/zswap== | ||
{{Примечание|скрипт позволяет включать/выключать zswap, если этому не препятствует запущенный '''zram-swap''' или отсутствие задействованного своп-раздела.}} | {{Примечание|скрипт позволяет включать/выключать zswap, если этому не препятствует запущенный '''zram-swap''' или отсутствие задействованного своп-раздела.}} | ||
<source lang=bash> | <source lang=bash> |
Версия от 04:48, 7 ноября 2022
ZSWAP
Включить её можно, конечно, параметром ядра, но вовсе не обязательно — достаточно отправить букву Y в файл /sys/module/zswap/parameters/enabled
:
# echo Y >/sys/module/zswap/parameters/enabled
Посмотреть текущие настройки и статистику можно скриптом, разместив его по доступному для рута пути:
/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 '/\/enabled:/d;/uevent/d;s|.*/||;s|:|: |;s|_| |g;s| percent|, %|'
}
case $1 in # switch zswap on/off
1|Y|y|on) [ $ZRAMS -gt 0 ] && Protect "can not 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
В дистрибутиве уже есть пакет по фамилии 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
DEV=zram0
ZSWAP=/sys/module/zswap/parameters/enabled
start(){
SYSDIR=/sys/block/$DEV
ALGO=$SYSDIR/comp_algorithm
zswap off # zswap лучше отключить во избежание (см. скрипт zswap разделом выше)
modprobe -q zram
grep -q $COMPRESS $ALGO && echo $COMPRESS >$ALGO
echo $[COEFF * `awk '/MemTotal/{print $2}' /proc/meminfo`] >$SYSDIR/disksize
mkswap /dev/$DEV -L $DEV &>/dev/null
swapon -p 100 /dev/$DEV
}
stop(){
DEVZRAM=`awk '/zram/{print $1}' /proc/swaps`
[ -z "$DEVZRAM" ] || {
for i in $DEVZRAM; do
swapoff "$i"
done
rmmod zram
zswap on# даже если zswap задействован не был, не помешает включить (см. скрипт zswap разделом выше)
}
}
restart(){
stop
start
}
status(){
swapon
}
case $1 in
start|stop|restart|status) $1;;
*) restart
esac