zram

Вы все еще используете Swap? Тогда мы идем к вам.

Стоимость 1 Гб оперативной памяти (ОЗУ) за последние 10 лет снизилась со 197 долларов до 4, т.е. почти в 50 раз. Это привело к тому, что в современных компьютерах устанавливают все большие объемы ОЗУ и необходимость в таком механизме виртуальной памяти как свопинг становится все меньше.

Собственно говоря файл/раздел подкачки никогда не мог похвастаться быстродействием, так как среднее время доступа к диску (2 — 16 мс) значительно выше времени доступа к ОЗУ (4 — 10 нс) и если промышленный сервер начинает активно использовать , высока вероятность того что он просто зависнет.

Небольшого лирического отступление сделано, пришла пора раскрыть тему этой записи — , ранее известный как . Это экспериментальный модуль ядра , позволяющий создавать блочные устройства, которые хранятся в ОЗУ в сжатом виде. Для сжатия используется алгоритм LZO.

В Debian/Ubuntu этот модуль идет в штатной поставке ядра, далее приводится варианты настройки zRam для использования в качестве swap и эксперимент по помещению Firefox в swap на базе zRam для оценки уровня сжатия и скорости работы.

Модуль zRam использует однопоточное сжатие, поэтому теоретически число блочных устройств должно равняться числу ядер процессора:

 cat /proc/cpuinfo |grep -c processor 2 

Загружаем модуль с нужным нам параметром (если версия ядра старше 3.2, параметр num_devices)

 modprobe zram zram_num_devices=2 

Выставляем не сжатый размер для каждого блочного устройства, например 512 МБ:

 for i in `ls /sys/block/zram*/disksize`; do echo 536870912 > $i; done 

Подключаем все блочные устройства как разделы подкачки с одинаковым приоритетом:

 for i in `ls /dev/zram*`; do mkswap $i; swapon $i -p 10 ; done 

Эксперимент над Firefox. Есть ли жизнь в zRam?

В эксперементе нам поможет cgroup. Создаем контрольную группу и выставляем ограничения:

 cgcreate -g memory:/firefox_test cgset -r memory.limit_in_bytes=1m firefox_test cgset -r memory.memsw.limit_in_bytes=1024m firefox_test 

Применяем группу к процессу Firefox:

 ps -ef |grep firefox rascal 3719 1 10 20:21 ? 00:00:02 /usr/lib/firefox/firefox cgclassify -g memory:firefox_test 3719 cat /sys/fs/cgroup/memory/firefox_test/tasks 3719 3764 3765 ... 

Начинаем серфинг… штук 7 вкладок будет достаточно. В плане быстродействия выглядит довольно хорошо, смотрим на результаты c помощью zram_stats:

 zram_stats /sys/block/zram0 disksize: 536870912 num_reads: 3521099 num_writes: 1404057 invalid_io: 0 notify_free: 1391234 zero_pages: 323 orig_data_size: 50950144 compr_data_size: 21178377 mem_used_total: 24367104 avg_compr_ratio: 41 % mem_overhead: 15 % /sys/block/zram1 disksize: 536870912 num_reads: 3515153 num_writes: 1404115 invalid_io: 0 notify_free: 1391216 zero_pages: 327 orig_data_size: 51134464 compr_data_size: 21288407 mem_used_total: 24498176 avg_compr_ratio: 41 % mem_overhead: 15 %