Технология zRam ранее известная как compcache - реализована в виде модуля ядра Linux и позволяет сжимать содержимое оперативной памяти, и таким образом увеличивать ее объем в несколько раз. Работает это так: модуль zRam создает сжатое блочное устройство в ОЗУ которое чаще всего используется как swap или монтируется в tmp.
При этом степень сжатия данных получается в среднем 3:1. Это означает что на 1 гигабайт подкачки будет использовано в 333 мегабайт физической памяти. Сейчас оперативная память стоит не так уж дорого, но использование zRam вместо файла подкачки на диске может быть полезным для старых ноутбуков и компьютеров, а также для виртуализации. В этой статье мы рассмотрим как выполняется настройка zRam Linux на примере Ubuntu.
Содержание статьи
Настройка zRam в Linux
Шаг 1. Модуль ядра
Это модуль ядра, а следовательно, важно, чтобы ваше ядро его поддерживало. zRam включен в стандартную поставку начиная с ядра версии 3.14. Вы можете посмотреть вашу версию ядра командой:
uname -r
Проверка информации о модуле ядра:
modinfo zram
Если у вас более старое ядро, вам придется забыть про эту технологию или пересобрать его с этой настройкой. Модуль включается здесь:
Шаг 2. Настройка Grub
Когда модуль загружен надо установить параметр ядра zram.num_devices который указывает максимальное количество сжатых устройств. Например для двух блочных устройств используйте добавьте в переменную GRUB_CMDLINE_LINUX_DEFAULT следующий параметр:
sudo vi /etc/default/grub
Затем обновите конфигурацию Grub и перезагрузите компьютер:
sudo update-grub
Шаг 3. Скрипт запуска и остановки
Чтобы автоматизировать запуск zram желательно написать скрипт, который будет выполнять все необходимые действия. Давайте создадим скрипт, который запускает четыре zRam устройства и подключает их в качестве swap:
sudo vi /usr/local/bin/zram-start.sh
Рассмотрим подробнее что означают строчки скрипта. Первая строчка с modprobe активирует модуля ядра на два блочных устройства. Следующие две строчки устанавливают размер для этих устройств в 1 Гб. Размер устанавливается в мегабайтах. Затем, для каждого блочного устройства создаем файловую систему подкачки командой mkswap и активируем его с помощью команды swapon. Теперь создадим скрипт, который выгружает всё это и отключает zram:
sudo vi /usr/local/bin/zram-stop.sh
Обоим скриптам надо дать права на выполнение:
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
После этого выполните команду daemon-reload, чтобы перечитать конфигурацию systemd:
sudo systemctl daemon-reload
Запустите сервис systemd и добавьте его в автозагрузку:
sudo systemctl start zram
sudo systemctl enable zram
Выводы
В этой небольшой статье мы рассмотрели как включить zram ubuntu. Как видите, в современных версиях дистрибутива, где модуль уже включён в ядро в этом нет ничего сложного. А пользуетесь ли вы какими-либо технологиями сжатия памяти? Напишите в комментариях!
Как то пробовал примерно все так делать, но реального ускорения не заметил - потом просто докупил памяти!
Да, память это идеальное решение, но если нет возможности или средств приходится что-то придумывать)
Привет, Есть общество Odroid - это устройство работает под Ubuntu 16.04, можешь нам помочь и написать пару статей для него? Например о том как ускорить его, как перенести часть папок на другой диск и как обновить ядро линукс.. Очень нуждаемся в твоей помощи
Поверьте, ускорение там где многопоточное чтение и запись огромно...
А нужно-ли использовать ZRam вкупе с Profile Sync Daemon? Не будут-ли эти приложения мешать друг другу? Или что-то одно лучше выбрать? И что лучше?
Используем так, если помогли, значит не зря писали..
http://vixdevelop.blogspot.ru/2016/09/zraid.html
для ubuntu 16.04 нужно перезагрузиться чтобы systemd запустил службу настройки или в консоли от рута запустить:
# systemctl start zram-config.service
проверить можно:
# swapon -s
Добрый день!
Пытался запустить 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 отключают. Может подскажите, как самому поставить недостающий модуль на виртуальном сервере?
Здравствуйте.
У вас во втором способе настройки zram в файле udev/rules.d/10-zram.rules два одинаковых параметра подряд:
ATTR{disksize}=="0", ATTR{disksize}="512M"
Это так и надо?
Просто когда вы говорите про /tmp со сжатием, то там сначала ATTR{initstate}, а потом ATTR{disksize}, в первом случае такого не было?
sudo apt install zram-tools
Как можно чистить zram? С обычным свопом понятно.
А зачем использовать два zram если можно один?
раньше зрам не умел в многопоточность. щас бессмысленно
Не будет лишним прибавить, что ZRAM не сочетается с родственным ему механизмом ZSWAP, и поскольку последний задействован по умолчанию в некоторых дистрибутивах, то в качестве подготовки к настройке ZRAM его, наряду с традиционным swap, хорошо бы нейтрализовать: https://wiki.archlinux.org/title/Zswap_(Русский)#Включение_и_выключение_zswap
Что касается самого ZRAM, то простейший путь постановить его себе на службу — это загрузить пакет systemd-zram-generator из официального репозитория Ubuntu (на других дистрибутивах он же именуется просто zram-generator):
https://github.com/systemd/zram-generator
Для работы 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
------------------------------------------------------
Переменные из шапки скрипта можно вынести в отдельный конфиг и подставлять его вместо определения их прямо в скрипте.
В строчке:
mkswap /dev/zram0 -L zram0 &>/dev/null
следует заменить оба вхождения zram0 на $DEV