Модуль ядра zram (или «compressed swap») представляет собой механизм в ядре Linux для создания сжатых блочных устройств в оперативной памяти (RAM). Он используется для уменьшения использования физической памяти за счет сжатия данных, которые обычно сохраняются в раздел подкачки (swap).
Работает это примерно так:
- Сжимает данные. Когда модуль zram активирован, он создает одно или несколько сжатых устройств в оперативной памяти (RAM). Когда операционная система Linux решает передавать страницы данных в раздел подкачки, они сначала сжимаются и затем сохраняются на устройствах zram вместо обычного раздела подкачки на диске.
- Освобождение RAM. Использование устройств zram помогает освободить физическую оперативную память, так как данные сжимаются и хранятся в более компактном виде. Это особенно полезно на системах с ограниченным объемом оперативной памяти.
- Дефрагментация раздела подкачки. Поскольку данные сжимаются и хранятся ближе друг к другу в оперативной памяти, устройства zram могут уменьшить фрагментацию раздела подкачки. Это может повысить производительность при обращении к данным в разделе подкачки.
Как итог — использование модуля ядра zram может значительно улучшить производительность системы при нехватке оперативной памяти, так как данные сжимаются и хранятся в более компактной форме, что позволяет сохранить больше данных в оперативной памяти и уменьшить зависимость от медленного раздела подкачки на диске.
Как подключить?
Модуль ядра доступен в ядре linux начиная с версии ядра 3.14. Например у меня Ubuntu 20.04, проверяем версию ядра.
uname -r
Также можно проверить информацию о нем:
modinfo zram
Включаем модуль в GRUB
В /etc/default/grub
нужно дописать в переменную GRUB_CMDLINE_LINUX_DEFAULT строку zram.num_devices=2. Это число, указывает на количество сжатых устройств.
Обновляем конфигурацию grub и перезагружаемся
update-grub
shutdown -r now
Далее нам надо написать скрипт, который будет управлять запуском и остановкой zram модуля.
Сам скрипт
#!/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
Тут мы активируем модуль ядра, устанавливаем для каждого устройства размер в 1024 МБ, создаем ФС подкачки и активируем файл подкачки.
Скрипт для остановки zram:
#!/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
Тут мы отключаем устройство подкачки, скидываем размер, освобождая наши гигабайты, и выгружаем модуль ядра, освобождая ресурсы которые он использовал.
Давайте напишем systemd service для удобного управлением этим (/etc/systemd/system/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
Перезагружаем демон:
systemctl daemon-reload
Включаем zram через systemd:
systemctl start zram.service
Проверяем память, к swap должно прибавится еще 2 гигабайта.