LINUX.ORG.RU
ФорумAdmin

Как лучше сделать сжатый swap?

 , ,


1

5

Привет. На моем ноуте периодически не хватает памяти под рабочие задачки. Поэтому использую zswap, он хорошо справляется, но имеет недостаток. Когда нужно вытеснить страницу памяти из сжатого кэша в памяти, он ее разжимает и потом сохраняет с своп (насколько я выяснил дойдя аж до исходников https://github.com/torvalds/linux/blob/master/mm/zswap.c /* decompress */…но подробно не разбрался), что повышает дисковый IO. Мне хотелось бы что бы этого разжимания не было. Отсюда два вопроса.

  1. Есть ли аналог zswap, который умеет скидывать в своп сжатые страницы? zram в этом смысле вообще просто раздел в памяти сжатого свопа вроде бы просто заполнится и дальше будет работать своп на ссд следующий по приоритету без сжатия?
  2. Как можно сделать сжатый файл подкачки на уровне фс, что бы страницы zswap разжимал, а фс опять на лету сжимала? Это костыль конечно, но хоть так можно уменьшить износ ссд при использовании подкачки.

Имею SWAP на ZVOL, который имеет свойство сжатия «lz4» (унаследовано от родительского пула).

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

zfs тащить сложно :) Но, принятно. Не знал, что zfs умеет свопы. Насколько я помню у btrfs со свопами раньше были проблемы, сейчас не знаю.

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

Я тоже не понял этот момент. Ненужные и несжатые страницы на диск. Выглядит как тоже самое, что в zswap почти. Причем зачем это надо если zram создает своп «обычный» в памяти и там приоритеты свопа просто работают. В общем неясно и мне.

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

Посмотрел. Начиная с btrfs в ядре 5 версии оно умеет своп, но без COW и без сжатия. Странно, нежели альтернатив zfs нет :) Правда я не разбирался с zcache совсем, он навороченный, может там можно все.

i3draven ★★ ()

В линуксе нет API или в принципе реализации передачи информации о сжатии страниц памяти. Поэтому любая из реализаций сжатия страниц памяти не будет ничего знать о состоянии страниц в другой реализации. Поэтому при использовании нескольких реализаций в лучшем случае будут доп накладные расходы на разжатие и последующее сжатие одних и тех же страниц. Более того, реализация swap файла в линуксе такова, что большинство новых ФС требуется допиливать для поддержки этого самого swap файла (f2fs вот допиливали). Вполне может быть, что сжатие swap файла в линуксе в принципе невозможно (ну или крайне трудно реализуемо) на уровне ФС и может быть реализовано только на уровень выше – в блочных устройствах, например в ZFS/zvol

Так как ФС с сжатием в линуксе не так много, можно попробовать swap на f2fs. Сжатие там завезли в 5.5-5.7, так что бери ядро поновее и пробуй)

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

Пока что zswap показал себя лучше чем zram. Но zram я использовал (пару лет) без back свопа. Так что когда он заполнялся, то приходил earlyoom. Я так долго жил и в принципе норм, иногда после недели работы ноута прибивалась среда разработки и я снова ее стартовал. С zswap пока что вообще нет проблем, даже когда своп уже пашет, нет диких тормозов, которые были с zram без бэк свопа и без earlyoom, с ним просто система вставала мертво…потому я earlyoom прикрутил. zram+back не пробовал, что то руки не дошли.

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

Мне в том коменте непонятно зачем человеку понадобилось zram+zswap делать. Они по сути одно и то же делают. Только один делает это путем создания пула сжатых страниц и сброса надиск лишнего, а второй делает это же самое путем создания блочного устройства в качестве свопа в памяти и сброса лишнего на диск.

У zram есть преимущество небольшое в том, что он создает по свопу на ядро (для распределения сжатия на ядрах), но у человека с скриптом своп в памяти один и это не использует. Странно в общем.

zram-config в убунте делает автоматом по свопу на ядро, что разумнее, но я не видел как там задать бэк своп…потому, не желая уже вечером возиться настроил zswap :)

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

Ну, своим глазам я верю :) Если взять zram, не указать ему бэк своп. После чего сожрать всю память (у меня всего 16гб, но мало). То система повиснет к хренам :) Потому я прикрутил earlyoom

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

в убунте делает автоматом по свопу на ядро, что разумнее

Современные ядра распараллеливают работу с zram. Одного устройства достаточно.

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

диких тормозов, которые были с zram без бэк свопа и без earlyoom

зачем использовать zram без юзерспейсного киллера?

hakavlad ★★★ ()

Есть ли аналог zswap, который умеет скидывать в своп сжатые страницы?

zram скидывает в своп сжатые страницы.

и дальше будет работать своп на ссд

Зачем насиловать ссд, если уже есть своп на zram?

hakavlad ★★★ ()

decompress */…но подробно не разбрался), что повышает дисковый IO

Использование свопа ТОЛЬКО на zram решает проблему.

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

Затем, что мне не нравится когда среду разработки убивают :) С zswap своп просто стал мягко работать, когда он задействован на ссд, я не замечал разницы пока что в работе. Так что я убрал zram+earlyoom и просто оставил zswap, уже так система перестала вставать колом совсем. У меня 8Гб выделено из 16 под zswap ссжатый пул страниц+8гб своп на диске…пока хватит. Теперь задача состоит в сжатии свопа что бы диск поберечь, но не уверен, что это нужно, скорее уже «добить если легко будет».

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

Подкажите где вы прочитали, что zram скидывает сжатое? Я видел, что скидывает idle страницы (не знаю, что это) и несжимаемые страницы.

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

Зрам - сжатое в памяти устройство. Особо-то и не скидывает, просто хранит сжатые страницы. Зачем куда-то скидывать?

Pages written to these disks are compressed and stored in memory itself.

https://www.kernel.org/doc/html/latest/admin-guide/blockdev/zram.html

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

мне не нравится когда среду разработки убивают

Так делайте zram disksize намного больше.

zram-config по умолчанию создает слишком маленькое устройство.

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

Pages written to these disks are compressed and stored in memory itself.

Это написано о том, что он сжимает то, что будет в памяти на созданных им блочных устройствах. То, что он будет скидывать на ssd если место кончится он сжимать насколько я понимаю тоже не будет…или я неправильно понял когда читал эту же доку :)

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

Если у вас 16 гиг памяти, то zram disksize вполне можно выставить в 25 гиг.

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

Например, 200%. Федора 34 по умолчанию будет вкл своп на zram на 100%. СМ https://fedoraproject.org/wiki/Changes/Scale_ZRAM_to_full_memory_size

Вот демо https://www.youtube.com/watch?v=c5bAOJkX_uc - игра со zram больше размера оперативы, и все супер.

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

zswap используется как быстрый «буфер». Он легко отдаёт память обратно (при выгрузке страниц в своп). И он работает независимо от zram. Соотвественно у него стоит самый быстрый из доступных алгоритмов сжатия и его задача принять на себя «первый удар». Идея чем-то напоминает SLC кеш в SSD. Когда zswap заполняется до предела или оперативки становится мало, происходит сброс страниц из него в zram, у которого настроен более медленный и эффективный алгоритм сжатия. Соответственно происходит дальнейшее ужатие страниц в памяти и освобождение оперативки для тех приложений которым она нужна.

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

Не знал, спасибо, попробую. Мне казалось, что zram disksize задает фактически выделеную память, а не «возможно сжатую». Тогда действительно указать можно всю оперативку!

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

50% памяти

Это макс размер НЕСЖАТЫХ данных. В сжатом виде это 20-25% - не так уж много.

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

Более того, если сжатие 3 к одному, то можно и 250% указать.

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

Для ограничения реального объема оперативной памяти у zram можно использовать /sys/block/zram0/mem_limit. Но я ориентируюс на то, что данные в памяти будут занимать в 3-4 раза меньше, чем размер zswap устройства

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

Ок, идея понятна. У меня проц такой, что любое сжатие не заметно при моих нагрузках (ide для разработки). Так что думаю попробую zram+disksize размером с 1.5 памяти+бэк своп.

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

можно использовать /sys/block/zram0/mem_limit

Этот лимит - неприятная вещь: ядро стремительно срет ошибками, журнал повреждается, а система виснет.

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

бэк своп

Это требует конфига ядра, и этот конфиг не во всяком ядре включен. CONFIG_ZRAM_WRITEBACK может быть не установлен.

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

watermark_scale_factor

Если его поднимать, в top часть памяти постоянно отображается как кэшированная, сброс кэша не помогает.

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

Так нам это и нужно - кэширование файловых страниц.

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

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

Поставил zram-config и его скрипт старта /usr/bin/init-zram-swapping заменил на этот

modprobe zram num_devices=1
# Calculate memory to use for zram (1/2 of ram)
totalmem=`LC_ALL=C free | grep -e "^Mem:" | sed -e 's/^Mem: *//' -e 's/  *.*//'`
mem=$((totalmem*2*1024))

# initialize the devices
echo $mem > /sys/block/zram0/disksize
echo zstd > /sys/block/zram0/comp_algorithm
echo /dev/sda2 > /sys/block/zram0/backing_dev 
mkswap /dev/zram0
swapon -p 5 /dev/zram0

Поднялось, пашет. writeback в ядре включен, я liquorix использую. Поглядим как будет работать.

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

Переписал скрипт :)

modprobe zram num_devices=1
# Calculate memory to use for zram (1/2 of ram)
totalmem=`LC_ALL=C free | grep -e "^Mem:" | sed -e 's/^Mem: *//' -e 's/  *.*//'`
mem=$((totalmem*2*1024))

# initialize the devices
echo zstd > /sys/block/zram0/comp_algorithm
echo /dev/sda2 > /sys/block/zram0/backing_dev
echo $mem > /sys/block/zram0/disksize
mkswap /dev/zram0
swapon -p 5 /dev/zram0

Порядок задания парметров zram имеет значение. Если задать дисксайз, то остальные параметры оно задать не даст уже.

i3draven ★★ ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей