Zram или compcache — экспериментальный модуль ядра Linux позволяющий сжимать содержимое оперативной памяти, и таким образом увеличивать ее объем в несколько раз. Работает это так: zram создает сжатое блочное устройство в ОЗУ которое чаще всего используется как swap или монтируется в tmp. При этом степень сжатия данных получается в среднем 3:1. Это означает что на 1 гигабайт подкачки будет использовано в 333 мегабайт физической памяти.

Активация zram

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

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

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

Настройка сжатия памяти Zram

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

способ 1 с помощью скрипта

Для настройки и запуска модуля создадим скрипт zram.start и добавим его в автозагрузку. Например если мы хотим создать 4 сжатых устройства размером 1526 мегабайт и подключить их как swap скрипт будет выглядеть так:

!/bin/bash

modprobe zram num_devices=4

SIZE=1536
echo $(($SIZE*1024*1024)) > /sys/block/zram0/disksize
echo $(($SIZE*1024*1024)) > /sys/block/zram1/disksize
echo $(($SIZE*1024*1024)) > /sys/block/zram2/disksize
echo $(($SIZE*1024*1024)) > /sys/block/zram3/disksize

mkswap /dev/zram0
mkswap /dev/zram1
mkswap /dev/zram2
mkswap /dev/zram3

swapon /dev/zram0 -p 10
swapon /dev/zram1 -p 10
swapon /dev/zram2 -p 10
swapon /dev/zram3 -p 10

И соответственно скрипт для отключения — zram.stop:

!/bin/bash

swapoff /dev/zram0
swapoff /dev/zram1
swapoff /dev/zram2
swapoff /dev/zram3

echo 1 > /sys/block/zram0/reset
echo 1 > /sys/block/zram1/reset
echo 1 > /sys/block/zram2/reset
echo 1 > /sys/block/zram3/reset

modprobe -r zram

Автозагрузка скриптов отличается в каждой системе инициализации, в systemd можно написать юнит, в upstart — добавить в rc.local, а в openrc есть директория /etc/local.d/. Ну в общем вы знаете как это делается в вашей системе.

Способ 2 без скриптов

В этом примере создадим три устройства, 2 из них подключим в swap, а одно смонтируем в tmp.

Загрузим модуль ядра используя /etc/modprobe.d/:

sudo nano /etc/modprobe.d/zram.conf

options zram num_devices=3

Создадим диски с помощью правил udev:

sudo nano /etc/udev/rules.d/10-zram.rules

KERNEL=="zram0", SUBSYSTEM=="block", DRIVER=="", ACTION=="add", ATTR{disksize}=="0", ATTR{disksize}="512M", RUN+="/sbin/mkswap $env{DEVNAME}"
KERNEL=="zram1", SUBSYSTEM=="block", DRIVER=="", ACTION=="add", ATTR{disksize}=="0", ATTR{disksize}="512M", RUN+="/sbin/mkswap $env{DEVNAME}"
KERNEL=="zram2", SUBSYSTEM=="block", DRIVER=="", ACTION=="add", ATTR{disksize}=="0", ATTR{disksize}="512M", RUN+="/sbin/mkfs.ext4 $env{DEVNAME}"

Если вы хотите использовать сжатие lz4 и ext4 без журналирования строчка будет выглядеть вот так:

KERNEL=="zram2", SUBSYSTEM=="block", DRIVER=="", ACTION=="add", ATTR{initstate}=="0", ATTR{comp_algorithm}="lz4", ATTR{disksize}="512M", RUN+="/sbin/mkfs.ext4 -O ^has_journal -L $name $env{DEVNAME}"

И наконец подключим их в /etc/fstab:

/dev/zram0 swap swap pri=16383 0 0
/dev/zram1 swap swap pri=16383 0 0
/dev/zram2 /tmp ext4 defaults 0 0

Источник: losst.ru