ZRAM/ZSWAP: различия между версиями
Дым (обсуждение | вклад) |
Дым (обсуждение | вклад) (→ZSWAP) |
||
Строка 6: | Строка 6: | ||
Включить её можно, конечно, параметром ядра, но вовсе не обязательно: достаточно отправить букву '''Y''' в файл <code>/sys/module/zswap/parameters/enabled</code>: | Включить её можно, конечно, параметром ядра, но вовсе не обязательно: достаточно отправить букву '''Y''' в файл <code>/sys/module/zswap/parameters/enabled</code>: | ||
# echo Y >/sys/module/zswap/parameters/enabled | # echo Y >/sys/module/zswap/parameters/enabled | ||
Посмотреть текущие настройки и статистику можно скриптом, разместив его по доступному для рута пути: | |||
==/usr/local/bin/zswap== | ==/usr/local/bin/zswap== | ||
<source lang=bash> | <source lang=bash> |
Версия от 04:51, 11 октября 2022
Заготовка заметки. ==
ZSWAP
Для работы этой технологии необходим подмонтированный своп-раздел: именно в него zswap скидывает сжатые страницы памяти.
Включить её можно, конечно, параметром ядра, но вовсе не обязательно: достаточно отправить букву Y в файл /sys/module/zswap/parameters/enabled
:
# echo Y >/sys/module/zswap/parameters/enabled
Посмотреть текущие настройки и статистику можно скриптом, разместив его по доступному для рута пути:
/usr/local/bin/zswap
#!/bin/sh
LANG=en_US.UTF-8
MODUL=/sys/module/zswap
DEBUG=/sys/kernel/debug/zswap
Show(){
printf "========\n$1\n========\n"
grep -R . $2 2>&1 | sed 's|.*/||'
}
Show Settings $MODUL
Show Stats $DEBUG
printf "\nCompression ratio: "
PAGE=$[`cat $DEBUG/stored_pages`*4096]
POOL=$[`cat $DEBUG/pool_total_size`]
[ $POOL -gt 0 ] && {
echo "scale=3;$PAGE/$POOL" | bc
} || echo zswap disabled
Пример вывода:
# zswap
========
Settings
========
output error
same_filled_pages_enabled:Y
enabled:Y
max_pool_percent:20
compressor:zstd
zpool:zbud
accept_threshold_percent:90
========
Stats
========
same_filled_pages:91997
stored_pages:606748
pool_total_size:1055281152
duplicate_entry:0
written_back_pages:0
reject_compress_poor:503
reject_kmemcache_fail:0
reject_alloc_fail:0
reject_reclaim_fail:0
pool_limit_hit:0
Compression ratio: 2.355
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
echo N >$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
}
echo Y >$ZSWAP
}
restart(){
stop
start
}
status(){
swapon
}
case $1 in
start|stop|restart|status) $1;;
*) restart
esac
Переменные из шапки скрипта про долю отжираемой под своп оперативки COEFF и алгоритм сжатия COMPRESS можно вынести в отдельный конфиг /etc/sysconfig/zram-swap
и рулить ими оттуда.