Zram против zswap: два способа уместить кварту в пинту. Сравнение методов сжатия памяти в Linux для оптимизации использования ОЗУ. — theregister.com
В Linux существует два способа сжатия памяти — zram и zswap, но о втором вы редко слышите. The Register сравнивает и противопоставляет их.
Инструмент zram в ядре Linux на этой неделе снова оказался в новостях. Phoronix сообщает, что новый патч может ускорить некоторые операции zram на 50 процентов.
Благодаря все более отчаянным метаниям торговцев, продающих машины для автоматического плагиата, ОЗУ резко подорожало, и ожидается, что рост цен продолжится. Apple даже тихо убрала модель Mac Studio с 512 ГБ ОЗУ. Сейчас не лучшее время для покупки компьютеров с большим объемом ОЗУ или для добавления памяти в существующие машины.
Лучше попытаться максимально использовать то, что у вас уже есть. Поэтому мы подумали, что сейчас подходящее время, чтобы рассмотреть, что такое zram и что он делает, и изучить его менее известного компаньона — zswap.
Оба работают с существующим в Linux механизмом подкачки. Подкачка (в Windows называется пейджингом) — это способ, которым ядро справляется с нехваткой доступной ОЗУ. Оно выбирает страницы памяти, которые в данный момент не используются, и копирует их на диск, после чего эти блоки могут быть освобождены и использованы для чего-то другого. Это может быть целый процесс и его данные, который приостанавливается и выгружается из ОЗУ на диск. Надежда на то, что какая-то другая программа завершится, освободив свою ОЗУ, и процесс можно будет снова подгрузить. К сожалению, в реальной жизни более вероятно, что бедный, напряженный пользователь переключится на неактивную программу, что потребует выгрузки чего-то еще, чтобы освободить для нее место.
Это важно, потому что означает, что для использования zram или zswap вам необходима какая-либо форма подкачки.
Подкачка — это базовый механизм, который поставляется в комплекте с любой ОС, имеющей виртуальную память. Это, в широком смысле, любая ОС, которая может использовать аппаратный блок управления памятью. Для индустрии ПК это означает все, начиная с Linux (1991) и Windows NT (1993). Судя по чтению слишком большого количества сообщений на слишком многих технарьских форумах, у нас складывается впечатление, что многие люди в наши дни думают: «У моего компьютера достаточно ОЗУ. Мне не нужна подкачка, поэтому я ее отключил».
Это неверно. Не делайте этого. Всегда настраивайте какую-либо подкачку на всякий случай.
Это сродни выводу, что вы довольны своим весом, и поэтому вставляете проволочный пояс во все свои брюки (трусы, юбки, что вам больше нравится). Конечно, в обычный день они подойдут, но вы можете пойти на очень хороший ужин и переесть, или можете заболеть и не есть, немного похудеть, и внезапно они начнут болезненно врезаться в вас, или спадут. Небольшая эластичность, даже если только в нижнем белье, делает жизнь намного комфортнее.
Наличие некоторой подкачки — это эластичный пояс для вашего компьютера. При нормальном использовании машине это может никогда не понадобиться, но если что-то пойдет не так, лучше иметь это, чем, метафорически выражаясь, порвать одежду и остаться голым. Однажды вы будете рады, что был небольшой запас или некоторая податливость.
Итак, сначала кратко поговорим о пространстве подкачки.
Какой тип подкачки?
По умолчанию здесь есть, по сути, два варианта: файл подкачки или раздел подкачки. Начиная с версии 17.04, Ubuntu по умолчанию использует файл подкачки. Когда ядро Linux было молодым, это было медленнее, но уже больше десяти лет разницы практически нет. Единственная реальная загвоздка в том, что вам нужно больше места в корневом разделе.
По старой привычке, команда FOSS в The Reg всегда настраивает выделенный раздел подкачки. Одно из преимуществ заключается в том, что если у вас несколько физических дисков, вы можете разместить раздел подкачки на другом диске, что немного распределит нагрузку на диски. Когда SSD были дорогими и изнашивались, мы оснащали машины небольшим SSD и большим HDD, размещая ОС на SSD, а подкачку на вращающейся ржавчине, но сейчас это уже не так необходимо. Просто добавьте дополнительный раздел в конец одного из ваших SSD и во время установки укажите установщику, что он предназначен для подкачки.
Сколько? Это спорный вопрос. Рекомендации Perlod кажутся разумными:
Менее 2 ГБ ОЗУ: Установите подкачку в 2 раза больше вашей ОЗУ.
От 2 ГБ до 8 ГБ ОЗУ: Установите подкачку равной вашей ОЗУ.
Более 8 ГБ ОЗУ: Обычно достаточно 4 ГБ.
Исключение: Если вы используете гибернацию, ваша подкачка должна быть больше общего объема вашей ОЗУ.
Zram
Размышления о том, где находится подкачка и сколько ее нужно, приводят нас к zram. Как это часто бывает, вики Arch объясняет это хорошо. Zram создает сжатые динамические диски в ОЗУ. «Динамические» означает, что они растут только по мере заполнения, а «сжатые» — с использованием LZ4, что быстро. Одно из применений этих дисков в ОЗУ — для подкачки.
Это звучит безумно: подкачка из памяти в память? В чем смысл? Но это не безумие, это работает. Суть в том, что ваш компьютер выгружает данные, когда ему не хватает места. Обычно это означает запись на диск. Например, программа объемом 500 МБ вытесняется из ОЗУ и помещается в полгигабайта дискового пространства, освобождая полгигабайта ОЗУ для других задач.
Проблема в том, что подкачка очень медленная, потому что диски очень медленные по сравнению с ОЗУ. Чтобы понять, насколько в тысячи раз медленнее, есть удобная таблица «Числа задержек, которые должен знать каждый программист» на GitHub, и ее гуманизированная версия, которая выражает временные различия в терминах, более понятных нам, мясным мешкам.
Идея zram заключается в следующем: вместо того чтобы тратить время на запись на диск, почему бы не сжать данные и оставить их в памяти? При наличии быстрого ЦП это не займет много времени, и займет примерно вдвое меньше места. Когда они вам понадобятся снова, подкачка обратно означает просто распаковку из ОЗУ в ОЗУ, что относительно быстро.
Это работает на удивление хорошо, и некоторые дистрибутивы включают его по умолчанию в наши дни, например Fedora и ее производные.
Сжатие памяти — это уже мейнстримная технология: macOS использует сжатие памяти с версии 10.9, а Windows 10 получила эту функцию в 2015 году в сборке 10525.
Существует два основных сценария использования подкачки в zram. Один — если на вашей машине достаточно ОЗУ, и вы редко сталкиваетесь с ее нехваткой. В этом сценарии он забирает немного свободной памяти, которую ядро и так использовало бы для дискового кэша, и вуаля, вы можете держать больше программ в памяти одновременно.
Другая ситуация — у вас может быть не так много свободной памяти, но ваш системный диск медленный, маленький или имеет ограничения по количеству операций записи, которые он может выдержать. Это применимо к компьютерам, которые загружаются с карт microSD или аналогичных встроенных накопителей, таких как eMMC. Это особенно актуально для Raspberry Pi и многих маломощных одноплатных компьютеров и дешевых планшетов.
Здесь zram позволяет избежать износа карты и помогает предотвратить исчерпание памяти. Он позволяет вам «переподписывать» вашу ОЗУ: загружать в память больше данных, чем у вас доступно, потому что то, что в данный момент не выполняется, эффективно сжато и занимает меньше места.
Это работает только до определенного предела — он не может сжать все в вашей памяти: ядру нужно рабочее пространство и место для текущей выполняемой задачи. Хорошая новость в том, что ядро нативно понимает идею нескольких отдельных областей пространства подкачки и может приоритизировать их. Таким образом, у вас может быть zram, а также файл подкачки, и по мере необходимости он будет перемещать наименее используемые данные из zram в дисковую подкачку.
В нашем тестировании Pop!_OS 24.04 мы обнаружили, что он настраивает двухуровневую подкачку следующим образом: сначала zram, затем зашифрованный файл подкачки в корневом разделе.
Подводя итог, zram может заменить подкачку на диске. Или, если у вас есть свободное место, вы можете использовать его в дополнение к обычной подкачке на диске, в этом случае он действует как своего рода сжатый кэш для вашей подкачки, немного ускоряя ее производительность. Вот почему на ранних этапах разработки он назывался compcache.
Zswap
Основной альтернативой zram является zswap, который работает несколько иначе.
Zswap не является альтернативой или дополнением к подкачке на диске. Он требует подкачки на диске, но старается уменьшить объем этой подкачки, сжимая данные до того, как они попадут в пространство подкачки. Технические подробности его работы разработчик описал для LWN в 2013 году: сжатый кэш подкачки zswap.
В вики Debian есть краткое описание. Хорошая вещь в zswap заключается в том, что его использование, по сути, так же просто, как включение или выключение. Вы даже можете сделать это на лету, хотя мы обычно включаем его на всех наших машинах сразу из загрузчика. Если ваш дистрибутив загружается с помощью GRUB, достаточно отредактировать одну строку в одном конфигурационном файле. Для дистрибутивов, использующих systemd-boot, это немного сложнее — это вся суть systemd — но это всего лишь пара дополнительных шагов.
Pop!_OS — один из примеров, но для этого дистрибутива сжатая подкачка требует дополнительных действий. Чтобы это дало прирост производительности, необходимо отключить две вещи. Во-первых, Pop!_OS включает zram по умолчанию, поэтому вам нужно отключить zram. Затем перезагрузитесь и убедитесь, что он исчез. (Подсказка: sudo swapon -s выводит список всех активных томов подкачки.)
Во-вторых, Pop по умолчанию шифрует свой файл подкачки. Шифрование и дешифрование снижают производительность, а zswap — это оптимизация производительности. Поэтому вам также следует отключить cryptswap. После этого, для (гораздо) более быстрой загрузки, удалите файл /etc/crypttab. (Мы просто переименовали его в crypttab.old из старой параноидальной привычки.)
Сделайте и то, и другое, и не забывайте перезагружаться после каждого шага. Когда вы убедитесь, что и zram, и cryptsetup исчезли, попробуйте включить zswap.
Одно или другое, но не оба
Zram может работать вместе с обычным файлом подкачки, но не вместе с zswap. Оба пытаются сделать одно и то же, и любое улучшение производительности, которое они могли бы дать, будет сведено на нет дублированием работы друг друга и растратой того самого ресурса, который вы пытаетесь использовать более эффективно. Используйте zram или zswap, но даже не пытайтесь использовать оба одновременно.
Мы пробовали оба варианта и используем zram на таких устройствах, как наши Raspberry Pi и на пользовательских загрузочных флешках Linux. Однако для общего использования на настольных компьютерах и ноутбуках мы считаем, что zswap работает лучше — и другие придерживаются того же мнения.
Мы знаем, что многие также выступают за шифрование дисков своих машин, особенно ноутбуков. Мы считаем, что здесь применим XKCD 538. Отключите его, особенно подкачку. По возможности настройте выделенный раздел — затем включите zswap и оставьте все как есть.
Примечание о загрузке
Существует и третья альтернатива под названием Zcache. Это более смелая и общая попытка, чем zram или zswap, но, несмотря на десятилетия работы, она все еще довольно экспериментальна, и это не просто функция, которую можно включить или выключить. По этой причине мы решили не включать ее в рассмотрение в пользу двух вещей, которые вы можете получить прямо сейчас, «с полки». ®
Всегда имейте в виду, что редакции могут придерживаться предвзятых взглядов в освещении новостей.
Автор – Liam Proven