Swap

Revision as of 10:00, 27 December 2022 by Krotesk (talk | contribs) (Created page with "В зависимости от конкретной рабочей нагрузки - слишком сильное увеличение или уменьшение этого...")
Other languages:
Deutsch • ‎English • ‎français • ‎русский


Обзор

Пространство подкачки используется для расширения объема памяти (RAM), доступной для запуска программ.

  • Без пространства подкачки, если у вас закончится память, приложения "завершатся", вплоть до краха всей системы.
  • При наличии в системе пространства подкачки ядро может забирать у неактивных приложений/служб реже используемые страницы памяти и записывать их на диск ("своппинг"), позволяя активным приложениям получить больше реальной оперативной памяти.


В Manjaro существует три различных способа управления свопом:

  • Раздел подкачки
  • Файл подкачки
  • zswap


Эта статья старается быть максимально полной, но еще больше информации можно найти в articles linked below.

Нужна ли мне подкачка

На этот вопрос нельзя ответить, не изучив вашу конфигурацию, и даже при большом количестве доступной памяти она часто используется для подстраховки или даже иногда из-за специфических требований приложения, поэтому ознакомьтесь со следующим неполным списком:

  • Если Вы используете гибернацию: да - Вам нужна подкачка!
  • Если у Вас есть службы, которые не всегда активны, но все равно постоянно работают: да - Вам нужна подкачка!
  • Если у Вас есть приложение, которое выделяет виртуальную память непосредственно для временного хранения вместо оперативной памяти: да - Вам нужна подкачка!.
  • Если у Вас есть приложение, у которого есть утечка памяти: да - Вам нужна подкачка!
  • Если у вас есть сервер с 1 ТБ оперативной памяти, который вы используете в качестве рабочего стола без приложений, выделяющих виртуальную память или имеющих утечки памяти: нет - Вам не нужна подкачка!.

Сколько подкачки мне нужно

Необходимый объем подкачки сильно зависит от специфики приложений и рабочей нагрузки. Без мониторинга использования в течение определенного периода времени не существует универсальной формулы для определения объема подкачки. Разумно было бы начать с этого:

  • При объеме физической памяти (RAM) менее 4 ГБ настоятельно рекомендуется чтобы пространство подкачки, как минимум, было равно объему RAM. Также рекомендуется, чтобы пространство подкачки было максимум в два раза больше объема оперативной памяти, в зависимости от объема дискового пространства, доступного для системы, из-за уменьшающейся отдачи.
  • Для более современных систем (>4 ГБ) пространство подкачки должно быть как минимум равно ROUNDUP(SQRT(RAM)). Т.е. квадратный корень из объема вашей оперативной памяти, округленный до следующего ГБ. Однако, если вы используете спящий режим, вам нужен минимум размер физической памяти (RAM) плюс ROUNDUP(SQRT(RAM)). Максимум, опять же, вдвое больше объема ОЗУ, опять же из-за убывающей отдачи.
  • Единственным недостатком наличия большего пространства подкачки, чем вы будете реально использовать, является то, что дисковое пространство, которое вы резервируете под него, не может быть использовано для приложений или системных данных.

"Уменьшающаяся отдача" означает, что если Вам нужно под подкачку больше места чем в два раза по отношению к оперативной памяти, то лучше добавить больше оперативной памяти, так как доступ к жесткому диску (HDD) примерно на 10³ медленнее, чем к оперативной памяти, поэтому то, что заняло бы 1 секунду, может занять более 15 минут! А на твердотельном накопителе (SSD) та же операция, которая заняла бы 1 секунду в оперативной памяти, займет около 1 минуты!

Принимая во внимание все вышеперечисленное - мы получаем следующую таблицу: (последние 3 столбца обозначают пространство подкачки)

       RAM   Без гибернации       С гибернацией Максимум
       1GB              1GB                 2GB      2GB
       2GB              2GB                 3GB      4GB
       3GB              3GB                 5GB      6GB
       4GB              4GB                 6GB      8GB
       RAM   Без гибернации       С гибернацией Максимум
       5GB              2GB                 7GB     10GB
       6GB              2GB                 8GB     12GB
       8GB              3GB                11GB     16GB
      12GB              3GB                15GB     24GB
      16GB              4GB                20GB     32GB
      24GB              5GB                29GB     48GB
      32GB              6GB                38GB     64GB
      64GB              8GB                72GB    128GB
     128GB             11GB               139GB    256GB
     256GB             16GB               272GB    512GB
     512GB             23GB               535GB      1TB
       1TB             32GB              1056GB      2TB
       2TB             46GB              2094GB      4TB
       4TB             64GB              4160GB      8TB
       8TB             91GB              8283GB     16TB
Note
Самый большой сервер, который когда-либо устанавливал один из авторов этой вики-статьи, действительно имел 8 ТБ оперативной памяти и даже эта машина имеет указанные выше настройки подкачки, так почему бы и вашей машине не быть такой?

Отображение информации о подкачке

Команда swapon отобразит текущую информацию о подкачке. Например:

swapon
NAME      TYPE      SIZE   USED PRIO
/dev/sda7 partition  20G  44.3M   -2

Следующий сценарий будет:

  • показать, активен zswap или нет, и если активен, указать параметры zswap при запуске с помощью команды sudo.
  • отобразить список всех приложений / служб, занимающих подкачку, и их объем в порядке убывания
#!/bin/bash
#Check whether running as root
if [ "$(whoami)" = 'root' ]; then
  dmesg | grep "zswap:" | grep --silent "load"
  if $? -eq 0 ; then
    # zswap is active
    echo "zswap information:"
    grep --recursive --color=none . /sys/kernel/debug/zswap/
    read -n 1 -s -r -p "Press any key to continue"
  else
    echo "[warning] zwap not active. Continuing"
  fi
else
  echo "[warning] Not running as root: skipping zswap info"
fi
for szFile in /proc/*/status ; do
  awk '/VmSwap|Name/{printf $2 "\t" $3}END{ print "" }' "$szFile"
done | sort --key 2 --numeric --reverse | more

Использование раздела подкачки

Раздел подкачки - это традиционный способ управления подкачкой. В этом сценарии для подкачки создается выделенный раздел (или разделы).

Создание и включение раздела подкачки

Чтобы создать раздел подкачки - необходимо достаточно нераспределенного дискового пространства для создания дополнительного раздела. Если у вас недостаточно места - перейдите к следующему разделу #Using_a_swap_file. Раздел подкачки может быть создан в любом инструменте управления дисками / разделами и должен быть установлен как тип linuxswap.

После создания раздела подкачки Вам нужно инициализировать раздел подкачки с помощью команды mkswap. Например, если ваш раздел подкачки /dev/sda3 - Вы можете использовать команду:

sudo mkswap /dev/sda3

Далее необходимо включить раздел подкачки с помощью команды swapon. Следуя нашему примеру выше это можно сделать следующим образом:

sudo swapon /dev/sda3

Чтобы гарантировать, что подкачка будет включена при загрузке, мы должны добавить запись в /etc/fstab. Для этого лучше всего использовать UUID вместо имени устройства. Вы должны добавить строку в fstab вручную или с помощью команды:

sudo bash -c "echo UUID=$(lsblk -no UUID /dev/sda3) none swap defaults 0 0 >> /etc/fstab"

Если Вы хотите иметь более одного раздела подкачки - просто повторите описанные выше шаги для всех дополнительных разделов.


Note
Обязательно замените /dev/sda3 в приведенных выше командах на ваш реальный раздел подкачки.


Tip
Если вы используете HDD (вращающийся диск) - поместите раздел подкачки в начало диска, поскольку скорость диска выше на внутренних дорожках. На SSD это не имеет значения.

Использование файла подкачки

Использование раздела подкачки имеет один существенный недостаток: Изменение размера swap или добавление swap требует переразметки диска. В текущих ядрах Linux можно использовать файл подкачки вместо выделенного раздела и начиная с ядра 2.6 разница в производительности между ними больше не ощущается.

Создание и включение статического файла подкачки

Tip
Нет причин, по которым вы не можете иметь как раздел подкачки, так и файл подкачки. Это простой способ добавить дополнительный раздел подкачки без переразметки.


Сначала создайте и инциализируйте файл для подкачки. Например, чтобы создать файл подкачки размером 4 ГБ необходимо использовать команду:

sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress


Установите соответствующие разрешения на файл. Он должен быть доступен для чтения и записи только root. Это можно сделать с помощью команды:

sudo chmod 600 /swapfile


Далее нам нужно отформатировать и включить файл подкачки:

sudo mkswap /swapfile
sudo swapon /swapfile


Чтобы гарантировать, что подкачка будет включена при загрузке - мы должны добавить запись в /etc/fstab. Вам нужно добавить строку в fstab вручную или с помощью команды:

sudo bash -c "echo /swapfile none swap defaults 0 0 >> /etc/fstab"


Файл подкачки на BTRFS

Начиная с ядра 5.0 и выше, файлы подкачки поддерживаются на btfrs. Они все еще требуют некоторых специальных действий в дополнение к описанным выше.

Перед выполнением шага fallocate, описанного выше, Вы должны выполнить эти команды:

sudo truncate -s 0 /swapfile
sudo chattr +C /swapfile
sudo btrfs property set /swapfile compression none


Эти команды создают пустой файл подкачки, отключают COW для этого файла и обеспечивают отключение сжатия.



Tip
Чтобы сохранить совместимость с Timeshift, необходимо создать файл подкачки вне корневого подтома "@".
root # btrfs subvolume create /@swapfile COPY TO CLIPBOARD

Just replace /swapfile with /@swapfile/swapfile.


Файл подкачки на ZFS

zfs не поддерживает файлы подкачки, однако вы можете добиться аналогичного преимущества, используя zvol в качестве тома подкачки.


Подробные инструкции о том, как это сделать, можно найти в этом руководстве по ZoL.

Автоматизированное управление подкачкой с помощью systemd-swap

Note
Использование systemd-swap с btrfs/zfs или с поддержкой гибернации требует специальных действий, выходящих за рамки данной статьи

Можно автоматически управлять размером файла подкачки с помощью systemd-swap. Он может создавать файлы подкачки динамически, основываясь на потребностях памяти. Это также простой способ включить/управлять zswap.

Установка и настройка systemd-swap

Сначала установите и включите systemd-swap:

pamac install systemd-swap
sudo systemctl enable systemd-swap.service


Далее включите динамическое управление подкачкой, создав файл /etc/systemd/swap.conf.d/myswap.conf со следующими параметрами:

zswap_enabled=0
zram_enabled=0
swapfc_enabled=1


Если Вы предпочитаете одну команду для создания этого файла, то должны использовать:

sudo bash -c 'echo -e "zswap_enabled=0\nzram_enabled=0\nswapfc_enabled=1" > /etc/systemd/swap.conf.d/myswap.conf'

Удаление другой подкачки

Для того чтобы systemd-swap работал эффективно - необходимо удалить все имеющиеся у вас традиционные устройства подкачки.


Для отображения текущих устройств подкачки можно использовать команду swapon. Например, на моей тестовой машине отображается следующее:

swapon
NAME      TYPE      SIZE USED PRIO
/swapfile file        4G   0B   -2
/dev/sda3 partition 8.4G   0B   -3


В этом примере есть два устройства подкачки: файл подкачки и раздел подкачки. Чтобы отключить их - мы можем использовать команду swapoff.

sudo swapoff /swapfile
sudo swapoff /dev/sda3


Далее нам нужно удалить их. Раздел подкачки нужно будет удалить с помощью вашего любимого инструмента разметки. Файл подкачки можно удалить просто удалив его как обычный файл.

sudo rm /swapfile


Нам также нужно удалить все строки, связанные с подкачкой, из /etc/fstab. Отредактируйте файл с помощью подходящего текстового редактора и удалите или закомментируйте строки для раздела подкачки. В приведенном выше примере мы удалим эти строки:

UUID=c2430cf1-8ea9-4422-a5c5-5a38779194c3 swap           swap    defaults,noatime 0 2
/swapfile none swap defaults 0 0


При настроенной гибернации также потребуется отредактировать /etc/default/grub. Найдите и удалите опцию resume=UUID=... или замените UUID на новое правильное значение. В приведенном выше примере мы удалим этот текст:

resume=UUID=c2430cf1-8ea9-4422-a5c5-5a38779194c3

Затем запустите:

sudo update-grub

Если вы полностью удаляете спящий режим - удалите resume из строки HOOKS в /etc/mkinitpcio.conf и запустите:

sudo mkinitpcio -P


Далее следует перезагрузиться. После перезагрузки при запуске swapon вы должны увидеть что-то похожее на следующее:

NAME                           TYPE SIZE USED PRIO
/var/lib/systemd-swap/swapfc/1 file 512M   0B   -2


systemd-swap будет добавлять и удалять файлы подкачки в соответствии с потреблением памяти.


Note
Если вы не удалите существующий раздел подкачки - он будет автоматически активирован systemd, даже если вы удалили его из fstab


Использование zswap с systemd-swap

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

Чтобы включить zswap с помощью systemd-swap просто измените инструкции выше и установите параметр ядра Linux zswap_enabled=1

Настройка и соображения по производительности

Хотя подкачка кажется отличным способом расширения памяти - чрезмерное её использование приведет к серьезному снижению производительности как уже говорилось ранее.

Существует несколько параметров, которые можно использовать для настройки использования подкачки. Это swappiness и vfs_cache_pressure. Чтобы узнать текущие настройки этих параметров необходимо воспользоваться следующими командами:

cat /proc/sys/vm/swappiness
cat /proc/sys/vm/vfs_cache_pressure

swappiness контролирует, насколько вероятно что страница будет передана в своп. Это значение представляет собой процент свободной памяти перед активацией подкачки. Чем меньше значение - тем меньше используется подкачка и тем больше страниц памяти хранится в физической памяти:

  • 0 отключает подкачку
  • 60 - это значение по умолчанию, идеально подходящее для сервера, испытывающего недостаток памяти и запускающего много служб.
  • 100 - это очень агрессивная подкачка.

Для большинства настольных компьютеров рекомендуемое значение составляет 10: Теоретически это означает, что подкачка начинается только тогда, когда использование оперативной памяти достигает примерно 90 процентов.

vfs_cache_pressure раньше было процентным значением, которое контролирует тенденцию ядра к возврату памяти, используемой для кэширования объектов каталогов и инодов, со значением по умолчанию 100 на ядрах <5.4. На ядрах >=5.4 значение может быть увеличено до 100. Увеличение этого значения увеличит скорость удаления этих объектов из кэша оперативной памяти. Уменьшение этого значения позволит этим объектам дольше кэшироваться в памяти, потребляя со временем дополнительную оперативную память. В зависимости от конкретной рабочей нагрузки - слишком сильное увеличение или уменьшение этого значения может оказать значительное негативное влияние на производительность системы. Experimentation is needed to find the appropriate balance and the default value is reasonable. In general, it is more common to optimize swappiness before experimenting with vfs_cache_pressure.

To set these values you can use the command sysctl. For example, to set the swappiness value to 10 you could use:

sudo sysctl vm.swappiness=10


There is no preset defined answer on the optimal values for these parameters. Experimentation is needed to find the optimum configuration for your specific hardware and workload.


Смотрите также