Swap
Views
Actions
Namespaces
Variants
Tools
Обзор
Пространство подкачки используется для расширения объема памяти (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
Отображение информации о подкачке
Команда 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"
Если Вы хотите иметь более одного раздела подкачки - просто повторите описанные выше шаги для всех дополнительных разделов.
Использование файла подкачки
Использование раздела подкачки имеет один существенный недостаток: Изменение размера swap или добавление swap требует переразметки диска. В текущих ядрах Linux можно использовать файл подкачки вместо выделенного раздела и начиная с ядра 2.6 разница в производительности между ними больше не ощущается.
Создание и включение статического файла подкачки
Сначала создайте и инциализируйте файл для подкачки. Например, чтобы создать файл подкачки размером 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 для этого файла и обеспечивают отключение сжатия.
Просто замените /swapfile на /@swapfile/swapfile.
Файл подкачки на ZFS
zfs не поддерживает файлы подкачки, однако вы можете добиться аналогичного преимущества, используя zvol в качестве тома подкачки.
Подробные инструкции о том, как это сделать, можно найти в этом руководстве по ZoL.
Автоматизированное управление подкачкой с помощью systemd-swap
Можно автоматически управлять размером файла подкачки с помощью 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/mkinitcpio.conf
и запустите:
sudo mkinitcpio -P
Далее следует перезагрузиться. После перезагрузки при запуске swapon
вы должны увидеть что-то похожее на следующее:
NAME TYPE SIZE USED PRIO /var/lib/systemd-swap/swapfc/1 file 512M 0B -2
systemd-swap будет добавлять и удалять файлы подкачки в соответствии с потреблением памяти.
Использование 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. Увеличение этого значения увеличит скорость удаления этих объектов из кэша оперативной памяти. Уменьшение этого значения позволит этим объектам дольше кэшироваться в памяти, потребляя со временем дополнительную оперативную память. В зависимости от конкретной рабочей нагрузки - слишком сильное увеличение или уменьшение этого значения может оказать значительное негативное влияние на производительность системы. Чтобы найти подходящий баланс необходимо поэкспериментировать, а значение по умолчанию является разумным. В целом, чаще всего оптимизируют swappiness, прежде чем экспериментировать с vfs_cache_pressure.
Для установки этих значений вы можете использовать команду sysctl
. Например, чтобы установить значение swappiness равным 10, вы должны использовать:
sudo sysctl vm.swappiness=10
Не существует заранее определенного ответа на вопрос об оптимальных значениях этих параметров. Необходимо поэкспериментировать чтобы найти оптимальную конфигурацию для вашего конкретного оборудования и рабочей нагрузки.
Смотрите также
- Страница на Arch Wiki про swap
- Страница на Arch Wiki про zswap.
- Документация ядра Linux про zswap
- Доументация ядра Linux про swappiness и vfs_cache_pressure
- страница systemd-swap
- Руководство по ZFS в Linux по разделам Swap