Сжатие оперативной памяти linux

zram

zram, formerly called compcache, is a Linux kernel module for creating a compressed block device in RAM, i.e. a RAM disk with on-the-fly disk compression. The block device created with zram can then be used for swap or as a general-purpose RAM disk. The two most common uses for zram are for the storage of temporary files ( /tmp ) and as a swap device. Initially, zram had only the former function, hence the original name «compcache» («compressed cache»).

Usage as swap

Initially the created zram block device does not reserve or use any RAM. Only as files need or want to be swapped out, they will be compressed and moved into the zram block device. The zram block device will then dynamically grow or shrink as required.

Example (System has 32 GiB RAM, zram is configured with 16 GiB RAM, we assume a 1:4 compression ratio):

  • Worst case (RAM and zram completely «filled»): 16 GiB RAM + 64 GiB zram
  • Normal usage without swapping: 32 GiB RAM + 0 GiB zram
  • Normal usage with light swapping: 30 GiB RAM + 8 GiB zram
  • Without any zram configuration: 32 GiB RAM

Therefore, zram always offers the advantage of being able to store more content in RAM.

  • Make sure to first disable zswap which is enabled by default to avoid zswap acting as a swap cache in front of zram. Having both enabled also results in incorrect zramctl(8) statistics as zram remains mostly unused; this is because zswap intercepts and compresses memory pages being swapped out before they can reach zram.
  • When configuring zram, the size of the zram device controls the maximum uncompressed amount of data it can store, not the maximum compressed size. You can configure the zram’s size to be equal to or even greater than your system’s physical RAM capacity.
  • Hibernating to swap on zram is not supported, even when zram is configured with a backing device on permanent storage. logind will protect against trying to hibernate to a swap space on zram.
Читайте также:  Средства защиты linux серверов

Manually

To set up one zstd compressed zram device with 32GiB capacity and a higher-than-normal priority (only for the current session):

# modprobe zram # zramctl /dev/zram0 --algorithm zstd --size 32G # mkswap -U clear /dev/zram0 # swapon --priority 100 /dev/zram0

To disable it again, either reboot or run:

# swapoff /dev/zram0 # modprobe -r zram

A detailed explanation of all steps, options and potential problems is provided in the official documentation of the zram module.

For a permanent solution, use a method from one of the following sections.

Using a udev rule

The example below describes how to set up swap on zram automatically at boot with a single udev rule. No extra package should be needed to make this work.

Create the following udev rule adjusting the disksize attribute as necessary:

ACTION=="add", KERNEL=="zram0", ATTR="zstd", ATTR="4G", RUN="/usr/bin/mkswap -U clear /dev/%k", TAG+="systemd"

Add /dev/zram to your fstab with a higher than default priority:

/dev/zram0 none swap defaults,pri=100 0 0

Note: The swap space on zram cannot be referred to by its LABEL or UUID in fstab since udev does not create /dev/disk/by-label/* and /dev/disk/by-uuid/* symlinks for zram devices.

Using zram-generator

zram-generator provides a systemd-zram-setup@.service unit to automatically initialize zram devices without users needing to enable/start the template or its instances. See zram-generator(8) and zram-generator.conf(5) .

For example, to create a zram swap device using zstd and half of the entire available ram, install zram-generator , then create /etc/systemd/zram-generator.conf with the following:

/etc/systemd/zram-generator.conf
[zram0] zram-size = ram / 2 compression-algorithm = zstd swap-priority = 100 fs-type = swap

Run daemon-reload, then start your configured systemd-zram-setup@zramN.service instance(s).

You can check the swap status of your configured /dev/zramN devices by reading the unit status of your systemd-zram-setup@zramN.service instance(s), or by using zramctl(8) .

Using zramswap

zramswap AUR provides an automated script for setting up a swap with a higher priority and a default size of 20% of the RAM size of your system. To do this automatically on every boot, enable zramswap.service .

Читайте также:  Какие есть linux телефоны

Using zramd

zramd AUR allows to setup zram automatically using zstd compression by default, its configuration can be changed at /etc/default/zramd . It can be started at boot by enabling the zramd.service unit.

Tips and tricks

Checking zram statistics

NAME ALGORITHM DISKSIZE DATA COMPR TOTAL STREAMS MOUNTPOINT /dev/zram0 zstd 32G 1.9G 318.6M 424.9M 16 [SWAP]
  • DISKSIZE = 32G: this zram device will store up to 32G of uncompressed data.
  • DATA = 1.9G: currently, 1.9G (uncompressed) of data is being stored in this zram device
  • COMPR = 318.6M: the 1.9G uncompressed data was compressed to 318.6M
  • TOTAL = 424.9M: including metadata, the 1.9G of uncompressed data is using up 424.9M of physical RAM

Multiple zram devices

By default, loading the zram module creates a single /dev/zram0 device.

If you need more than one /dev/zram device, specify the amount using the num_devices kernel module parameter or add them as needed afterwards.

Optimizing swap on zram

Since zram behaves differently than disk swap, we can configure the system’s swap to take full potential of the zram advantages:

/etc/sysctl.d/99-vm-zram-parameters.conf
vm.swappiness = 180 vm.watermark_boost_factor = 0 vm.watermark_scale_factor = 125 vm.page-cluster = 0

Explanation of the configuration:

These values are what Pop!_OS uses. That Pop!_OS GitHub PR also links to some testing done by users on r/Fedora, which determined that vm.page-cluster = 0 is ideal. They also found a high swappiness value to be ideal, which matches what is suggested by the kernel docs:

«The default value is 60. For in-memory swap, like zram or zswap, as well as hybrid setups that have swap on faster devices than the filesystem, values beyond 100 can be considered. For example, if the random IO against the swap device is on average 2x faster than IO from the filesystem, swappiness should be 133 (x + 2x = 200, 2x = 133.33).»

On a system with a hard drive, random IO against the zswap device would be orders of magnitude faster than IO against the filesystem, so swappiness should be ~200. Even on a system with a fast SSD, a high swappiness value may be ideal.

See also

Источник

Linux: «Бесплатная» RAM за счет процессора

Если вы вдруг оказались с компьютером, в котором RAM распаяна, или все слоты уже использованы, или просто нет возможности добавить еще одну планку памяти, то существует простое решение, имя ему zram.

Читайте также:  Can change permissions linux

Я не буду подробно описывать все прелести zram, в интернете достаточно много информации о том, что это такое и как можно использовать. Здесь же я хочу предоставить короткую инструкцию, как быстро и просто «добавить» себе оперативной памяти в популярной ОС.

Что это?

Многие знают о существовании swap (файл подкачки), который начинает использоваться, когда оперативной памяти начинает не хватать. Я, как и многие, стараюсь избавляться от такой штуки, потому как swap использует для хранения данных наши ssd/hdd, что в свою очередь имеет минусы:

Но если выключить swap, то мы рискуем повиснуть в тот момент, когда физическая память закончится, ведь магическим образом она ниоткуда не появится. Или появится?!

zram — технология сжатия оперативной памяти. По сути это тот же swap, только размещен он в оперативной памяти и к нему применяются алгоритмы сжатия. Разумеется магия здесь происходит за счёт процессорного времени, потому, хорошо бы иметь процессор вместо пакетика сока.

Делаем

Вся процедура заключается в том, что мы отключим swap и zswap, а затем установим и настроим zram. В моем случае системой является Ubuntu 22.04.

sudo nano /etc/fstab #/swapfile none swap sw 0 0

Отлючаем swapfile

  1. Удаляем более не нужный файл где у нас хранился swap
sudo nano /etc/default/grub GRUB_CMDLINE_LINUX="" на GRUB_CMDLINE_LINUX="zswap.enabled=0"

  1. Устанавливаем zram
sudo apt install zram-tools
sudo nano /etc/default/zramswap

Конфигурация zram

В своей версии конфига я установил иной алгоритм сжатия (zstd), если процессор будет плохо справляться — можно попробовать менее требовательный lz4.

Объем для zram можно указать относительно физического объема памяти PERCENT, либо абсолютный SIZE. В моем случае это 99% от физического объма.

sudo systemctl restart zramswap.service

Удостовериться в том, что всё работает как мы хотели, поможет комманда

Как видно компрессия очень неплохая ~ x4

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

Источник

Оцените статью
Adblock
detector