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

Реклама спонсоров

Стань командиром коробля! Жми и начинай играть! Game

Zswap как работает, установить, настроить, узнать статистику использования, коэффициенты сжатия | Debian Ubuntu

В этой статье я хочу разобраться с такой технологией оптимизации оперативной памяти Linux как ZSwap. Zswap представляет собой сжатый пул в оперативной памяти только после заполнения которого начинается запись данных (страниц) в swap.
Для тех кто не любит листать сразу выкладываю команды без объяснений:
Все команды в этой статье выполняются от имени root (sudo su)

echo 15 > /sys/module/zswap/parameters/max_pool_percent
echo zsmalloc > /sys/module/zswap/parameters/zpool
echo lz4 > /sys/module/zswap/parameters/compressor
echo 1 > /sys/module/zswap/parameters/enabled
nano /etc/default/grub
zswap.enabled=1 zswap.compressor=lz4 zswap.max_pool_percent=10 zswap.zpool=zsmalloc
update-grub; update-grub2
echo lz4 >> /etc/initramfs-tools/modules
echo zsmalloc >> /etc/initramfs-tools/modules
echo lz4_compress >> /etc/initramfs-tools/modules; update-initramfs -u

Итак от теории сразу переходим к практике для начала определим включен ли у нас сейчас ZSwap и какие у него настройки:
Все команды в этой статье выполняются от имени root (sudo su)

grep -R . /sys/module/zswap/parameters

Мы должны увидеть примерно такой результат:

/sys/module/zswap/parameters/same_filled_pages_enabled:Y (Функция идентификации страниц с одинаковыми значениями)
/sys/module/zswap/parameters/enabled:Y (Zswap включен)
/sys/module/zswap/parameters/max_pool_percent:5 (Максимальный размер пула в оперативной памяти)
/sys/module/zswap/parameters/compressor:zstd (Алгоритм сжатия)
/sys/module/zswap/parameters/zpool:zsmalloc (Zpool алгоритм управления памятью)

Подробную информацию можно найти на этом сайте https://www.kernel.org/doc/Documentation/vm/zswap.txt

Дополнительно, проверка наличия Zswap в ядре:

cat /boot/config-`uname -r` | grep -i zswap

Проверка загрузки Zswap по логам:

dmesg | grep zswap

Zswap поддерживает изменения параметров в Live режиме то есть в реальном времени, но если в swap уже есть данные то изменение параметров на них не повлияют.
Например мы можем использовать эти команды, чтобы изменить параметры работы ZSwap

echo 15 > /sys/module/zswap/parameters/max_pool_percent
echo zsmalloc > /sys/module/zswap/parameters/zpool
echo lz4 > /sys/module/zswap/parameters/compressor
echo 1 > /sys/module/zswap/parameters/enabled

Первой строкой идет размер пула, большой размер пула может быть опасен и вызывать зависания и крах системы, по умолчанию размер пула составляет 20% от всей оперативной памяти.

На системах с маленьким количеством оперативной памяти я обычно устанавливаю размер пула 5-15 процентов, если же у вас больше 2гб оперативной памяти вы можете установить 20-25 процентов. Думаю в будущем разработчики исправят эту проблему.

Второй строкой идёт алгоритм управления памятью умолчание это zbud, я обычно использую zsmalloc так как он позволяет экономить больше памяти(первоначально этот алгоритм был создан для ZRam но может быть использован для ZSwap). Однако, у него есть недостаток zsmalloc не реализует вытеснение сжатых страниц, поэтому, как только zswap заполняет его он не может удалить самую старую страницу, она может только отклонить новые страницы, что может уменьшить производительность.

Третья строка это алгоритм сжатия, это очень важный параметр по умолчанию ZSwap использует lzo. ZSwap может использовать любой алгоритм поддерживаемый api ядра, но для этого модуль сжатия должен быть установлен примеры алгоритмов:
lz4, zstd, deflate, lz4hc, lzo-rle.

Проверить наличие модуля можно командой, например:
modprobe lz4
Если команда ничего не выводит значит модуль загружен если выводится сообщение об ошибке значит модуль отсутствует в ядре.

По-моему опыту алгоритмы сжатия lz4 очень хорошо демонстрирует себя на слабых машинах где процессор постоянно загружен, lzo ведёт себя чуть похуже, а вот если у вас более-менее нормальный процессор и довольно свежее ядро я рекомендую алгоритм zstd. Этот алгоритм наследник lz4 работает медленнее но дает хороший коэффициенты сжатия, но он намного быстрее чем deflate, lz4hc, lzo-rle.
Итак мы изменили параметры работы zswap но после перезагрузки они вернутся в начальное положение чтобы сохранить их после перезагрузки мы можем пойти двумя путями: добавить эти команды в скрипт и запускать при загрузке или изменить параметры ядра при загрузке.

Обычно рекомендуют изменять параметры ядра, поэтому этот метод будет первым, и так редактируем grub

nano /etc/default/grub

В строку GRUB_CMDLINE_LINUX_DEFAULT дописываем этот параметр. Чтобы было примерно так:

GRUB_CMDLINE_LINUX_DEFAULT="zswap.enabled=1 zswap.compressor=lz4 zswap.max_pool_percent=10 zswap.zpool=zsmalloc quiet"

Обновляем

sudo update-grub; update-grub2

Добавляем модули при загрузке:

sudo echo lz4 >> /etc/initramfs-tools/modules
sudo echo zsmalloc >> /etc/initramfs-tools/modules
sudo echo lz4_compress >> /etc/initramfs-tools/modules
sudo update-initramfs -u

Перезагружаемся:

shutdown -r now

Второй вариант это смена параметров уже после загрузки ядра, я это можно реализовать с помощью cron, погнали:

nano /usr/sbin/zswap.sh

пишем

echo 15 > /sys/module/zswap/parameters/max_pool_percent
echo zsmalloc > /sys/module/zswap/parameters/zpool
echo lz4 > /sys/module/zswap/parameters/compressor
echo 1 > /sys/module/zswap/parameters/enabled

потом

chmod +x /usr/sbin/zswap.sh

crontab -e
пишем, если SHELL=/bin/bash уже есть то не надо писать его повторно

SHELL=/bin/bash
@reboot /bin/sh /usr/sbin/zswap.sh

Перезагрузка:

shutdown -r now

Чтобы получить статистику использования Zswap, используйте команду:

sudo sh -c 'cd /sys/kernel/debug/zswap && grep . *'

коэффициент сжатия можно получить этой командой:

perl -E "say $(cat /sys/kernel/debug/zswap/stored_pages) * 4096 / $(cat /sys/kernel/debug/zswap/pool_total_size)"

Пример вывода первой команды(подробно не буду):
duplicate_entry:0
pool_limit_hit:13404213
pool_total_size:6184960 (размер пула всего в страницах)
reject_alloc_fail:5
reject_compress_poor:0
reject_kmemcache_fail:0
reject_reclaim_fail:13404213
stored_pages:4251 (размер пула после сжатия)
written_back_pages:0
Пример вывода второй команды(думаю понятно):
3.20954274353877

По-моему опыту на базовых настройках коэффициент сжатия примерно около 2 к 1.
При использовании zsmalloc и lz4 Коэффициент сжатия от 3 и выше.
А при использовании сжатия zstd коэффициент был около 4, при этом нагрузка на процессор была почти незаметной на двухъядерной машине. К большому сожалению zstd можно найти только в свежих ядрах.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *