10
сентябрь
2020
16:39

Настройка сжатия оперативной памяти с помощью ZSwap

10 сентябрь 2020 16:39

Когда оперативная память заканчивается, компьютер становится очень медленным, так как идёт обращение к файлу подкачки (swap) на жестком диске. Для решения этой проблемы придуман модуль zswap. По умолчанию он в операционной системе Linux отключен, но можно его задействовать.

Почему мне потребовалось использовать zswap? Установлены 2 планки по 2 Гбайт, но физически материнская плата поддерживает лишь 3 Гбайт - таково ограничение материнской платы на базе чипсета Intel 82945. На другом компьютере, тоже под Linux, установлены планки ОЗУ 1 Гбайт и 2 Гбайт (всего 3 Гбайт), их обычно хватает для работы в Интернет. Но иногда при открытии больших PDF файлов или картинок ОЗУ может заканчиваться...

Выбор: zram или zswap

zram применяют для постоянного сжатия страниц - в памяти выделяют раздел swap, в который происходит выгрузка сжатых страниц памяти как в обычный файл подкачки, но в быстром ОЗУ.

zswap не выделяет раздел в памяти - лишь динамический объем (пул) в ОЗУ, в который попадают лишь те страницы, которые являются кандидатами для попадания в физический файл swap. Перед помещением в пул страницы также сжимаются.

Поскольку объём памяти достаточно большой, мне не нужно постоянное сжатие ОЗУ, как это делает zram. Требуется обеспечить отсутствие свопинга на диск в случае, когда ОЗУ близко к заполнению.

Решение:

  1. В строке загрузчика GRUB, которая отвечает за передачу параметров ядра, указываю вызов модуля ZSwap:

    sudo nano /etc/default/grub

исправил строку GRUB_CMDLINE_LINUX_DEFAULT на следующую:

GRUB_CMDLINE_LINUX_DEFAULT="noresume zswap.enabled=1 zswap.zpool=z3fold zswap.compressor=lz4 zswap.max_pool_percent=35"

GRUB_CMDLINE_LINUX=""

  1. Обновил конфигурацию GRUB:

    sudo update-grub

  2. Разрешил загрузку модулей для расширенного сжатия

    sudo nano /etc/initramfs-tools/modules

добавил строки:

lz4
lz4_compress
z3fold

и сохранил изменения.

  1. Запустил обновление файла initrd (который содержит iniramfs - начальную файловую систему для загрузки в оперативную память в момент загрузки ОС; второй частью ядра является статический файл vmlinuz, который данной командой не изменяется и содержит само ядро):

    sudo update-initramfs -u

  2. Перезагрузка системы

    sudo reboot

  3. Проверка.

  • До настройки модуля сжатия ОЗУ не было.

    dmesg | grep zswap

  • После первого включения без модулей lz4, lz4compress команда dmesg выводила
    [ 2.690663] zswap: loaded using pool lzo/zbud

  • После окончательной настойки с включением модуя lz4, lz4compress и z3fold вывод команды dmesg следующий:
    [ 2.734842] zswap: loaded using pool lz4/z3fold


Примечания:

  1. Отличие способов сжатия lzo от lz4 в скорости сжатия / распаковки - у lz4 наивысшая среди всех скорость компрессии и декомпрессии.
  2. На системах с малым объёмом ОЗУ вместо zswap.zpool=z3fold лучше попробовать zswap.zpool=zsmalloc (степень сжатия до 7).
  3. Максимальный размер пула для сжатых страниц кеша выбран 50%, так как согласно free -h на компьютере с 3 Гб озу размер кеша составляет 600 Мбайт и 1.1 Гб свободно (1.7 Гб составляют примерно 50% объёма ОЗУ 3Гб). На системах с малым объёмом ОЗУ предельное значение zswap.max_pool_percent следует уменьшить до 10-15%, чтобы он составлял 200-300 Мбайт. Размер пула (сжатого кеша) страниц динамический.

Дополнение от 10.06.2021: после увеличении в конфигурационном файле /etc/default/grub параметра zswap.max_pool_percent с 50 до 70 и выполнения команды sudo update-grub размер свободной оперативной памяти (free) увеличился c 213 до 500 Мбайт, видимо за счет сжатия оперативной памяти. По моему мнению, оптимальный размер max_pool_percent для максимальной экономии ОЗУ лежит диапазоне от 70 до 90%. При параметре max_pool_percent на уровне 90%, я не заметил замедления работы программа и операционной системы в целом. После увеличения zswap.max_pool_percent до 90, размер свободного ОЗУ при запущенном браузере Mozilla Firefox лежит в диапазоне 908...937 Мбайт. Скорость работы браузера FireFox также увеличилась.

Дополнинение от 21.10.2021: при max_pool_percent=90 наблюдал на сайте "Госуслуг" при отправке заполненной формы для переписи населения РФ возникновение сильного свопинга. Уменьшил max_pool_percent=35 (около 1 Гбайт ОЗУ), выполнил sudo update-grub и перезагрузил ПК. Видимо, излишнее повышение параметра max_pool_percent, свыше 50%, нежелательно.

Добавление 2023 г. Вывод статистики работы zswap

Вывод на экран текущих настроек ZSwap

grep -R . /sys/module/zswap

Статистика работы ZSwap (отладка):

sudo grep -R . /sys/kernel/debug/zswap/

Если zswap включен, но в статистике нет сжатых страниц (/sys/kernel/debug/zswap/stored_pages:0), это означает, что операционной системе оперативной памяти хватает. В этом случае отладка zswap будет выдавать нули, т.к. ожидающих выгрузку в swap страниц памяти нет.

Источники:



Похожие публикации