Зачем?

Если вы вдруг оказались с компьютером, в котором RAM распаяна, или все слоты уже использованы, или просто нет возможности добавить еще одну планку памяти, то существует простое решение, имя ему zram.

Я не буду подробно описывать все прелести zram, в интернете достаточно много информации о том, что это такое и как можно использовать. Здесь же я хочу предоставить короткую инструкцию, как быстро и просто "добавить" себе оперативной памяти в популярной ОС.

Что это?

Многие знают о существовании swap (файл подкачки), который начинает использоваться, когда оперативной памяти начинает не хватать. Я, как и многие, стараюсь избавляться от такой штуки, потому как swap использует для хранения данных наши ssd/hdd, что в свою очередь имеет минусы:

  • медленная скорость записи/чтения

  • убивает ресурс диска

Но если выключить swap, то мы рискуем повиснуть в тот момент, когда физическая память закончится, ведь магическим образом она ниоткуда не появится... Или появится?!

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

Делаем

Вся процедура заключается в том, что мы отключим swap и zswap, а затем установим и настроим zram. В моем случае системой является Ubuntu 22.04.

  1. Отключаем swap

sudo swapoff /swapfile
  1. Отключаем создание swap. Для этого закомментируем строку в /etc/fstab

sudo nano /etc/fstab

#/swapfile    none    swap    sw    0    0
Отлючаем swapfile
Отлючаем swapfile
  1. Удаляем более не нужный файл где у нас хранился swap

sudo rm -f /swapfile
  1. Нужно отключить zswap если он у нас включен. Для этого изменяем строку в /etc/default/grub

sudo nano /etc/default/grub

GRUB_CMDLINE_LINUX=""

на

GRUB_CMDLINE_LINUX="zswap.enabled=0"
  1. Устанавливаем zram

sudo apt install zram-tools
  1. zram уже работает, но там всего ~200мб, и нам нужно его настроить:

sudo nano /etc/default/zramswap
Конфигурация zram
Конфигурация zram

В своей версии конфига я установил иной алгоритм сжатия (zstd), если процессор будет плохо справляться - можно попробовать менее требовательный lz4.

Объем для zram можно указать относительно физического объема памяти PERCENT, либо абсолютный SIZE. В моем случае это 99% от физического объма.

  1. После изменения конфигурации просто перезапускаем zram

sudo systemctl restart zramswap.service

Удостовериться в том, что всё работает как мы хотели, поможет комманда

zramctl
Как видно компрессия очень неплохая ~ x4
Как видно компрессия очень неплохая ~ x4

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

Комментарии (54)


  1. Quei
    17.10.2022 18:45
    +2

    Как данный подход дружит с дисковым кэшем сейчас? На значительно более ранней версии Ubuntu я наблюдал сильную деградацию скорости подгрузки исходных кодов при фактическом увеличении объема памяти.


  1. eandr_67
    17.10.2022 19:16
    +8

    Помнится, для Win-98SE было несколько «оптимизаторов», якобы сжимающих содержимое RAM. Но и оперативной памяти в системнике тех времён было на два порядка меньше.

    Не проще ли — вместо того, чтобы заниматься настройкой тормозящих систему костылей — взять более экономный по потреблению ресурсов дистрибутив Linux с более экономным оконным менеджером? Ставить развесистый Ubuntu при нехватке RAM — мягко говоря, странное решение.


    1. pda0
      17.10.2022 20:14
      +5

      Некоторое время назад была статья с анализом кода такой популярной тогда утилиты SoftRAM, версия для Windows 95 содержала только заглушку для реализации сжатия, в реальности реализуя во всех выпущенных версий только метод COPY (без сжатия). :)


    1. antonblockchain
      17.10.2022 22:00
      +21

      Win 10 умеет в сжатую память из коробки.
      Win 10 умеет в сжатую память из коробки.

      вводим команду
      Get-MMAgent
      проверяем вывод консоли. В части выводимых данных в строке MemoryCompression вы увидите либо False (Не Включено) либо True (Включено):

      Как включить или выключить сжатие в Windows 10/11?
      Сжатие включается из той же консоли Powershell командой
      Enable-MMAgent -mc
      Результаты включения сжатия проявят себя при определённых обстоятельствах, то есть при серьёзной нагрузке на систему.

      Выключаем так:
      Disable-MMAgent -mc
      Обе операции подразумевают перезагрузку Windows.


      1. YDR
        18.10.2022 09:22
        +1

        я еще помню времена, когда mmap был в Linux, а в Windows не было (если не ошибаюсь, давно было).


      1. krimtsev
        18.10.2022 10:44

        а как лучше поступить для игр, выключить или оставить включенной?

        по умолчанию была включена.


        1. antonblockchain
          18.10.2022 11:54

          лучше включить.
          выключить можно если у вас 64gb
          но тогда она и сжимать не будет.
          она сжимает вместо! того чтобы кинуть в свап.


          1. krimtsev
            18.10.2022 12:14

            у меня 16 ОЗУ, и 4-8ГБ свопа

            ок, оставляем включенным) спасибо


    1. axe_chita
      18.10.2022 07:59

      Помнится, для Win-98SE было несколько «оптимизаторов», якобы сжимающих содержимое RAM. Но и оперативной памяти в системнике тех времён было на два порядка меньше.
      И некоторые из них (к примеру MagnaRAM из QEMM), вполне себе работали и до появления Win98se, и в 3.1(1) и 95. ''МЯГКАЯ'' ПАМЯТЬ. ПО для увеличения объема ОЗУ


    1. Stanislavvv
      18.10.2022 11:45
      +1

      Даже с неразвесистым дебианом, где поставлен lxde, лучше добавить пару гиг через zramswap, ибо браузер сожрёт всё.


  1. ganzmavag
    17.10.2022 19:46
    +2

    Такая же по смыслу технология в MacOS и Windows текущих используется. Но есть вопрос все-таки, почему в Ubuntu ее не включают в дистрибутив, если она такая классная.

    Я так понимаю, логика в использовании сжатой оперативки есть, когда она промежуточная между используемыми данными и данными в swap. А когда вместо swap - спорно. Система хочет скинуть в своп данные, которые ей скорее всего пока не понадобятся, а тут раз и свопа нет, и ей все равно приходится хранить эти данные пусть и сжатые, но в той же оперативке, которой не хватает.


    1. staticmain
      18.10.2022 00:10
      -8

      почему в Ubuntu ее не включают в дистрибутив, если она такая классная.

      Потому что
      а) Нет смысла ставить linux на сверхмощный комп с прекрасным процессором - игрушки играют на виндовых машинах (оставим тот процент, который играет на wine)
      б) Сжатие хорошо работает на тексте, плохо на мультимедиа, совсем плохо на бинарях. Если ваша станция будет использоваться для рендера - мы получите минус в производительности.


      1. khajiit
        18.10.2022 00:22
        +5

        Только:
        а) бинари, в общем случае, сжимаются гораздо лучше мультимедии, потому что мультимедия и так сжата по умолчанию, а бинари — нет
        б) сжатие прекрасно работает на регулярных паттернах, в кои входят и декомпрессированные текстуры, и другие структуры в памяти
        в) сжатие памяти это трейдофф, и его надо применять там, где он подходит. Обычно лучше увеличить количество памяти и/или свопа


        1. staticmain
          18.10.2022 00:27
          -7

           бинари, в общем случае, сжимаются гораздо лучше мультимедии

          Простите, что? Уровень сжатия бинарей - меньше 1%, там полностью рандомизированные данные без паттернов. В графике таких паттернов до 40% от объема, в мультимедиа они периодически бывают, например повторяющиеся фреймы.

          >сжатие памяти это трейдофф, и его надо применять там, где он подходит. 
          Ну так мой посыл в том и есть, что его нельзя включать по умолчанию везде.


          1. khajiit
            18.10.2022 00:37
            +6

            Уровень сжатия бинарей — меньше 1%

            Вы путаете бинари и энтропию. Высокоэнтропийные данные не сжимаются или сжимаются очень плохо, это да.
            Бинарь, состоящий из хорошо сжимаемого паттерна — нулей, например — все еще бинарь. С коэффициентом сжатия хоть 1:1000000000, если длина и паттерн позволяют.


            1. staticmain
              18.10.2022 00:40
              -8

              Бинарь, состоящий из хорошо сжимаемого паттерна — нулей, например — все еще бинарь.

              Какой смысл говорить о бинарях, которые никогда не попадутся пользователю? Практически все бинари - это высокоэнтропийные данные


              1. khajiit
                18.10.2022 00:47
                +7

                Какой смысл говорить о бинарях, которые никогда не попадутся пользователю?

                Сжатием памяти занимается не пользователь, ВНЕЗАПНО.
                И представление в памяти, ВНЕЗАПНО, частенько низкоэнтропийное.


                Практически все бинари — это высокоэнтропийные данные

                Структуры БД, например, которые ведет в том или ином виде практически любое приложение. Текстуры, карты и битмапы. Объекты, списки и другие структуры используемые приложением в памяти, которую можно сжать.
                Продолжать можно бесконечно.


              1. daggert
                18.10.2022 01:09
                +19

                Накидал рандомных бинарей в winrar:


                1. zhka
                  18.10.2022 01:26

                  PE/ELF на диске и рантайм память приложения все-таки две большие разницы...


                  1. JerleShannara
                    18.10.2022 02:33
                    +7

                    Да, в памяти они могут быть в ещё более сжимаемом виде, особенно если исходный pe/elf был загажен каким-нибудь упаковщиком/защитой.


                  1. 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% от исходных.


          1. 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%.


            1. 13werwolf13
              18.10.2022 08:04
              +1

              возьмите zstd и при сжатии установите его на 19, zstd умеет удивлять


          1. nidalee
            18.10.2022 21:46

            В графике таких паттернов до 40% от объема, в мультимедиа они периодически бывают, например повторяющиеся фреймы.
            Покажите работающий на уровне ФС способ сжатия (кроме мультимедиа энкодеров), способный сжать хотя бы i-frame only видео (после intra-frame энкодера).


      1. Eugeeny
        18.10.2022 17:04

        кринж


  1. crawlingroof
    17.10.2022 19:57
    +1

    Технология рабочая!!! :)
    https://store.steampowered.com/app/501500/Black_Moon_Chronicles/
    Работала минут 20 без "quarterdeck magnaram" - лютая утечка памяти, с компрессией можно было закончить уровень.
    Звуковая дорожка - шедевральная


  1. pda0
    17.10.2022 20:06
    +22

    zram имеет смысл использовать когда swap недоступен, а память нужна. В противном случае целесообразнее использовать zswap (тот же zram, но ещё и умеющий реально сбрасывать сжатые данные на диск при недостатке памяти).


    1. eigrad
      17.10.2022 22:11
      +1

      Жалко что на диск данные из zswap по какой-то причине сбрасываются не сжатыми.


      1. khajiit
        17.10.2022 22:49
        +3

        Потому что pda0 ошибся, это стандартный механизм, и он ничего не знает о сжатии страниц.
        Но, в целом, если есть шансы, что данные в свап сбрасываются не большими кусами, а страничка тут, страничка там (а это поведение ожидаемое) — то zram будет скорее вреден.
        Зато он хорошо заходит на смартфонах, где писать на флэш не желательно.


        1. pda0
          18.10.2022 11:23
          +2

          Ну, справедливости ради, у смарта больше шансов быть выброшенным по причине "уже много лет не поддерживается производителем", чем дождаться смерти встроенной flash-памяти.


          1. khajiit
            18.10.2022 12:24
            +1

            Согласен. Но менее тормозной она от этого не становится, а учитывая непредсказуемыую природу флэш-памяти, в целом, zram будет более отзывчивым.


            1. pda0
              20.10.2022 09:25
              +1

              А, вы в этом плане. Я подумал, что в 2022 продолжаю слышать страшилки про износ.


              1. khajiit
                20.10.2022 11:20

                Иногда встречаются, все еще ) Но каджит старается хотя бы иногда курить матчасть.


  1. Rastler
    17.10.2022 23:23
    +3

    А в Fedora это из "коробки"...


    1. chupasaurus
      18.10.2022 04:08
      +1

      А в Gentoo через USE-флаги поди. Давайте не сравнивать альфа-версии дистрибутивов со "стабильными".


  1. ogost
    18.10.2022 04:09
    +7

    хабр, который мы заслужили


    1. dlinyj
      18.10.2022 15:19
      +6

      Вы всегда можете исправить эту ситуацию: взять и написать классную статью.


  1. anwender95
    18.10.2022 07:03

    zram клевая штука — юзаю ее на апельсинках.
    Но при каком количестве памяти это оправдано?
    Да и лишаться возможности уходить в сон не хотелось бы.


    1. Stanislavvv
      18.10.2022 11:49

      Как раз на Orange PI 3 LTS выключил сей свап нафиг - почему-то даже при его неиспользовании заметно тормозил вход по ssh и запуск утилит.


      1. DjPhoeniX
        18.10.2022 21:21

        Почему-то вангую, что тормозил запуск любого бинаря на время его вычитывания из тормозной флешки…


        1. Stanislavvv
          20.10.2022 08:05

          Даже если в кеше? А почему прекращало тормозить после выключения zramswap?


  1. YDR
    18.10.2022 09:25
    +1

    ошибка в памяти может стать более разрушительной на сжатых данных. Зато и более заметной.


    1. antonblockchain
      18.10.2022 10:15
      +1

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

      такие упаковщики еще один барьер для нестандартного доступа к памяти.


  1. Fragster
    18.10.2022 11:23

    Использовал такое на "сервере" с 512 оперативки. Позволило поднять эффективный размер памяти в среднем более чем в два раза. Свап не отключал, а расставил приоритеты - zramовский своп сначала, обычный - потом. при этом zram своп сделал гиг (х2 от ОП).


  1. junari
    18.10.2022 12:22

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

    Я обычно меняю параметры vm.swappiness = 170 (увеличение использования swap, в старых ядрах максимум можно было выставить 100) и vm.page-cluster = 0 (уменьшение страницы памяти для более активного копирования в zram).

    Hidden text


    1. mrobespierre
      20.10.2022 07:58

      ещё

      vm.watermark_scale_factor = 500

      попробуйте, для zram актуально


  1. 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
    (как вставить в хабр преформатированный текст я не понял, видимо никак).


    1. Fragster
      18.10.2022 15:15
      +2

      На "почти бесплатных vds" с урезанной рамой и ограничением по иопсам толк есть


    1. edo1h
      18.10.2022 23:54

      Проще купить самсунговский быстрый SSD

      время доступа (а именно оно важно для своппинга) на разным ssd не так уж сильно отличается, если говорить про чтение, то от ≈100 мс на sata до ≈50 мс на топовых nvme.
      и samsung тут ничем не выделяется.


      со своим большим RAM (кеш-памятью)

      так не бывает.
      ram обычно ставится из расчёта один гигабайт на тербайт ёмкости (если не брать dram-less ssd) и используется память в первую очередь для хранения таблицы ftl.


      1. 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


      1. fk0
        19.10.2022 00:48
        -1

        Какие вообще 100мс, только сейчас сообразил, что во временах 286-х машин было порядка 15мс. На жестком диске!


        1. edo1h
          19.10.2022 04:29
          +1

          Опечатка, конечно, речь шла о микросекундах.


  1. hogstaberg
    18.10.2022 17:11
    +1

    Да перестаньте вы уже zram вместо свопа пытаться пихать постоянно! Он отвратительно себя показывает в целом наборе случаев. На свете есть zswap. Zram это про эмуляцию блочного устройства со сжатием в оперативке.


    1. Fragster
      18.10.2022 17:28

      Каждому инструменту свое использование. На экстремально малом количестве оперативы zram часто лучше (естественно, нужно оставить и "классический" своп, у которого просто приоритет использования меньше), когда есть хотя бы чуть-чуть достаточное количество - по большому счету без разницы.