Главная >> Инструкции >> Настройка zRam в Linux

Настройка zRam в Linux

Технология zRam ранее известная как compcache - реализована в виде модуля ядра Linux и позволяет сжимать содержимое оперативной памяти, и таким образом увеличивать ее объем в несколько раз. Работает это так: модуль zRam создает сжатое блочное устройство в ОЗУ которое чаще всего используется как swap или монтируется в tmp.

При этом степень сжатия данных получается в среднем 3:1. Это означает что на 1 гигабайт подкачки будет использовано в 333 мегабайт физической памяти. Сейчас оперативная память стоит не так уж дорого, но использование zRam вместо файла подкачки на диске может быть полезным для старых ноутбуков и компьютеров, а также для виртуализации. В этой статье мы рассмотрим как выполняется настройка zRam Linux на примере Ubuntu.


Содержание статьи

Настройка zRam в Linux

Шаг 1. Модуль ядра

Это модуль ядра, а следовательно, важно, чтобы ваше ядро его поддерживало. zRam включен в стандартную поставку начиная с ядра версии 3.14. Вы можете посмотреть вашу версию ядра командой:

uname -r

Проверка информации о модуле ядра:

modinfo zram

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

Device Drivers --->
[*] Block devices --->
<M> Compressed RAM block device support

Шаг 2. Настройка Grub

Когда модуль загружен надо установить параметр ядра zram.num_devices который указывает максимальное количество сжатых устройств. Например для двух блочных устройств используйте добавьте в переменную GRUB_CMDLINE_LINUX_DEFAULT следующий параметр:

sudo vi /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT=".... zram.num_devices=2"

Затем обновите конфигурацию Grub и перезагрузите компьютер:

sudo update-grub

Шаг 3. Скрипт запуска и остановки

Чтобы автоматизировать запуск zram желательно написать скрипт, который будет выполнять все необходимые действия. Давайте создадим скрипт, который запускает четыре zRam устройства и подключает их в качестве swap:

sudo vi /usr/local/bin/zram-start.sh

#!/bin/bash
modprobe zram num_devices=2
echo '1024M' > /sys/block/zram0/disksize
echo '1024M' > /sys/block/zram1/disksize
mkswap /dev/zram0
swapon /dev/zram0 -p 10
mkswap /dev/zram1
swapon /dev/zram1 -p 10

Рассмотрим подробнее что означают строчки скрипта. Первая строчка с modprobe активирует модуля ядра на два блочных устройства. Следующие две строчки устанавливают размер для этих устройств в 1 Гб. Размер устанавливается в мегабайтах. Затем, для каждого блочного устройства создаем файловую систему подкачки командой mkswap и активируем его с помощью команды swapon. Теперь создадим скрипт, который выгружает всё это и отключает zram:

sudo vi /usr/local/bin/zram-stop.sh

#!/bin/bash
swapoff /dev/zram0
swapoff /dev/zram1
echo 1 > /sys/block/zram0/reset
echo 1 > /sys/block/zram1/reset
sleep .5
modprobe -r zram

Обоим скриптам надо дать права на выполнение:

sudo chmod ugo+x /usr/local/bin/zram-start.sh
sudo chmod ugo+x /usr/local/bin/zram-stop.sh

Шаг 4. Тестирование zRam

Теперь надо всё протестировать. Запустите zRam выполнив скрипт запуска:

sudo /usr/local/bin/zram-start.sh

Теперь вы можете убедится, что количество подкачки увеличилось на 2 Гб:

free -h

Всё работает, теперь можно проверить работает ли скрипт отключения:

sudo /usr/local/bin/zram-stop.sh

Шаг 5. Настройка сервиса systemd

Чтобы запускать zram по умолчанию нужно создать для него юнит файл systemd. Создайте файл со следующим содержимым:

sudo systemctl edit --full --force zram.service

[Unit]
Description=zRAM block devices swapping
[Service]
Type=oneshot
ExecStart=/usr/local/bin/zram-start.sh
ExecStop=/usr/local/bin/zram-stop.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

После этого выполните команду daemon-reload, чтобы перечитать конфигурацию systemd:

sudo systemctl daemon-reload

Запустите сервис systemd и добавьте его в автозагрузку:

sudo systemctl start zram
sudo systemctl enable zram

Выводы

В этой небольшой статье мы рассмотрели как включить zram ubuntu. Как видите, в современных версиях дистрибутива, где модуль уже включён в ядро в этом нет ничего сложного. А пользуетесь ли вы какими-либо технологиями сжатия памяти? Напишите в комментариях!

16 комментариев к “Настройка zRam в Linux”

      • Привет, Есть общество Odroid - это устройство работает под Ubuntu 16.04, можешь нам помочь и написать пару статей для него? Например о том как ускорить его, как перенести часть папок на другой диск и как обновить ядро линукс.. Очень нуждаемся в твоей помощи

        Ответить
  1. А нужно-ли использовать ZRam вкупе с Profile Sync Daemon? Не будут-ли эти приложения мешать друг другу? Или что-то одно лучше выбрать? И что лучше?

    Ответить
  2. для ubuntu 16.04 нужно перезагрузиться чтобы systemd запустил службу настройки или в консоли от рута запустить:
    # systemctl start zram-config.service
    проверить можно:
    # swapon -s

    Ответить
  3. Добрый день!
    Пытался запустить zram-config на виртуальном сервере OVH, но не вышло. Оказалось, что нет модуля zram, хотя ядро свежее:
    root@vps576854:~# uname -a
    Linux vps576854 4.15.0-43-generic #46-Ubuntu SMP Thu Dec 6 14:45:28 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
    root@vps576854:~# modinfo zram
    modinfo: ERROR: Module zram not found.
    Устанавливал Ubuntu Server 18.04.1 автоматически из панели управления. Не знаю, может на этом хостинге специально модуль zram отключают. Может подскажите, как самому поставить недостающий модуль на виртуальном сервере?

    Ответить
  4. Здравствуйте.
    У вас во втором способе настройки zram в файле udev/rules.d/10-zram.rules два одинаковых параметра подряд:
    ATTR{disksize}=="0", ATTR{disksize}="512M"
    Это так и надо?
    Просто когда вы говорите про /tmp со сжатием, то там сначала ATTR{initstate}, а потом ATTR{disksize}, в первом случае такого не было?

    Ответить
  5. Не будет лишним прибавить, что ZRAM не сочетается с родственным ему механизмом ZSWAP, и поскольку последний задействован по умолчанию в некоторых дистрибутивах, то в качестве подготовки к настройке ZRAM его, наряду с традиционным swap, хорошо бы нейтрализовать: https://wiki.archlinux.org/title/Zswap_(Русский)#Включение_и_выключение_zswap

    Что касается самого ZRAM, то простейший путь постановить его себе на службу — это загрузить пакет systemd-zram-generator из официального репозитория Ubuntu (на других дистрибутивах он же именуется просто zram-generator):
    https://github.com/systemd/zram-generator

    Ответить
  6. Для работы 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

    DEV=zram0
    COEFF=512
    #COEFF=1024
    COMPRESS=lz4

    start(){
    SYSDIR=/sys/block/$DEV
    ALGO=$SYSDIR/comp_algorithm
    MEMSIZE=$[COEFF*`awk '/MemTotal/{print $2}' /proc/meminfo`]
    modprobe -q zram
    grep -q $COMPRESS $ALGO && echo $COMPRESS >$ALGO
    echo $MEMSIZE >$SYSDIR/disksize
    mkswap /dev/zram0 -L zram0 &>/dev/null
    swapon -p 100 /dev/$DEV
    }

    stop(){
    DEVZRAM=`awk '/^\/dev\/zram/{print $1}' /proc/swaps`
    [ -z "$DEVZRAM" ] || {
    for i in $DEVZRAM; do
    swapoff "$i"
    done
    rmmod zram
    }
    }

    restart(){
    stop
    start
    }

    status(){
    swapon
    }

    case $1 in
    start|stop|restart|status) $1;;
    *) restart
    esac
    ------------------------------------------------------
    Переменные из шапки скрипта можно вынести в отдельный конфиг и подставлять его вместо определения их прямо в скрипте.

    Ответить

Оставьте комментарий