ZRAM/ZSWAP: различия между версиями

Материал из ALT Linux Wiki
Строка 9: Строка 9:
#!/bin/sh
#!/bin/sh


MDL=/sys/module/zswap
DBG=/sys/kernel/debug/zswap
PAGE=$[`cat $DBG/stored_pages`*4096]
POOL=$[`cat $DBG/pool_total_size`]
LANG=en_US.UTF-8
LANG=en_US.UTF-8
MODUL=/sys/module/zswap
DEBUG=/sys/kernel/debug/zswap
SWTCH=$MODUL/parameters/enabled
case $1 in
    1|Y|y|on)  echo Y >$SWTCH;;
    0|N|n|off)  echo N >$SWTCH;;
esac


Show(){
Show(){
    printf "========\n$1\n========\n"
    printf "========\n$1\n========\n"
    grep -R . $2 2>&1 | sed 's|.*/||'
    grep -R . $2 2>&1 | sed 's|.*/||'
}
}


Show Settings $MDL
Show Settings   $MODUL
Show Stats   $DBG
Show Stats     $DEBUG


printf "\nCompression ratio: "
printf "\nCompression ratio: "


PAGE=$[`cat $DEBUG/stored_pages`*4096]
POOL=$[`cat $DEBUG/pool_total_size`]
[ $POOL -gt 0 ] && {
[ $POOL -gt 0 ] && {
    echo "scale=3;$PAGE/$POOL" | bc
    echo "scale=3;$PAGE/$POOL" | bc
} || echo zswap disabled
} || echo zswap disabled
</source>
</source>

Версия от 00:54, 7 ноября 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
SWTCH=$MODUL/parameters/enabled

case $1 in
    1|Y|y|on)   echo Y >$SWTCH;;
    0|N|n|off)  echo N >$SWTCH;;
esac

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 # если 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
    }
    [ "`swapon | grep /dev/`" ] && echo Y >$ZSWAP # даже если zswap задействован не был, не помешает включить.
}

restart(){
    stop
    start
}

status(){
    swapon
}

case $1 in
    start|stop|restart|status) $1;;
    *) restart
esac

Переменные из шапки скрипта про долю отжираемой под своп оперативки COEFF и алгоритм сжатия COMPRESS можно вынести в отдельный конфиг /etc/sysconfig/zram-swap и рулить ими оттуда.

Обратная связь