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

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

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

Небольшого лирического отступление сделано, пришла пора раскрыть тему этой записи — zRam, ранее известный как compcache. Это экспериментальный модуль ядра Linux, позволяющий создавать блочные устройства, которые хранятся в ОЗУ в сжатом виде. Для сжатия используется алгоритм 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 %