Зачем?
Если вы вдруг оказались с компьютером, в котором RAM распаяна, или все слоты уже использованы, или просто нет возможности добавить еще одну планку памяти, то существует простое решение, имя ему zram.
Я не буду подробно описывать все прелести zram, в интернете достаточно много информации о том, что это такое и как можно использовать. Здесь же я хочу предоставить короткую инструкцию, как быстро и просто "добавить" себе оперативной памяти в популярной ОС.
Что это?
Многие знают о существовании swap (файл подкачки), который начинает использоваться, когда оперативной памяти начинает не хватать. Я, как и многие, стараюсь избавляться от такой штуки, потому как swap использует для хранения данных наши ssd/hdd, что в свою очередь имеет минусы:
медленная скорость записи/чтения
убивает ресурс диска
Но если выключить swap, то мы рискуем повиснуть в тот момент, когда физическая память закончится, ведь магическим образом она ниоткуда не появится... Или появится?!
zram - технология сжатия оперативной памяти. По сути это тот же swap, только размещен он в оперативной памяти и к нему применяются алгоритмы сжатия. Разумеется магия здесь происходит за счёт процессорного времени, потому, хорошо бы иметь процессор вместо пакетика сока.
Делаем
Вся процедура заключается в том, что мы отключим swap и zswap, а затем установим и настроим zram. В моем случае системой является Ubuntu 22.04.
Отключаем swap
sudo swapoff /swapfile
Отключаем создание swap. Для этого закомментируем строку в /etc/fstab
sudo nano /etc/fstab
#/swapfile none swap sw 0 0
Удаляем более не нужный файл где у нас хранился swap
sudo rm -f /swapfile
Нужно отключить zswap если он у нас включен. Для этого изменяем строку в /etc/default/grub
sudo nano /etc/default/grub
GRUB_CMDLINE_LINUX=""
на
GRUB_CMDLINE_LINUX="zswap.enabled=0"
Устанавливаем zram
sudo apt install zram-tools
zram уже работает, но там всего ~200мб, и нам нужно его настроить:
sudo nano /etc/default/zramswap
В своей версии конфига я установил иной алгоритм сжатия (zstd), если процессор будет плохо справляться - можно попробовать менее требовательный lz4.
Объем для zram можно указать относительно физического объема памяти PERCENT, либо абсолютный SIZE. В моем случае это 99% от физического объма.
После изменения конфигурации просто перезапускаем zram
sudo systemctl restart zramswap.service
Удостовериться в том, что всё работает как мы хотели, поможет комманда
zramctl
Подозреваю, что полезность этого решения будет зависить от того с чем вы работаете. В моем случае это написание кода, и тут всё хорошо сжимается, однако если вы работаете с графикой - скорее всего zram окажется не так эффективен.
Комментарии (54)
eandr_67
17.10.2022 19:16+8Помнится, для Win-98SE было несколько «оптимизаторов», якобы сжимающих содержимое RAM. Но и оперативной памяти в системнике тех времён было на два порядка меньше.
Не проще ли — вместо того, чтобы заниматься настройкой тормозящих систему костылей — взять более экономный по потреблению ресурсов дистрибутив Linux с более экономным оконным менеджером? Ставить развесистый Ubuntu при нехватке RAM — мягко говоря, странное решение.pda0
17.10.2022 20:14+5Некоторое время назад была статья с анализом кода такой популярной тогда утилиты SoftRAM, версия для Windows 95 содержала только заглушку для реализации сжатия, в реальности реализуя во всех выпущенных версий только метод COPY (без сжатия). :)
antonblockchain
17.10.2022 22:00+21Win 10 умеет в сжатую память из коробки.
вводим команду
Get-MMAgent
проверяем вывод консоли. В части выводимых данных в строке MemoryCompression вы увидите либо False (Не Включено) либо True (Включено):
Как включить или выключить сжатие в Windows 10/11?
Сжатие включается из той же консоли Powershell командой
Enable-MMAgent -mc
Результаты включения сжатия проявят себя при определённых обстоятельствах, то есть при серьёзной нагрузке на систему.
Выключаем так:
Disable-MMAgent -mc
Обе операции подразумевают перезагрузку Windows.YDR
18.10.2022 09:22+1я еще помню времена, когда mmap был в Linux, а в Windows не было (если не ошибаюсь, давно было).
krimtsev
18.10.2022 10:44а как лучше поступить для игр, выключить или оставить включенной?
по умолчанию была включена.
antonblockchain
18.10.2022 11:54лучше включить.
выключить можно если у вас 64gb
но тогда она и сжимать не будет.
она сжимает вместо! того чтобы кинуть в свап.
axe_chita
18.10.2022 07:59Помнится, для Win-98SE было несколько «оптимизаторов», якобы сжимающих содержимое RAM. Но и оперативной памяти в системнике тех времён было на два порядка меньше.
И некоторые из них (к примеру MagnaRAM из QEMM), вполне себе работали и до появления Win98se, и в 3.1(1) и 95. ''МЯГКАЯ'' ПАМЯТЬ. ПО для увеличения объема ОЗУ
Stanislavvv
18.10.2022 11:45+1Даже с неразвесистым дебианом, где поставлен lxde, лучше добавить пару гиг через zramswap, ибо браузер сожрёт всё.
ganzmavag
17.10.2022 19:46+2Такая же по смыслу технология в MacOS и Windows текущих используется. Но есть вопрос все-таки, почему в Ubuntu ее не включают в дистрибутив, если она такая классная.
Я так понимаю, логика в использовании сжатой оперативки есть, когда она промежуточная между используемыми данными и данными в swap. А когда вместо swap - спорно. Система хочет скинуть в своп данные, которые ей скорее всего пока не понадобятся, а тут раз и свопа нет, и ей все равно приходится хранить эти данные пусть и сжатые, но в той же оперативке, которой не хватает.
staticmain
18.10.2022 00:10-8почему в Ubuntu ее не включают в дистрибутив, если она такая классная.
Потому что
а) Нет смысла ставить linux на сверхмощный комп с прекрасным процессором - игрушки играют на виндовых машинах (оставим тот процент, который играет на wine)
б) Сжатие хорошо работает на тексте, плохо на мультимедиа, совсем плохо на бинарях. Если ваша станция будет использоваться для рендера - мы получите минус в производительности.khajiit
18.10.2022 00:22+5Только:
а) бинари, в общем случае, сжимаются гораздо лучше мультимедии, потому что мультимедия и так сжата по умолчанию, а бинари — нет
б) сжатие прекрасно работает на регулярных паттернах, в кои входят и декомпрессированные текстуры, и другие структуры в памяти
в) сжатие памяти это трейдофф, и его надо применять там, где он подходит. Обычно лучше увеличить количество памяти и/или свопаstaticmain
18.10.2022 00:27-7бинари, в общем случае, сжимаются гораздо лучше мультимедии
Простите, что? Уровень сжатия бинарей - меньше 1%, там полностью рандомизированные данные без паттернов. В графике таких паттернов до 40% от объема, в мультимедиа они периодически бывают, например повторяющиеся фреймы.
>сжатие памяти это трейдофф, и его надо применять там, где он подходит.
Ну так мой посыл в том и есть, что его нельзя включать по умолчанию везде.khajiit
18.10.2022 00:37+6Уровень сжатия бинарей — меньше 1%
Вы путаете бинари и энтропию. Высокоэнтропийные данные не сжимаются или сжимаются очень плохо, это да.
Бинарь, состоящий из хорошо сжимаемого паттерна — нулей, например — все еще бинарь. С коэффициентом сжатия хоть 1:1000000000, если длина и паттерн позволяют.staticmain
18.10.2022 00:40-8Бинарь, состоящий из хорошо сжимаемого паттерна — нулей, например — все еще бинарь.
Какой смысл говорить о бинарях, которые никогда не попадутся пользователю? Практически все бинари - это высокоэнтропийные данные
khajiit
18.10.2022 00:47+7Какой смысл говорить о бинарях, которые никогда не попадутся пользователю?
Сжатием памяти занимается не пользователь, ВНЕЗАПНО.
И представление в памяти, ВНЕЗАПНО, частенько низкоэнтропийное.Практически все бинари — это высокоэнтропийные данные
Структуры БД, например, которые ведет в том или ином виде практически любое приложение. Текстуры, карты и битмапы. Объекты, списки и другие структуры используемые приложением в памяти, которую можно сжать.
Продолжать можно бесконечно.
daggert
18.10.2022 01:09+19Накидал рандомных бинарей в winrar:
zhka
18.10.2022 01:26PE/ELF на диске и рантайм память приложения все-таки две большие разницы...
JerleShannara
18.10.2022 02:33+7Да, в памяти они могут быть в ещё более сжимаемом виде, особенно если исходный pe/elf был загажен каким-нибудь упаковщиком/защитой.
unC0Rr
18.10.2022 09:56+3Пожалуйста, корка фаерфокса:
-rw-rw-r-- 1 user user 14137013952 Oct 18 08:49 core.1821058
-rw-rw-r-- 1 user user 217008622 Oct 18 08:49 core.1821058.zst
Что даёт размер сжатых данных на уровне 1.54% от исходных.
rogoz
18.10.2022 01:11+3Уровень сжатия бинарей — меньше 1%
Вот прямо ща взял:regedit.exe 361 Кб
regedit.7z 122 Кб
Wow.exe 7,34 Мб
Wow.7z 2,42 Мб
JoplinPortable.exe 189,8 Мб
JoplinPortable.7z 183,6 Мб
Везде больше 1%.
nidalee
18.10.2022 21:46В графике таких паттернов до 40% от объема, в мультимедиа они периодически бывают, например повторяющиеся фреймы.
Покажите работающий на уровне ФС способ сжатия (кроме мультимедиа энкодеров), способный сжать хотя бы i-frame only видео (после intra-frame энкодера).
crawlingroof
17.10.2022 19:57+1Технология рабочая!!! :)
https://store.steampowered.com/app/501500/Black_Moon_Chronicles/
Работала минут 20 без "quarterdeck magnaram" - лютая утечка памяти, с компрессией можно было закончить уровень.
Звуковая дорожка - шедевральная
pda0
17.10.2022 20:06+22zram имеет смысл использовать когда swap недоступен, а память нужна. В противном случае целесообразнее использовать zswap (тот же zram, но ещё и умеющий реально сбрасывать сжатые данные на диск при недостатке памяти).
eigrad
17.10.2022 22:11+1Жалко что на диск данные из zswap по какой-то причине сбрасываются не сжатыми.
khajiit
17.10.2022 22:49+3Потому что pda0 ошибся, это стандартный механизм, и он ничего не знает о сжатии страниц.
Но, в целом, если есть шансы, что данные в свап сбрасываются не большими кусами, а страничка тут, страничка там (а это поведение ожидаемое) — то zram будет скорее вреден.
Зато он хорошо заходит на смартфонах, где писать на флэш не желательно.pda0
18.10.2022 11:23+2Ну, справедливости ради, у смарта больше шансов быть выброшенным по причине "уже много лет не поддерживается производителем", чем дождаться смерти встроенной flash-памяти.
khajiit
18.10.2022 12:24+1Согласен. Но менее тормозной она от этого не становится, а учитывая непредсказуемыую природу флэш-памяти, в целом, zram будет более отзывчивым.
Rastler
17.10.2022 23:23+3А в Fedora это из "коробки"...
chupasaurus
18.10.2022 04:08+1А в Gentoo через USE-флаги поди. Давайте не сравнивать альфа-версии дистрибутивов со "стабильными".
anwender95
18.10.2022 07:03zram клевая штука — юзаю ее на апельсинках.
Но при каком количестве памяти это оправдано?
Да и лишаться возможности уходить в сон не хотелось бы.Stanislavvv
18.10.2022 11:49Как раз на Orange PI 3 LTS выключил сей свап нафиг - почему-то даже при его неиспользовании заметно тормозил вход по ssh и запуск утилит.
DjPhoeniX
18.10.2022 21:21Почему-то вангую, что тормозил запуск любого бинаря на время его вычитывания из тормозной флешки…
Stanislavvv
20.10.2022 08:05Даже если в кеше? А почему прекращало тормозить после выключения zramswap?
YDR
18.10.2022 09:25+1ошибка в памяти может стать более разрушительной на сжатых данных. Зато и более заметной.
antonblockchain
18.10.2022 10:15+1нет, скорее наоборот.
нерегламентированный выход за границы который идет в обход управления страницами памяти.
(а это возможно)
скорее всего приведет к тому что ни прочитать ни записать ничего не получится в упакованную страницу.
такие упаковщики еще один барьер для нестандартного доступа к памяти.
Fragster
18.10.2022 11:23Использовал такое на "сервере" с 512 оперативки. Позволило поднять эффективный размер памяти в среднем более чем в два раза. Свап не отключал, а расставил приоритеты - zramовский своп сначала, обычный - потом. при этом zram своп сделал гиг (х2 от ОП).
junari
18.10.2022 12:22Просто включения службы zram в линукс дистрибутивах обычно недостаточно, необходимо хотя бы минимально "подтюнить" ядро при помощи sysctl.
Я обычно меняю параметры vm.swappiness = 170 (увеличение использования swap, в старых ядрах максимум можно было выставить 100) и vm.page-cluster = 0 (уменьшение страницы памяти для более активного копирования в zram).
Hidden text
fk0
18.10.2022 15:13-1Толку от zram много не будет. Проще купить самсунговский быстрый SSD со своим большим RAM (кеш-памятью) и вставить вместо штатного. И да, на нём сделать swap. Который будет работать во-первых со скоростями сопоставимыми с zram, во-вторых способен принять значительные объёмы.
Для примера, имеем такую картину в момент перехода в браузере по нескольким десяткам вкладок, см. ниже, из свопа читается или выкидывается порядка 20 МБ/сек, что намного ниже пиковой производительности SSD.
```
$ free
total used free shared buff/cache available
Mem: 8058404 6677464 748932 238356 632008 891148
Swap: 31250428 2107904 29142524
$ vmstat -n 1
(как вставить в хабр преформатированный текст я не понял, видимо никак).Fragster
18.10.2022 15:15+2На "почти бесплатных vds" с урезанной рамой и ограничением по иопсам толк есть
edo1h
18.10.2022 23:54Проще купить самсунговский быстрый SSD
время доступа (а именно оно важно для своппинга) на разным ssd не так уж сильно отличается, если говорить про чтение, то от ≈100 мс на sata до ≈50 мс на топовых nvme.
и samsung тут ничем не выделяется.со своим большим RAM (кеш-памятью)
так не бывает.
ram обычно ставится из расчёта один гигабайт на тербайт ёмкости (если не брать dram-less ssd) и используется память в первую очередь для хранения таблицы ftl.fk0
19.10.2022 00:46Что??? 1.7мс вот конкретно на Samsung SSD 860 EVO.
ioping -c 100 -i 0.1 -s 65536 /tmp/
...
--- /tmp/ (ext4 /dev/sda6) ioping statistics ---
99 requests completed in 157.1 ms, 6.19 MiB read, 630 iops, 39.4 MiB/s
generated 100 requests in 9.90 s, 6.25 MiB, 10 iops, 646.3 KiB/s
min/avg/max/mdev = 360.9 us / 1.59 ms / 1.70 ms / 214.0 us
hogstaberg
18.10.2022 17:11+1Да перестаньте вы уже zram вместо свопа пытаться пихать постоянно! Он отвратительно себя показывает в целом наборе случаев. На свете есть zswap. Zram это про эмуляцию блочного устройства со сжатием в оперативке.
Fragster
18.10.2022 17:28Каждому инструменту свое использование. На экстремально малом количестве оперативы zram часто лучше (естественно, нужно оставить и "классический" своп, у которого просто приоритет использования меньше), когда есть хотя бы чуть-чуть достаточное количество - по большому счету без разницы.
Quei
Как данный подход дружит с дисковым кэшем сейчас? На значительно более ранней версии Ubuntu я наблюдал сильную деградацию скорости подгрузки исходных кодов при фактическом увеличении объема памяти.