Улучшаем производительность Linux при помощи zRam

  • Автор:

ZRAM-Linux-Debian-Ubuntu-000.pngОперативная память сегодня недорога и доступна, но, тем не менее, продолжает оставаться достаточно дефицитным ресурсов. Это связано с несколькими факторами. Во-первых, аппетиты программного обеспечения к оперативной памяти постоянно растут, во-вторых, возможности расширения часто ограниченны аппаратными особенностями устройства. Но, если вы используете Linux, есть способ выйти за рамки этих ограничений и улучшить производительность системы при помощи zRam. Как это сделать - читайте в нашей статье.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

zRam - это модуль ядра Linux, создающий блочное устройство (RAM-диск) со сжатием на лету, которое подключается как раздел подкачки и позволяет тем самым увеличить предоставляемое системе количество памяти.

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

Linux - начинающим. Что такое пространства подкачки и как они работают

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

Разница проявляется в скорости доступа. Так как скорость работы с дисками гораздо меньше скорости работы с памятью, то обращения к пространствам подкачки связано с определенным снижением производительности. Но в нашем случае мы получаем пространство подкачки в оперативной памяти и почти такое же быстрое как память.

А теперь о том, откуда берется дополнительная память и в чем выгода от использования zRam. Официальная документация предлагает ориентироваться на коэффициент сжатия памяти от 1:2 д 1:3, хотя на практике могут быть и более высокие результаты. Давайте возьмем самый слабый сценарий 1:2 и посмотрим, что у нас получится. Допустим у системы есть 2 ГБ физической памяти, полностью созданный и заполненный zRam такого же размера займет всего 1ГБ, таким образом у системы останется 1 ГБ физической памяти и добавится 2 ГБ практически столь же быстрой подкачки. Т.е. мы как-бы расширили размер оперативной памяти до 3 ГБ, пусть и за счет некоторого снижения скорости доступа и увеличения нагрузки на процессор.

ZRAM-Linux-Debian-Ubuntu-001.pngЕще раз повторимся, любой процесс работает с виртуальным адресным пространством и для него нет разницы между данными в RAM и данными в подкачке, вся разница только в скорости доступа.

Далее мы рассмотрим, как настроить виртуальный диск подкачки при помощи zRam в Debian или Ubuntu, но данная инструкция также подойдет для всех основанных на этих ОС дистрибутивах.

Прежде всего установим пакет для работы с zRam:

apt install zram-tools

Сразу же после установки будет создан и подключен как раздел подкачки виртуальный диск и запущена служба zramswap, но размер раздела там совсем скромный - 256 МБ, поэтому давайте настроим его под свои потребности. Для этого откроем /etc/default/zramswap и внесем в него некоторые изменения.

Прежде всего определимся с алгоритмом сжатия. Их приоритет в разных сценариях приведен сразу здесь, в комментариях. Если мы говорим о скорости, то, в порядке убывания, следует использовать lz4 > zstd > lzo, если о степени сжатия, то zstd > lzo > lz4. На наш взгляд, золотой серединой является zstd, поэтому раскомментируем и приведем к следующему виду опцию:

ALGO=zstd

Теперь укажем размер создаваемого раздела, безопасно будет указать размер равный объему RAM, впоследствии это можно будет легко изменить. Для этого есть два варианта, указать значение в процентах:

PERCENT=100

Или жестко задав размер в МБ:

SIZE=2048

Ниже находится еще одна опция, указывающая приоритет раздела подкачки, чем больше число, тем выше приоритет. Обычно менять его не требуется, разве только что у вас уже есть несколько пространств подкачки с разным приоритетом, в таком случае значение следует изменить, чтобы созданное при помощи zRam пространство имело наивысший приоритет. По умолчанию значение приоритета - 100.

PRIORITY=100

Для применения изменений достаточно перезапустить службу:

systemctl restart zramswap

Теперь давайте посмотрим на результаты, используя каждый раз идентичную нагрузку, проще всего это сделать при помощи браузера с одним и тем же набором страниц. Было, и пусть вас не смущает высокая нагрузка CPU, это воспроизведение HD-видео в браузере:

ZRAM-Linux-Debian-Ubuntu-002.pngСтало:

ZRAM-Linux-Debian-Ubuntu-003.pngНа первый взгляд разницы особо и не видно, в обоих случаях в подкачке около 500 МБ, но теперь они находятся в оперативной памяти, что положительно отзывается на реальном быстродействии системы, это заметно по отсутствию кратковременных задержек из-за обращения к страницам подкачки на дисковых устройствах.

Что здесь можно сделать еще? Давайте заставим систему более активно использовать подкачку. Зачем держать страницы в драгоценной памяти, когда их можно сжать и сбросить в не менее быстрый своп. Для этого откроем /etc/sysctl.conf и добавим или изменим при наличии опцию:

vm.swappiness=160

По умолчанию используется значение 60, максимальное - 200. Имеет смысл увеличить его до 160 - 180, наша задача - по максимуму использовать сжатую память, но не допускать выхода из zRam раздела.

Для применения изменений выполните:

sysctl -p

Снова создадим нагрузку и посмотрим на результат:

ZRAM-Linux-Debian-Ubuntu-004.pngКак видим, система стала гораздо активнее свопить, но быстродействие ее от этого не ухудшилось, даже наоборот, так как процессы, которым действительно нужна память, теперь ее практически сразу получают за счет более агрессивного использования пространства подкачки.

А теперь самое время оценить эффективность сжатой памяти, этот и многие другие парамерты можно посмотреть командой:

zramctl --output-all

В выводе нас интересуют столбцы DATA и MEM-USED, отдельно их можно посмотреть командой:

zramctl -o DATA,MEM-USED

ZRAM-Linux-Debian-Ubuntu-005.pngКак видим в подкачке находится 1,1 ГБ данных, которые в сжатом виде занимают всего 231 МБ памяти, т.е. фактически мы получили коэффициент сжатия 1:4,7, это хороший результат, просто отличный. Опираясь на него, мы можем увеличить раздел zRam раздела на величину, превышающую объем памяти. Но будьте аккуратны. Прежде чем вносить изменения протестируйте сжатие под разными видами нагрузки, чтобы убедиться, что коэффициент остается постоянно высоким. В противном случае в подкачке могут оказаться данные с совершенно другим коэффициентом сжатия, и физическая память очень быстро закончится.

И еще один вопрос, который эпизодически поднимают в сети: нужно ли при использовании zRam выключать пространства подкачки на дисках? Нет, не нужно, так как в случае того, если вам не хватит zRam раздела именно следующий уровень подкачки поможет вам, хоть и со снижением производительности. сохранить работоспособность системы.

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Поддержи проект!

Или подпишись на наш Телеграм-канал: Подпишись на наш Telegram-канал



Loading Comments