Стоимость 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 %