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

Материал из ALT Linux Wiki
Нет описания правки
 
(не показано 68 промежуточных версий 2 участников)
Строка 1: Строка 1:
=ZSWAP=
=ZSWAP=
{{Примечание|Для работы этой технологии необходим подмонтированный своп-раздел — без него zswap не работает. Сжатые страницы перед помещением в своп хранит в памяти.}}
{{W|zswap}}
Включить её можно, конечно, параметром ядра, но вовсе не обязательно достаточно отправить букву '''Y''' в файл <code>/sys/module/zswap/parameters/enabled</code>:
{{Примечание|Для работы этой технологии необходим подмонтированный своп-раздел — без него zswap не работает.}}
# echo Y >/sys/module/zswap/parameters/enabled
Модуль ядра Linux, который сжимает данные, перехватывая попытки записи страниц памяти в swap-раздел на диске. Интегрирован в поставку ядра начиная с версии 3.11, использует алгоритмы сжатия, предоставляемые модулем '''Linux Crypto API'''.
Посмотреть текущие настройки и статистику можно скриптом, разместив его по доступному для рута пути:
 
==/usr/bin/zswap==
Увеличивает скорость подкачки страниц памяти в системе путём предотвращения выгрузки их на физический носитель, сжимая страницы и размещая их в оперативке до тех пор, пока не появится необходимость использовать реальный раздел подкачки на накопителе. Фактически выступает кэшем страниц между памятью и разделом подкачки. Страницы, выгружаемые в реальный раздел, не сжимаются. За счет того, что сжатая страница кэшируется в памяти и даже может быть никогда не выгружена в реальный раздел подкачки, снижается число операций ввода-вывода, а вместе с этим — износ физических носителей, что особенно актуально для SSD.
{{Примечание|скрипт позволяет включать/выключать zswap, если тому не препятствует запущенный '''zram-swap''' или отсутствие задействованного своп-раздела.}}
 
<source lang=bash>
В ядрах Linux большинства дистрибутивов, как и в официальных сборках ALT, эта суперсила по умолчанию не включена:
 
{{cmd|# grep -i zswap_default /boot/config-*}}
/boot/config-5.10.163-std-def-alt1:# CONFIG_ZSWAP_DEFAULT_ON is not set
/boot/config-6.1.37-un-def-alt1:# CONFIG_ZSWAP_DEFAULT_ON is not set
/boot/config-6.4.4-un-def-alt1:# CONFIG_ZSWAP_DEFAULT_ON is not set
 
<u><b>Для сведения:</b></u> у проксмокса, в котором пасутся контейнеры пусть даже самых свежих сборок арча и генту, картина ровно та же — сиречь, и в контейнерах zswap включённым быть не может... как и не нужен, и бесполезен.
 
Включён ли ZSWAP на хост-системе, видно по содержимому {{path|/sys/module/zswap/parameters/enabled}} '''N''' (по умолчанию) либо '''Y''' (да). Включить можно параметром ядра при загрузке, но вовсе не обязательно — достаточно прописать в этот файл правильную букву:
 
{{cmd|# echo Y >/sys/module/zswap/parameters/enabled}}
 
Юнит запуска/перезапуска/остановки:
{|class="mw-collapsible mw-collapsed wikitable"
!/lib/systemd/system/zswap.service &nbsp;
|-
|<source lang=ini>
[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
</source>
|}
Посмотреть текущие настройки и статистику можно скриптом<ref name="ZSWAP"/>, разместив его по доступному для рута пути, соответствующему значению в юните:
{|class="mw-collapsible mw-collapsed wikitable"
!/usr/bin/zswap &nbsp;
|-
|<source lang=bash>
#!/bin/sh
#!/bin/sh


Строка 15: Строка 51:
SWAPS=`swapon | grep -cv zram`
SWAPS=`swapon | grep -cv zram`
ZRAMS=`swapon | grep -c  zram`
ZRAMS=`swapon | grep -c  zram`
unset MSG


Protect(){
Protect(){
     echo "$1"
     [ $ZRAMS -le 0 ] || MSG="can't start: zram-swap is already in use"
     exit 1
     [ $SWAPS -gt 0 ] || MSG="can't start: swap partition not found"
}
}


Show(){
Show(){
    printf "========\n$1\n========\n"
     grep -R . $2 2>&1 | \
     grep -R . $2 2>&1 | sed '/uevent/d;/\/enabled/d;s|_percent|, %|;s|.*/||;s|:|: |;s|_| |g'
    sed '/uevent/d;
        /\/enabled/d;
        s|_percent|, %|;
        s|.*/||;
        s|:|: |;
        s|_| |g'
}
}


case $1 in # switch zswap on/off
case $1 in # switch zswap on/off
     1|Y|y|on)   [ $ZRAMS -gt 0 ] && Protect "can't start: zram-swap is already in use"
     1|Y|y|on)
                [ $SWAPS -lt 2 ] && Protect "swap partition not found"
        Protect
                echo Y >$SWTCH;;
        [ "$MSG" ] && {
     0|N|n|off) echo N >$SWTCH
            echo "$MSG"
            exit 1
        }
        echo Y >$SWTCH; exit 0
    ;;
     0|N|n|off)
        echo N >$SWTCH; exit 0
esac
esac


case `cat $SWTCH` in # is zswap in use?
case `cat $SWTCH` in # is zswap in use?
     N)  echo zswap disabled ;;
     N)  printf "zswap disabled"
        Protect
        [ "$MSG" ] && {
            echo " and $MSG"
            exit 1
        }
        echo
    ;;
     Y)  Show Settings  $MODUL
     Y)  Show Settings  $MODUL
         Show Stats      $DEBUG
         Show Stats      $DEBUG
Строка 44: Строка 99:
esac
esac
</source>
</source>
 
|}
==Пример вывода==
{|class="mw-collapsible mw-collapsed wikitable"
!Пример вывода скрипта &nbsp;
|-
|
{{cmd|# zswap}}
<source lang=bash>
<source lang=bash>
# zswap
========
========
Settings
Settings
Строка 72: Строка 130:
compression ratio: 2.19
compression ratio: 2.19
</source>
</source>
==Юнит '''/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
=ZRAM=
=ZRAM=
{{W|ZRam}}
{{Примечание|Для этой технологии своп-раздел не обязателен, но если таковой наличествует, то по заполнению сжатого свопа в памяти всё остальное начнёт свопиться уже на накопитель.}}
{{Примечание|Для этой технологии своп-раздел не обязателен, но если таковой наличествует, то по заполнению сжатого свопа в памяти всё остальное начнёт свопиться уже на накопитель.}}
Модуль ядра Linux, ранее известный как compcache. Создаёт в оперативной памяти сжатое блочное устройство (другими словами, RAM-диск со сжатием данных «на лету»), которое может использоваться, например, как устройство подкачки страниц, хранения временных файлов ({{path|/tmp}}) или же просто как RAM-диск общего назначения. Использует алгоритмы сжатия, предоставляемые модулем Linux Crypto API &mdash; чаще всего LZO или LZ4.
Хотя стоимость оперативной памяти сейчас относительно низкая, ZRAM всё же даёт преимущество на компьютерах с малым количеством ОЗУ, при виртуализации и во встраиваемых системах, использующих флеш-память с ограниченным числом циклов перезаписи. Скорость обмена с оперативной памятью выше, чем с жёстким диском, поэтому ZRAM, с учётом сжатия, как правило, позволяет повысить производительность системы в целом. При этом использование алгоритмов сжатия увеличивает нагрузку на центральный процессор, но освобождает значительное количество ОЗУ по сравнению с использованием обычного RAM-диска.
ZRAM часто путают со сходным модулем zswap ''(см. [[ZRAM/ZSWAP#ZSWAP|выше]])'', который сжимает данные, перехватывая попытки записи страниц памяти в swap-раздел на диске. Но в отличие от zswap, использовавшееся в качестве раздела подкачки zram-устройство до версии ядра 4.14 не имело возможности выгружать страницы памяти в какое-либо резервное хранилище. Начиная с указанной версии, для zram возможно задать любое другое блочное устройство в качестве резервного хранилища, куда могут выгружаться несжимаемые/неиспользуемые страницы памяти. При этом выгрузка страниц в резервное хранилище происходит в несжатом виде и — в отличие от ZSWAP — только по команде администратора системы.
==Недостатки zram как раздела подкачки==
При наличии в системе нескольких свопов zram-устройство в качестве раздела подкачки имеет более высокий приоритет, и все выгружаемые страницы падают первым делом именно в него. При его переполнении вновь выгружаемые страницы будут попадать в следующие по очереди, более медленные разделы на физических устройствах, в результате чего растёт вероятность возникновения LRU-инверсии.
Таким образом, использование zram-устройства в качестве свопа имеет смысл в основном при отсутствии разделов подкачки других типов в системе.


В дистрибутиве уже есть пакет по фамилии <code>alterator-zram-swap</code> для работы этого типа оптимизации памяти, но он:
==Настройка==
В дистрибутиве уже есть пакет по фамилии {{cmd|[[alterator-zram-swap]]}} для работы этого типа оптимизации памяти, но он:
*несколько выморочно высчитывает желаемый размер сжатого свопа;
*несколько выморочно высчитывает желаемый размер сжатого свопа;
*не учитывает уже, возможно, задействованной и несовместимой с ним технологии <code>zswap</code> ''(см. п. выше)'';
*не учитывает уже, возможно, задействованной и несовместимой с ним технологии {{cmd|[[ZRAM/ZSWAP#ZSWAP|zswap]]}};
*обременён двумя отдельными скриптами запуска и останова службы, когда достаточно одного на всё про всё.
*обременён двумя отдельными скриптами запуска и останова службы, когда достаточно одного на всё про всё.
Пакет, в общем-то, и не нужен: достаточно всего пары файлов — юнита и скрипта к нему. Ниже приведён мой вариант обоих, не из пакета.
Пакет, в общем-то, и не нужен: достаточно всего пары файлов — юнита и скрипта к нему. Ниже приведён мой вариант обоих, не из пакета.
==Юнит '''/lib/systemd/system/zram-swap.service'''==
 
<source lang=ini>
Юнит:
{|class="mw-collapsible mw-collapsed wikitable"
!/lib/systemd/system/zram-swap.service &nbsp;
|-
|<source lang=ini>
[Unit]
[Unit]
Description = Enable and configure zram-swap module
Description = Enable and configure zram-swap module
Строка 109: Строка 171:
WantedBy = swap.target
WantedBy = swap.target
</source>
</source>
 
|}
==Скрипт '''/usr/bin/zram-swap'''==
Скрипт<ref name="VARS"/>:
{{Примечание|Переменные из шапки скрипта про долю отжираемой под своп оперативки '''COEFF''' и алгоритм сжатия '''COMPRESS''' можно вынести в отдельный конфиг <code>/etc/sysconfig/zram-swap</code> и рулить ими оттуда.
{|class="mw-collapsible mw-collapsed wikitable"
}}
!/usr/bin/zram-swap &nbsp;
<source lang=bash>
|-
|<source lang=bash>
#!/bin/sh
#!/bin/sh


Строка 159: Строка 222:
esac
esac
</source>
</source>
|}
=О скриптах=
<references>
    <ref name="ZSWAP">Позволяет включать/выключать zswap, если тому не препятствует запущенный '''zram-swap''' или отсутствие задействованного своп-раздела.</ref>
    <ref name="VARS">Переменные из шапки скрипта про долю отжираемой под своп оперативки '''COEFF''' и алгоритм сжатия '''COMPRESS''' можно вынести в отдельный конфиг {{path|/etc/sysconfig/zram-swap}} и рулить ими оттуда.</ref>
</references>


=Обратная связь=
=Обратная связь=
*[https://t.me/gbIMoBou @gbIMoBou]
*[https://t.me/gbIMoBou @gbIMoBou]
*[[Участник:Дым#Заметки|Другие статьи]]
*[[Участник:Дым#Заметки|Другие статьи]]
=Ссылки=
* [[Alterator-zram-swap]]
* [https://wiki.archlinux.org/title/Zswap_(Русский) Статья Zswap на ArchWiki]
* [https://wiki.archlinux.org/title/Zram_(Русский) Статья Zram на ArchWiki]
* [[Участник:Дым#Заметки|Другие статьи]]
{{Category navigation|title=Системному администратору|category=Admin|sortkey={{SUBPAGENAME}}}}
{{Category navigation|title=Системному администратору|category=Admin|sortkey={{SUBPAGENAME}}}}
[[Категория:Admin]]
[[Категория:Admin]]

Текущая версия от 08:56, 8 августа 2023

ZSWAP

Логотип Википедии
В Википедии есть обзорная статья по теме «zswap».
Примечание: Для работы этой технологии необходим подмонтированный своп-раздел — без него zswap не работает.

Модуль ядра Linux, который сжимает данные, перехватывая попытки записи страниц памяти в swap-раздел на диске. Интегрирован в поставку ядра начиная с версии 3.11, использует алгоритмы сжатия, предоставляемые модулем Linux Crypto API.

Увеличивает скорость подкачки страниц памяти в системе путём предотвращения выгрузки их на физический носитель, сжимая страницы и размещая их в оперативке до тех пор, пока не появится необходимость использовать реальный раздел подкачки на накопителе. Фактически выступает кэшем страниц между памятью и разделом подкачки. Страницы, выгружаемые в реальный раздел, не сжимаются. За счет того, что сжатая страница кэшируется в памяти и даже может быть никогда не выгружена в реальный раздел подкачки, снижается число операций ввода-вывода, а вместе с этим — износ физических носителей, что особенно актуально для SSD.

В ядрах Linux большинства дистрибутивов, как и в официальных сборках ALT, эта суперсила по умолчанию не включена:

# grep -i zswap_default /boot/config-*

/boot/config-5.10.163-std-def-alt1:# CONFIG_ZSWAP_DEFAULT_ON is not set
/boot/config-6.1.37-un-def-alt1:# CONFIG_ZSWAP_DEFAULT_ON is not set
/boot/config-6.4.4-un-def-alt1:# CONFIG_ZSWAP_DEFAULT_ON is not set

Для сведения: у проксмокса, в котором пасутся контейнеры пусть даже самых свежих сборок арча и генту, картина ровно та же — сиречь, и в контейнерах zswap включённым быть не может... как и не нужен, и бесполезен.

Включён ли ZSWAP на хост-системе, видно по содержимому /sys/module/zswap/parameters/enabledN (по умолчанию) либо Y (да). Включить можно параметром ядра при загрузке, но вовсе не обязательно — достаточно прописать в этот файл правильную букву:

# 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

Посмотреть текущие настройки и статистику можно скриптом[1], разместив его по доступному для рута пути, соответствующему значению в юните:

/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`
unset MSG

Protect(){
    [ $ZRAMS -le 0 ] || MSG="can't start: zram-swap is already in use"
    [ $SWAPS -gt 0 ] || MSG="can't start: swap partition not found"
}

Show(){
    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)
        Protect
        [ "$MSG" ] && {
            echo "$MSG"
            exit 1
        }
        echo Y >$SWTCH; exit 0
    ;;
    0|N|n|off)
        echo N >$SWTCH; exit 0
esac

case `cat $SWTCH` in # is zswap in use?
    N)  printf "zswap disabled"
        Protect
        [ "$MSG" ] && {
            echo " and $MSG"
            exit 1
        }
        echo
    ;;
    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-диск общего назначения. Использует алгоритмы сжатия, предоставляемые модулем Linux Crypto API — чаще всего LZO или LZ4.

Хотя стоимость оперативной памяти сейчас относительно низкая, ZRAM всё же даёт преимущество на компьютерах с малым количеством ОЗУ, при виртуализации и во встраиваемых системах, использующих флеш-память с ограниченным числом циклов перезаписи. Скорость обмена с оперативной памятью выше, чем с жёстким диском, поэтому ZRAM, с учётом сжатия, как правило, позволяет повысить производительность системы в целом. При этом использование алгоритмов сжатия увеличивает нагрузку на центральный процессор, но освобождает значительное количество ОЗУ по сравнению с использованием обычного RAM-диска.

ZRAM часто путают со сходным модулем zswap (см. выше), который сжимает данные, перехватывая попытки записи страниц памяти в swap-раздел на диске. Но в отличие от zswap, использовавшееся в качестве раздела подкачки zram-устройство до версии ядра 4.14 не имело возможности выгружать страницы памяти в какое-либо резервное хранилище. Начиная с указанной версии, для zram возможно задать любое другое блочное устройство в качестве резервного хранилища, куда могут выгружаться несжимаемые/неиспользуемые страницы памяти. При этом выгрузка страниц в резервное хранилище происходит в несжатом виде и — в отличие от ZSWAP — только по команде администратора системы.

Недостатки zram как раздела подкачки

При наличии в системе нескольких свопов zram-устройство в качестве раздела подкачки имеет более высокий приоритет, и все выгружаемые страницы падают первым делом именно в него. При его переполнении вновь выгружаемые страницы будут попадать в следующие по очереди, более медленные разделы на физических устройствах, в результате чего растёт вероятность возникновения 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

Скрипт[2]:

/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

О скриптах

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

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

Ссылки