LINUX.ORG.RU

Zram vs Zswap. Часть 1: практика

 , ,


9

5

Хочу поделиться историей вылезшего косяка настройки свопа.

Я до сих пор гоняю в качестве десктопа железки с очень малым объёмом памяти и соответственно очень активно своплюсь. Раньше для этоого использовал традиционный и более распиареный zram, но потом у меня закралось подозрение что я всё делаю неправильно...

Итак, Raspberry Pi 3, да, до сих пор. Изначально был подключен zram на 400М. Очевидный косяк в том, что он поглощает данные в первую очередь, забивается и всё, выключается из работы, по крайней мере та часть, которая останется невостребованной. В некоторых моих сценариях это может быть полный объём несжимаемыми данными которые будут лежать там мёртвым грузом. Для компенсации этого косяка я разбил zram на 2 участка по 200М и хроном периодически и попеременно высвобождал их. И в целом это работало, система и на холодную, и после высвобождения на какое то время получала пинок под зад.

Но zswap лишён этого недостатка воообще: «мёртвые» данные в сжатом кеше это первый кандидат для сброса на диск, всё как и должно быть. И использование zswap на ноуте с 2Гб памяти показало куда лучшую стабильность произвобительности.

И вот я затеваю эксперимент по пересадке RPi3 на zswap (не сильно просто, ведь у меня там всё ещё самосброное ядро 4.4, опция экспериментальная, нужны пересборки для включения), и получаю неожиданные результаты:

  • Во первых простой прямой свопинг на ssd оказался плавнее и намного стабильнее по лагам. Использование zram только иногда давало прирост производительности, но большую часть времени вызывал лаги и тормоза из за сложных алгоритмов (нагрузка на цпу и очевидно ожидание) и вероятно «мёртвых» данных в оперативке.
  • Во вторых zswap при свопинге на ssd не столько повышает производительность (визуально прироста не видно, вероятно разница проявится в синтетике), сколько снижает i/o и экономит ресурс. Да, во времена hdd обе подсистемы были эффективными ускорителями, но сейчас похоже быстрей скидывать несжатые данные чем сжимать и сортировать их. О чём кстати написано в вике ядра, но туда похоже никто не заглядывает и в статьях это не упоминается.
  • И в третих, оказывается zswap всё таки требует настройки! Не только по используемому алгоритму и объёму буфера, но и по драйверу сжатого буфера (zpool). Есть 3 варианта: zbud (дефолт), zsmalloc и z3fold, настройка через строку параметров ядра при загрузке «zswap.zpool=»
    • zsmalloc должен максимально компактно располагать сжатые страницы в памяти... и не сбрасывать их на диск! Довольно странное решение, мне кажется это вообще противоречит идее zswap.
    • zbud упаковывает в 1 страницу 2 страницы памяти. Пишут что при его использовании степень сжатия памяти в среднем 1,7.
    • z3fold должен паковать до 3 страниц в одну и ожидается степень сжатия до 2,7. По какой то причине z3fold не установлен по умолчанию.

Кстати, с учётом поведения этих драйверов напрашивается вывод: более тяжёлый алгоритм сжатия не обязательно проявит себя лучше.

Часть 2: тесты

★★★★★

Проверено: maxcom ()
Последнее исправление: hobbit (всего исправлений: 5)

Ответ на: комментарий от serg002

Я на дебиане столкнулся с косяком: модуль инициируется и настройка применяется на очень раннем этапе, чуть ли не до монтирования корня где собственно лежит модули ядра. Причём там важен правильный порядок включения опций. Вылечил тем, что заблокировал включение подсистемы при запуске и инициировал её через /etc/local.rc и modprobe вручную уже после загрузки.

kirill_rrr ★★★★★
() автор топика
Ответ на: комментарий от greenman

В генте проще вообще без initramfs. Она нужна для всякого там шифрования корня.

kirill_rrr ★★★★★
() автор топика
Ответ на: комментарий от kirill_rrr

Да, в дебиане такое не редкость))). Иногда я смотрю на всё своё и чувствую, что это похоже не на операционную систему, а на сборник костылей и подпорок. Но работает. В генте такого вроде как меньше, но из-за того, что профилей инициализации два - бывает сложность с настройкой чего-то

serg002 ★★★
()
Ответ на: комментарий от serg002

Да, но суть не в дистре а в ядре, которое инициирует zswap до подключения корня на том что есть. а есть только zbud, так что это вроде как даже не ошибка.

Если грепнуть dmesg то будет что то вроде «запускаюсь с параметрами z3fold и всё прочее, нет драйвера z3fold, запускаюсь с дефолтным zbud». И у меня это всё происходило где то в пределах нулевой секунды когда ещё ничего нет, но уже поздно.

kirill_rrr ★★★★★
() автор топика
Последнее исправление: kirill_rrr (всего исправлений: 2)

У zram’a то явный недостаток: под него выделяется часть памяти, которую можно было бы использовать для более практичных целей нежели хранение мусора. Я считаю, что zram для систем, где много оперативы. Я, например, никогда не использую больше 16 гигов, поэтому для меня не критично, что какой-то программе оперативы не хватит, а вот то что ресурс диска будет уменьшатся из-за сброса кеша на диск - да. Хотя запись 20 терабайт данных за год уменьшила ресурс всего на 2% (и то 3-4 терабайта были записаны сошедшим с ума Baloo)… Сжатие жрет процессор, вся эта распаковка/упаковка, а это деградация чипа, и для производительности лучше на диск этот кеш сбрасывать. НО! у RAM латентность выше чем у диска даже вместе со сжатием. Вывод: zram в большинстве случаев лучше. Проблема только с гибернацией. Для нее нужно systemd-сервис писать, но я ей не пользусь. У меня, кстати, luks, btrfs со сжатием zstd:4 и zram. Из 32 гигов оперативы под zram выделено 8 (дефолт). Несмотря на то, что я ничего не компилю, у меня все равно как минимум 30 мегабайт свопа чем-то забито

quier
()
Ответ на: комментарий от serg002

Ну, не факт что всё доготовили до идеального состояния. В конце концов по дефолту всё ещё zbud, хотя там точно нет никаких преимузеств над z3fold. Ну и это поведение «включаюсь как могу, зато быстро» всё таки присутствует. И да, дистрибутивы отдельно не уделяют зсвоп внимания, зато для настройки зрам целые демоны запускаются. Причём по принципу «хотите зрам? ловите, не подавитесь!», могу поспорить подключение backing_dev в демонах вообще не реализовано, а без него польза довольно сомнительна.

kirill_rrr ★★★★★
() автор топика
Последнее исправление: kirill_rrr (всего исправлений: 1)
Ответ на: комментарий от serg002

Я в генте добавил….Как был zbud - так и остался

Прверил на Calculate, срабатывает zswap.zpool=z3fold. Так что, гента генте рознь.
Надеюсь, здесь не откроется адок, что калька это не гента. :)

upd. Ядро 5.15.82-calculate.

krasnh ★★★
()
Последнее исправление: krasnh (всего исправлений: 1)
Ответ на: комментарий от serg002

Ну, я в вирте запускал iso, и по Tab дописал строку. ) Результат можно проверить после старта системы, командой cat /proc/cmdline.
Понятно, что условия отличаются от реальных.

А dmesg показал zswap: loaded using pool zstd/z3fold. Дефолтно там zbud.

krasnh ★★★
()
Последнее исправление: krasnh (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.