zRam + swap

Преамбула
zRam - это модуль ядра Linux который включён в стандартную поставку ядра начиная с версии 3.14. Целью данного модуля служит создание блочного устройства в оперативной памяти, но в отличии от tmpfs, данные записываются на него в сжатом виде. Поэтому одно из основных его полезных применений это возможность создание прессующего раздела подкачки в оперативной памяти. Всё это позволяет, хоть и неявно, увеличить размер ОЗУ среднем в 2-3 раза, за счёт незначительной нагрузки ЦП на компрессию и декомпрессию данных.
На данный момент zRam поддерживает два вида компрессии: lzo(по умолчании) и lz4(начиная с версии ядра 3.15).

Амбула
Итак, у нас есть модуль и знание для чего он нужен, осталось всё это дело применить на практике.
Есть несколько вариантов как всё это запилить:
1) вручную -- для этого есть интересная статья на хабре, а также описание на kernel.org.
2) с помощью zramswap из Аура -- интересующиеся могут посмотреть тему на этом форуме где об говорится.
3) systemd-swap -- об этом ниже.

Рассмотрим третий способ.
systemd-swap - как написано на github-е это скрипт автоматического создания и подключения: zram swap, swap файлы (через loop) устройств, swap.

а) Устанавливаем:
% sudo pacman -S systemd-swap

б) Настраиваем:
Вся настройка осуществляется в файле /etc/systemd-swap.conf
Для наших нужд достаточно раскомментировать всего три строчки.

- первая: размер создаваемого раздела - по умолчанию 1/4 от размера ОЗУ, если маловато памяти то лучше поставить 1/3 или 1/2.
zram[size]=$[${sys[ram_size]}/4]K

- вторая: количество потоков сжатия - по умолчанию используется один поток, если раскомментировать то количество потоков будет равно количеству ядер процессора.
zram[streams]=${sys[cpu_count]}

- третья: алгоритм сжатия - по умолчанию используется lz4, раньше было lzo.
zram[alg]=lz4

в) Добавляем в автозагрузку и запускаем:
% sudo systemctl enable systemd-swap
% sudo systemctl start systemd-swap

г) Посмотреть статус устройства:
zramctl - простой инструмент для контроля устройств zram (создать, удалить, найти, статус). Входит в состав util-linux начиная с версии 2.26.
% zramctl
NAME       ALGORITHM DISKSIZE  DATA COMPR TOTAL STREAMS MOUNTPOINT
/dev/zram0 lz4         926,1M 20,3M  6,6M  7,5M       1 [SWAP]
где
NAME - название(устройство)
ALGORITHM - алгоритм сжатия
DISKSIZE - размер раздела подкачки в оперативной памяти
DATA - размер данных до сжатия
COMPR - размер данных после сжатия
TOTAL -
STREAMS - количество потоков сжатия
MOUNTPOINT - точка монтирования

Постамбула
Вот таким не хитрым способом можно увеличить оперативную память. В среднем у меня жмётся в три раза, но конечно всё зависит от поступающих данных.

Единственное что хотелось ещё добавить это то что существует такой параметр ядра vm.swappiness отвечающий за то при каком уровне свободной оперативной памяти нужно использовать своп, по умолчанию он равен 60(40% заполнено а 60% свободно).
Если учесть что средний параметр сжатия равен 1 к 3 , а также оставить некий запас прочности то можно очень приблизительно определить граничные значения:
--- итоговая память ~ RAM*3 : vm.swappiness = 90; ZRAM/RAM = 1/1 (при большой нагрузке возможна нестабильность системы)
--- итоговая память ~ RAM*2 : vm.swappiness ~ 70; ZRAM/RAM = 1/2
--- итоговая память ~ RAM*1.5 : vm.swappiness = 60; ZRAM/RAM = 1/4 или 1/3

Поменять vm.swappiness можно следующим образом
Создать файл /etc/sysctl.d/99-sysctl.conf и добавим в него строчку:
vm.swappiness=70
Подгрузить созданный файл конфигурации:
% sudo sysctl -p /etc/sysctl.d/99-sysctl.conf
Посмотреть что параметр действительно поменялся можно выполнив команду:
% sudo sysctl -a |grep swappiness

На этом всё.
Спасибо за внимание.

update: 25.03.2015
Обновил статью так как на днях вышла новая версия набора системных linux утилит util-linux 2.26, в эту версию вошел инструмент zramctl. При установке/обновлении util-linux, пакет zramctl будет удалён. В остальном практически всё осталось как и прежде.
red
Всё это позволяет, хоть и неявно, увеличить размер ОЗУ (среднем в 2-3 раза)
2-3 раза перебор!!!
10-25% более реальные данные. сам проверял когда было памяти всего 2Г. при размере памяти 4Г и более нет никакого смысла в использовании.
да еще стоит помнить о зацикливании, zRam как и tmpfs может тоже уходить в свап, но свап то на zRam, в какой то момент происходит лавинообразная потеря памяти с конкретным подвисанием.
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
nafanja
2-3 раза перебор!!!
10-25% более реальные данные. сам проверял когда было памяти всего 2Г.
nafanja, я спецом привёл вывод комманды zramctl status (где ORIG - это оригинальный размер, а COMPRES - это размер сжатых данных).

nafanja
при размере памяти 4Г и более нет никакого смысла в использовании.
ну почему же, мой опыт говорит обратное. По крайней мере при четырёх гигах это уж точно, когда открыто с десяток программ да и ещё 100500 открытых вкладок в браузере, то гном уже не хочет запускать программы и говорит что мало памяти.

nafanja
да еще стоит помнить о зацикливании
пока с этим не сталкивался, но спасибо, будем иметь в виду если что.
а ты проведи эксперимент.
1 без использования сжатого свапа в памяти, забей всю память 4Г под завязку.
2 убери 2Г, включи сжатый свап, и опять забей память по максимуму тем же самым.
и увидишь что так же забить не получится, не хватит памяти. хотя по идее память должно была остаться на прежнем уровне в 4Г или даже стать 6Г. )))
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
nafanja
а ты проведи эксперимент.
к сожалению провести такой эксперимент мне будет весьма затруднительно так как использую одну планку в 4 гига, можно конечно попробовать всё это протестировать на виртуалке но для этого нужно много подготовительных действий да и чистота эксперимента будет нарушена.

Да и в вашем случае вы скорее всего имели дело с zramswap, который на сколько я помню создавал разделы подкачки 1/1 да и еще при том для каждого ядра, а если ещё учесть что сам параметр ядра vm.swappiness оставался равным 60% то будет не удивительна нестабильность работы и как вы упоминали выше "зацикливание".

На сколько я могу судить ваш неудачный опыт можно свести к четырём пунктам:
- использовали сжатие lzo которое хуже сжимает данные чем lz4
- много плохо сжимаемых данных
- плохо подогнанные параметры(чтобы уменьшить вероятность свопания самого себя)
- не оставлен запас прочности
На 128 метров оперативы есть смысл мудрить эту штуку? Ну и с процом без fpu? |
red
--- высокая стабильность(потолок RAM*1.5),
вот это более реально. если все четко заточить, то возможно и можно будет из 2Г выжать 3Г.

dartsergius
На 128 метров
))) уверен смысла нет. но можешь попробовать.
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
dartsergius
На 128 метров оперативы есть смысл мудрить эту штуку? Ну и с процом без fpu? |
без fpu, наверное, лучше не стоит )
но если велико желание то можно и попробовать, может и нормально выйдет.
Особого преимущества от zram и zcaсhe при нормальной работе не замечаю (игрался с ними много). Но при работе с картами местности (приходится периодически работать) предпочитаю Ubuntu или Windows из-за отсутствия тормозов и зависонов при работе с картами в этих системах.
vasek
предпочитаю Ubuntu или Windows из-за отсутствия тормозов и зависонов
на одной и той же машине?

zcaсhe вроде как уже убрали из ядра что то не срослось, хотя идея была хорошая.
zswap только прижился.
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
 
Зарегистрируйтесь или войдите что-бы оставить сообщение.