[Перевод] Производительность Raspberry Pi: добавляем ZRAM и изменяем параметры ядра
Пару недель назад я опубликовал обзор Pinebook Pro. Поскольку Raspberry Pi 4 тоже основана на ARM, то для неё вполне подходят некоторые из оптимизаций, упомянутых в предыдущей статье. Хотел бы поделиться этими хитростями и узнать, проявятся ли у вас такие же улучшения в производительности.
После установки Raspberry Pi в свою домашнюю серверную я заметил, что в моменты дефицита оперативной памяти она становилась очень невосприимчивой и даже подвисала. Чтобы решить эту проблему, я добавил ZRAM и внёс несколько изменений в параметры ядра.
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 просто зверь с такими настройками. Наслаждайтесь!
По теме: