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] 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"
Если Вы хотите иметь более одного раздела подкачки - просто повторите описанные выше шаги для всех дополнительных разделов.
Использование файла подкачки
Использование раздела подкачки имеет один существенный недостаток: Изменение размера 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. Они все еще требуют некоторых специальных действий в дополнение к описанным выше.
Перед выполнением шага fallocate
, описанного выше, Вы должны выполнить эти команды:
sudo truncate -s 0 /swapfile sudo chattr +C /swapfile sudo btrfs property set /swapfile compression none
Эти команды создают пустой файл подкачки, отключают COW для этого файла и обеспечивают отключение сжатия.
Just replace /swapfile with /@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/mkinitpcio.conf
и запустите:
sudo mkinitpcio -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
Настройка и соображения по производительности
Хотя подкачка кажется отличным способом расширения памяти - чрезмерное её использование приведет к серьезному снижению производительности как уже говорилось ранее.
There are couple of parameters that can be used to tune swap utilization. These are swappiness and vfs_cache_pressure. To see your current settings for these you can use the following commands:
cat /proc/sys/vm/swappiness cat /proc/sys/vm/vfs_cache_pressure
swappiness
controls how likely a page is to be transferred to swap. This value represents the percentage of the free memory before activating swap. The lower the value, the less swapping is used and the more memory pages are kept in physical memory where:
- 0 disables swap
- 60 is the default value which is ideal for a server that is memory-starved and running a lot of services
- 100 is very aggressive swapping.
For most desktop computers the recommended value is 10: Theoretically, this means to only start swapping when RAM usage reaches around 90 percent.
vfs_cache_pressure
used to be a percentage value that controls the tendency of the kernel to reclaim the memory which is used for caching of directory and inode objects with a default value of 100 on Kernels <5.4. On Kernels >=5.4 can be increased beyond 100. Increasing this value will increase the rate in which these objects are removed from the RAM cache. Decreasing it will allow these objects to be cached in memory longer, consuming additional RAM over time. Depending on your specific workload, increasing or decreasing this value too far can have significant negative impacts on system performance. 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.
Смотрите также
- The Arch Wiki page on swap
- The Arch Wiki page on zswap
- The Linux kernel documentation on zswap
- The Linux kernel documentation on swappiness and vfs_cache_pressure
- The openSUSE guide to tuning memory
- The systemd-swap page
- The ZFS on Linux guide on Swap Volumes