[Перевод] Производительность Raspberry Pi: добавляем ZRAM и изменяем параметры ядра

Пару недель назад я опубликовал обзор Pinebook Pro. Поскольку Raspberry Pi 4 тоже основана на ARM, то для неё вполне подходят некоторые из оптимизаций, упомянутых в предыдущей статье. Хотел бы поделиться этими хитростями и узнать, проявятся ли у вас такие же улучшения в производительности.

После установки Raspberry Pi в свою домашнюю серверную я заметил, что в моменты дефицита оперативной памяти она становилась очень невосприимчивой и даже подвисала. Чтобы решить эту проблему, я добавил ZRAM и внёс несколько изменений в параметры ядра.


032270fb0277cc21b3946def04336dfa.png

ZRAM создаёт в оперативной памяти блочное хранилище с именем /dev/zram0 (или 1, 2, 3 и т. д.). Записанные туда страницы сжимаются и сохраняются в памяти. Это позволяет обеспечить очень быстрый ввод-вывод, а также освобождает память за счёт сжатия.

Raspberry Pi 4 поставляется с 1, 2, 4 или 8 ГБ оперативной памяти. Я буду использовать модель 1 ГБ, поэтому скорректируйте инструкцию в зависимости от своей модели. С 1 ГБ ZRAM дефолтный файл подкачки (медленный!) будет использоваться реже. Я использовал такой скрипт zram-swap для установки и автоматической настройки.

Инструкции приводятся в репозитории по ссылке выше. Установка:

git clone https://github.com/foundObjects/zram-swap.git
cd zram-swap && sudo ./install.sh


Если хотите отредактировать конфиг:

vi /etc/default/zram-swap


Кроме того, можно активровать ZRAM путём установки zram-tools. Если используете этот метод, обязательно отредактируйте конфиг в файле /etc/default/zramswap, и установите около 1 ГБ ZRAM:

sudo apt install zram-tools


После установки можете просмотреть статистику хранилища ZRAM следующей командой:

sudo cat /proc/swaps
Filename				Type		Size	Used	Priority
/var/swap                               file		102396	0	-2
/dev/zram0                              partition	1185368	265472	5
pi@raspberrypi:~ $


Теперь исправим поведение системы, когда Raspberry Pi переходит на подкачку в последний момент, что часто приводит к подвисаниям. Добавим несколько строчек в файл /etc/sysctl.conf и перезагрузимся.

Эти строки 1) оттянут неизбежное исчерпание памяти, увеличив давление на кэш ядра и 2) раньше начинают подготовку к исчерпанию памяти, заранее инициируя подкачку. Но это будет гораздо более эффективная подкачка сжатой памяти через ZRAM!

Вот строки, которые нужно добавить в конце файла /etc/sysctl.conf:

vm.vfs_cache_pressure=500
vm.swappiness=100
vm.dirty_background_ratio=1
vm.dirty_ratio=50


Затем перезагружаем систему или активируем правки следующей командой:

sudo sysctl --system


vm.vfs_cache_pressure=500 увеличивает давление на кэш, что увеличивает склонность ядра к рекультивации памяти, используемой для кэширования объектов каталогов и индексов. Вы будете использовать меньше памяти в течение более длительного периода времени. Резкое падение производительности сводится на нет за счёт более раннего свопинга.

vm.swappiness=100 увеличивает параметр, насколько агрессивно ядро будет свопить страницы памяти, так как мы сначала используем ZRAM.

vm.dirty_background_ratio=1 & vm.dirty_ratio=50 — фоновые процессы начнут запись сразу по достижении лимита 1%, но система не будет принудительно выполнять синхронный ввод-вывод, пока не достигнет dirty_ratio в 50%.

Эти четыре строки (при использовании с ZRAM) помогут улучшить производительность в том случае, если у вас неизбежно заканчивается оперативная память и начинается переход на подкачку, как у меня. Зная об этом факте, а также с учётом сжатия памяти в ZRAM в три раза лучше начать этот свопинг заранее.

Давление на кэш помогает, потому что мы фактически говорим ядру: «Эй, послушай, у меня нет дополнительной памяти, чтобы использовать её для кэша, поэтому, пожалуйста, избавься от него как можно скорее и храни только наиболее часто используемые/важные данные».

Даже при уменьшении кэширования, если со временем большая часть установленной памяти будет занята, ядро начнёт оппортунистический своп гораздо раньше, так что процессор (сжатие) и ввод/вывод подкачки не будут тянуть до последнего и задействовать все ресурсы сразу, когда уже слишком поздно. ZRAM использует немного CPU для сжатия, но в большинстве систем с малым объёмом памяти это гораздо меньше влияет на производительность, чем своп без ZRAM.


Давайте ещё раз посмотрим на результат:

pi@raspberrypi:~ $ free -h
total used free shared buff/cache available
Mem: 926Mi 471Mi 68Mi 168Mi 385Mi 232Mi
Swap: 1.2Gi 258Mi 999Mi

pi@raspberrypi:~ $ sudo cat /proc/swaps 
Filename Type Size Used Priority
/var/swap file 102396 0 -2
/dev/zram0 partition 1185368 264448 5


264448 в ZRAM — это почти один гигабайт несжатых данных. Всё ушло в ZRAM и ничто не попало в гораздо более медленный файл подкачки. Попробуйте сами такие настройки, они работают на всех моделях Raspberry Pi. У меня негодная подвисающая система превратилась в работоспособную и стабильную.

В ближайшем будущем я надеюсь продолжить и обновить эту статью с некоторыми результатами тестирования системы до и после установки ZRAM. Сейчас у меня просто нет на это времени. А пока не стесняйтесь выполнять свои собственные тесты и дайте знать в комментариях. Raspberry Pi 4 просто зверь с такими настройками. Наслаждайтесь!

По теме:

© Habrahabr.ru