This page is a translated version of the page Swap and the translation is 100% complete.
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] zswap 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

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

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

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

Чтобы создать раздел подкачки - необходимо достаточно нераспределенного дискового пространства для создания дополнительного раздела. Если у вас недостаточно места - перейдите к следующему разделу Использование_файла_подкачки. Раздел подкачки может быть создан в любом инструменте управления дисками / разделами и должен быть установлен как тип 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. Они все еще требуют некоторых специальных действий в дополнение к описанным выше.

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

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

Просто замените /swapfile на /@swapfile/swapfile.


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

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


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

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

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

Существует несколько параметров, которые можно использовать для настройки использования подкачки. Это 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. Увеличение этого значения увеличит скорость удаления этих объектов из кэша оперативной памяти. Уменьшение этого значения позволит этим объектам дольше кэшироваться в памяти, потребляя со временем дополнительную оперативную память. В зависимости от конкретной рабочей нагрузки - слишком сильное увеличение или уменьшение этого значения может оказать значительное негативное влияние на производительность системы. Чтобы найти подходящий баланс необходимо поэкспериментировать, а значение по умолчанию является разумным. В целом, чаще всего оптимизируют swappiness, прежде чем экспериментировать с vfs_cache_pressure.

Для установки этих значений вы можете использовать команду sysctl. Например, чтобы установить значение swappiness равным 10, вы должны использовать:

sudo sysctl vm.swappiness=10


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


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