LINUX.ORG.RU

zram с sysvinit

 ,


2

1

Если вам необходимо использовать zram с ядром не меньше, чем 5.19 и системой инициализации sysvinit...

Необходимо включить следующие параметры в ядре:


Memory Management options  --->
    [*] Support for paging of anonymous memory (swap)  --->
          -*-     N:1 compression allocator (zsmalloc)                                                                                                                                                                                                                               [*]Export zsmalloc statistics
   

Device Drivers  --->
    [*] Block devices --->
        [*] Compressed RAM block device support
        [*]     Write back incompressible or idle page to backing device
        [*]     Track zRam block status

Для создания устройства подкачки надо использовать этот инит:

#!/bin/sh
#
# /etc/rc.d/zram: star/stop ZRAM
#

# location of the zramctl executable
ZRAMCTL=/sbin/zramctl

case $1 in
        start)
        $ZRAMCTL /dev/zram0 --size 8G -a zstd
        mkswap /dev/zram0
        swapon /dev/zram0 -p 40
                ;;
        stop)
        swapoff /dev/zram0

        $ZRAMCTL --reset /dev/zram0
                ;;
        restart)
                $0 stop
                sleep 2
                $0 start
                ;;
        *)
                echo "Usage: $0 [start|stop|restart]"
                ;;
esac
Вместо 8G подставьте нужный вам размер, а вместо zstd — необходимый алгоритм сжатия.

★★★★★

Проверено: maxcom ()
Последнее исправление: hobbit (всего исправлений: 3)

Тогда уж переменные в файл вынести стоит(/etc/default/zram например).

ZRAM_SIZE='8G'
ZRAM_ALGO='zstd'
ZRAM_PRIO='40

И инклудить его в начале инит-скрипта.

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

Мне не удалось заставить работать подключение переменных в отдельном файле, поэтому я оставлю как есть.

vbcnthfkmnth123 ★★★★★
() автор топика

Заголовки нужно бы делать более понятными, чтобы страница лучше ранжировалась. Например:

Как включить zram на системе с sysvinit

alex1101
()
Ответ на: комментарий от alex1101

Суть не просто во включении zram на системе с sysvinit, а в использовании zram на системе с sysvinit и современным ядром. Потому что zram на новых и старых ядрах работает по разному. На старых он однопоточный, поэтому надо создавать отдельное устройство на каждый поток процессора, тогда как на новых достаточно создать одно устройство и оно будет обрабатывать несколько потоков.

vbcnthfkmnth123 ★★★★★
() автор топика
Ответ на: комментарий от vbcnthfkmnth123

Перегружать заголовок деталями тоже ни к чему

alex1101
()
Ответ на: комментарий от vbcnthfkmnth123

А что не получилось? Это одна строчка

. /etc/default/zram
А далее в коде
$ZRAMCTL /dev/zram0 --size ${ZRAM_SIZE} -a ${ZRAM_ALGO}
mkswap /dev/zram0
swapon /dev/zram0 -p ${ZRAM_PRIO}
Это же штатный способ sysvinit. Держать переменные хардкодом в скриптах крайне нежелательно.

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

Все способы которые я смог нагуглить не работали. Даже твой только что попробовал и инит просто не стартовал. Ну и смысл мне выкладывать то что не работает? Не хочу сейчас разбираться почему так, может потом.

vbcnthfkmnth123 ★★★★★
() автор топика
Последнее исправление: vbcnthfkmnth123 (всего исправлений: 1)

Мой вариант

#!/bin/sh -e

# https://www.kernel.org/doc/html/latest/admin-guide/blockdev/zram.html

# num_devices is number of /dev/zram0 /dev/ram1 ... devices
# each device compression is single-threaded
modprobe zram num_devices=1

# echo 1 > /sys/block/zram0/reset

# place for data that decides not to be in memory
echo /dev/sda2 > /sys/block/zram0/backing_dev

# size of uncompressed data on zram0
echo 8000000000 > /sys/block/zram0/disksize

# physical memory usage limit
echo 2000000000 > /sys/block/zram0/mem_limit


mkswap /dev/zram0
swapon /dev/zram0 --priority 10

Запускаю тупо из /etc/rc.local на старте, стоп не нужен.

firkax ★★★★★
()
Ответ на: комментарий от vbcnthfkmnth123

Зачем гуглить? Это в штатной документации есть.

root@damned:~# cat /etc/init.d/zram
#!/bin/sh
#
# /etc/rc.d/zram: star/stop ZRAM
#

# location of the zramctl executable
ZRAMCTL=/sbin/zramctl
. /etc/default/zram

case $1 in
        start)
                # Убрать echo для нормальной работы. Я его поставил для тестов. Так как мне на живой системе оно не нужно.
                echo "
                $ZRAMCTL /dev/zram0 --size ${ZRAM_SIZE} -a ${ZRAM_ALGO}
                mkswap /dev/zram0
                swapon /dev/zram0 -p ${ZRAM_PRIO}
                "
                ;;
        stop)
                # Убрать echo для нормальной работы. Я его поставил для тестов. Так как мне на живой системе оно не нужно.
                echo "
                swapoff /dev/zram0
                $ZRAMCTL --reset /dev/zram0
                "
                ;;
        restart)
                $0 stop
                sleep 2
                $0 start
                ;;
        *)
                echo "Usage: $0 [start|stop|restart]"
                ;;
esac
root@damned:~# cat /etc/default/zram
#
ZRAM_SIZE='8G'
ZRAM_ALGO='zstd'
ZRAM_PRIO='40'
root@damned:~# /etc/init.d/zram restart

                swapoff /dev/zram0
                /sbin/zramctl --reset /dev/zram0


                /sbin/zramctl /dev/zram0 --size 8G -a zstd
                mkswap /dev/zram0
                swapon /dev/zram0 -p 40
Как видно, всё работает. Все переменные подставляются.

shell-script ★★★★★
()
Ответ на: комментарий от vbcnthfkmnth123

и инит просто не стартовал

Видимо, файла /etc/default/zram не было.

Вобще было принято делать:

ZRAM_SIZE='8G'
ZRAM_ALGO='zstd'
ZRAM_PRIO='40
if [ -f /etc/sysconfig/zram ]; then
    . /etc/sysconfig/zram
fi
Чтобы у переменных были значения по-умолчанию и скрипт срабатывал, даже если файла /etc/sysconfig/zram вдруг не стало.

Ну и в RH настройки системы лежали в /etc/sysconfig, а в /etc/default лежали значения по-умолчанию для команды useradd и других.

mky ★★★★★
()
Ответ на: комментарий от firkax

А сколько физической RAM на машине, где используется этот скрипт?

Интересовался в свое время параметром mem_limit, много читал примеров, в основном на en форумах.
Насколько я понял, его использование позволяет получить нужную степень сжатия. В данном скрипте 1 к 4, причем все несжимаемые данные будут отброшены. Нюанс в том, что они могут быть отброшены в никуда или, как в скрипте, на физическое устройство /dev/sda2.

Если я правильно изложил свое понимание, то почему mem_limit не используют повсеместно в скриптах настройки zram? С ним же проще получить нужный результат.
Например, hakavlad убивает несжимаемые данные пользовательским OOM-killer nohang (опция «zram_checking_enabled = True»), Убунтята, не проходите мимо: le9 patch добавлен в linux-xanmod и ваш OOM killer будет вылечен (комментарий).

Причем, он раньше тоже использовал mem_limit в своем скрипте yazram. Но потом отказался, Как лучше сделать сжатый swap? (комментарий).

krasnh ★★★
()
Последнее исправление: krasnh (всего исправлений: 1)
Ответ на: комментарий от krasnh

Всего 4G физической. К степени сжатия mem_limit никакого отношения не имеет, им выбирается баланс между памятью, доступной напрямую и памятью, в которую можно положить сжатый свап. У меня, соответственно, осталось 2G настоящей оперативной памяти и ещё 2G занято сжатым свапом куда, как я понадеялся, влезет около 8G (disksize) свапнутых данных, а если вдруг не влезут то есть sda2 (хотя я до сих пор не уверен что sda2 тут правильно настроено, в документации на эту тему что-то запутанное написано). Итого примерно 10G доступно.

Почему и кто его использует/не использует не знаю, мне пофиг.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

Админы, вы бы шапку до консистентности довели. А то выглядит это не как статья, а как обычная тема :)

serg002 ★★★
()
Последнее исправление: serg002 (всего исправлений: 1)
Ответ на: комментарий от One

Какой ужас, обёртки в обёртках в обёртках. До чего же можно раздуть простое прописывание ядру 3-5 параметров-переменных.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Интересовался в свое время параметром mem_limit, много читал примеров, в основном на en форумах.
Насколько я понял, его использование позволяет получить нужную степень сжатия.

Поискал эти старые ссылки. Сейчас, в 2022 году, все это воспринимается уже не так однозначно, плюс еще гуглоперевод…

tl; dr: ZRAM должен быть ограничен mem_limit, а размер диска должен быть примерно в 4 раза больше.
https://groups.google.com/a/chromium.org/g/chromium-os-discuss/c/kIIPNMdZrNA/m/A3V8FoeMBwAJ

krasnh ★★★
()
Ответ на: комментарий от krasnh

Там systemd требует ) Есть для артикс переделка (openrc и еще что-то), но для sysvinit порта может и нет.

One ★★★★★
()

имел практику со сценарием «мало памяти + слабый проц + нет SSD» на debian с примерно десктопным использованием.

До экспериментов со сжатием памяти отчаянно фризило по 10+ секунд при переулюении между тяжёлыми приложениями - читало с диска.

Ядро - экспериментальное убунтовское 5.4 - последнее на момент эксперимента в 2019.

$ cat /boot/config-5.4.0-994-generic | grep -iP '(ZS|ZR)'
CONFIG_ZSWAP=y
CONFIG_ZSMALLOC=y
# CONFIG_ZSMALLOC_STAT is not set
CONFIG_ZRAM=m
CONFIG_ZRAM_WRITEBACK=y
CONFIG_ZRAM_MEMORY_TRACKING=y
CONFIG_UBIFS_FS_ZSTD=y
CONFIG_SQUASHFS_ZSTD=y
# CONFIG_PSTORE_ZSTD_COMPRESS is not set
CONFIG_CRYPTO_ZSTD=m
CONFIG_ZSTD_COMPRESS=m
CONFIG_ZSTD_DECOMPRESS=y

Парамтеры загрузки zswap.enabled=1 zswap.zpool=zsmalloc zswap.compressor=zstd zswap.max_pool_percent=42 log_buf_len=4M

И никаких файлов псевдоустройств и т.п.

Информацию о текущей используемой степени сжатия - смотрел через grep -r . /sys/kernel/debug/zswap/ | sort

Эффект был разителен - теперь при переключении тяжёлых приложений было вылезание не с медленного диска, а из пожатой памяти. Условно 2-3 секунды вместо 20.

И обошлось всё это только параметрами ядра (т.к. собранное подошло по параметрам). Посему в статье может иметь смысл написать что в простых сценариях может быть проще испльзовать zswap вместо zram.

GPFault ★★
()
Ответ на: комментарий от GPFault

Эффект был разителен … Условно 2-3 секунды вместо 20.

Попробуй ради эксперимента linuxmint-20.2-xfce-oldpc-le9-14.07.2021-64bit.iso в виртуалке.
Выстави ограничение в 1Gb памяти и поюзай firefox, открыв разные вкладки и запустив ролик в ютубе. Удивишься, учитывая, что система x86-64.

Я не призываю использовать 64bit с 1G на реальном железе, но этот тест лучше всего характеризует возможности современного Linux. Но многие об этом даже не слышали.
Ничего, скоро выйдет ядро 6.1 и юзера воленс-неволенс втянутся в новые технологии. :)

krasnh ★★★
()
Ответ на: комментарий от krasnh

Я попробовал ради интереса на 1.5 GB памяти с Zram + Zstd запустить The Witcher 3 и… игра запустилась и было даже более-менее играбельно, я был весьма удивлен. Браузер тоже попробовал, всякие видосы и сайты пооткрывать, проблем тоже не было. Cжатие памяти - впечатляющая штука. Но это я на обычном ядре пробовал, без le9.

Kron4ek ★★★★★
()
Последнее исправление: Kron4ek (всего исправлений: 1)
Ответ на: комментарий от Kron4ek

Все же le9/MGLRU важный ‘ингредиент’ правильной настройки системы (а также swappiness и другие vm.*), в плане работы с памятью. Но сейчас эти фишки доступны только с патчами, мало кто будет сознательно этим заниматься. Так что вся надежда на скорое ядро 6.1 - будет все и у всех. :)

p.s. Тестировал разные iso в вирте, в условиях описанных выше (1Gb RAM). Было там и zram и zstd, и большой disksize (а не как обычно выставляют в 1/4 ), но чувствовалось, что не хватает легкости и отсутствия явного подтормаживания. Те, кто юзал сборки с le9/MGLRU, сразу это заметят.

p.p.s. Но 1G это конечно слишком жесткий тест для 64bit, у меня в вирте выставлено по умолчанию 1.5G, с ним обычно и юзаю.
Любой обычный дистр (64bit), без zram+le9/MGLRU, ‘задохнется’ на таком количестве RAM после открытия современного браузера.

krasnh ★★★
()
Последнее исправление: krasnh (всего исправлений: 3)

Было бы интересно послушать, как zram влияет на быстродействие всяких число- и строкодробилок. Обычно за сжатие данных приходится платить…

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

На чем затестить? Я посмотрел например на обливион с вулканом в вайне. Без zram выдает 10-11 fps, с zram 9-10 fps.

vbcnthfkmnth123 ★★★★★
() автор топика
Последнее исправление: vbcnthfkmnth123 (всего исправлений: 1)
Ответ на: комментарий от alex1101

«Как включить zram на системе с sysvinit не привлекая внимания админов»

простите, не сдержался.((

mumpster ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.