Swap (Русский)
На этой странице представлено введение в пространство подкачки и подкачку страниц в GNU/Linux. Она охватывает создание и активацию файлов и разделов подкачки.
Из All about Linux swap space:
- Linux делит свою физическую оперативную память на кусочки памяти, называемые страницами. Подкачка (swapping) — это процесс, когда страницы памяти копируются на предварительно настроенное пространство на жёстком диске, называемое пространством подкачки (swap space), чтобы освободить эти страницы в оперативной памяти. Суммарный размер оперативной памяти и пространства подкачки — это количество доступной виртуальной памяти.
Работа с подкачкой обеспечивается ядром Linux и инструментами из пакета util-linux в пользовательском пространстве.
Пространство подкачки
Пространство подкачки может быть разделом диска или файлом. Пользователи могут создать пространство подкачки во время установки или позднее в любое желаемое время. Пространство подкачки может быть использовано для двух целей: для расширения доступной виртуальной памяти и для сохранения данных при переходе в спящий режим.
Имеет ли смысл расширять виртуальную память с помощью подкачки, зависит от объёма установленной физической памяти. Если он меньше, чем объём памяти, необходимый для запуска всех нужных программ, то добавление подкачки может оказаться полезно. Это позволит избежать состояния нехватки памяти (out of memory) и срабатывания OOM killer в ядре, который попытается освободить память путём убийства процессов. Чтобы увеличить количество виртуальной памяти до требуемого уровня, добавьте необходимую разницу (или больше) в качестве пространства подкачки.
Самый большой недостаток использования подкачки — снижение производительности; смотрите раздел #Производительность. Поэтому включение подкачки — это вопрос личных предпочтений: кому-то может быть предпочтительнее убить процессы при нехватке памяти, а кому-то важно сохранить работу ценой снижения скорости работы системы.
Проверить статус подкачки можно командой:
$ swapon --show
Посмотреть использование физической памяти и подкачки:
$ free -h
Раздел подкачки
Раздел подкачки может быть создан в большинстве инструментов для разметки. Разделы подкачки обычно обозначаются как тип 82
в MBR и как 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F
в GPT.
Чтобы создать пространство подкачки на месте нужного раздела, используйте команду mkswap(8):
# mkswap /dev/sdxy
Чтобы задействовать его:
# swapon /dev/sdxy
Чтобы автоматически подключать этот раздел подкачки при загрузке системы, добавьте запись в /etc/fstab
:
UUID=UUID_устройства none swap defaults 0 0
Где UUID_устройства
— это UUID раздела, используемого в качестве пространства подкачки.
Синтаксис файла описан в статье fstab (Русский).
Активация с использованием systemd
systemd может автоматически активировать разделы подкачки, используя два различных механизма. Оба являются исполняемыми файлами в каталоге /usr/lib/systemd/system-generators
. Это генераторы, которые запускаются при загрузке системы и создают mount-юниты. Первый — systemd-fstab-generator
, который считывает файл fstab и из его содержимого генерирует systemd-юниты, в том числе юниты для подкачки. Второй — systemd-gpt-auto-generator
, который сканирует корневой диск для создания юнитов. Он работает только с GPT-дисками и ищет разделы подкачки по GUID; смотрите раздел systemd (Русский)#Автомонтирование GPT-раздела для более подробной информации.
Отключение подкачки
Чтобы деактивировать определённое пространство подкачки:
# swapoff /dev/sdxy
Также можно использовать ключ -a
, чтобы деактивировать все пространства подкачки.
Поскольку подкачкой управляет systemd, она вновь будет активирована при следующем старте системы. Чтобы навсегда отключить активацию автоматически обнаруженного пространства подкачки, выполните systemctl --type swap
для получения списка .swap юнитов и замаскируйте те юниты, которые вы хотите отключить.
Файл подкачки
Вместо создания целого раздела можно использовать файл подкачки. Он даёт возможность менять свой размер на лету, а также его гораздо легче полностью удалить. Это может быть особенно важно, если место на диске ограничено (например, небольшие SSD).
Создание файла подкачки
Используйте команду dd для создания файла подкачки нужного вам размера. Пример для создания файла размером 8 ГиБ:
# dd if=/dev/zero of=/swapfile bs=1M count=8k status=progress
Установите правильные права доступа (файл подкачки, доступный для чтения всем, — это огромная локальная уязвимость):
# chmod 0600 /swapfile
После создания файла нужного размера отформатируйте его как подкачку:
# mkswap -U clear /swapfile
Активируйте файл подкачки:
# swapon /swapfile
Наконец, добавьте запись для файла подкачки в файл fstab:
/etc/fstab
/swapfile none swap defaults 0 0
Синтаксис файла описан в статье fstab (Русский).
Удаление файла подкачки
Перед удалением файла подкачки сперва отключите его:
# swapoff /swapfile # rm -f /swapfile
Не забудьте удалить соответствующую строку в /etc/fstab
.
Сжатое блочное устройство в ОЗУ
zswap используется по умолчанию, если вы используете файл или раздел подкачки, но вы можете обойтись вообще без файла или раздела подкачки и вместо него создать сжатое блочное устройство в оперативной памяти с помощью zram. Информация о различиях между использованием zram и zswap описана в разделе Увеличение производительности#zram или zswap.
Шифрование подкачки
Смотрите dm-crypt/Swap encryption.
Производительность
Операции с подкачкой обычно выполняются значительно медленнее, чем прямой доступ к данным в ОЗУ. Полное отключение подкачки ради повышения производительности иногда может привести к её ухудшению, поскольку уменьшается объём памяти, доступной для кэша виртуальной файловой системы (VFS), что приводит к более частым дорогостоящим обращениям к накопителю.
Значения подкачки можно настроить, чтобы помочь производительности:
Swappiness
Когда использование памяти достигает определённого порога, ядро начинает просматривать активную память и смотреть, что можно освободить. Изменённые данные файлов можно записать в файловую систему, выгрузить из памяти и по необходимости загрузить позже; другие данные, не связанные с файлами, нужно будет записать в подкачку перед выгрузкой.
Параметр sysctl swappiness отображает предпочтение ядра записывать подкачку вместо записи файлов. Он может иметь значение от 0 до 200 (максимум 100 на Linux < 5.8); значение по умолчанию равно 60. При низком значении ядро будет предпочитать выгрузку открытых файлов, при высоком — предпочитать использование подкачки, а значение 100 означает, что затраты на ввод-вывод считаются равными. Известно, что использование низкого значения при достаточном количестве памяти улучшает отзывчивость на системах с ядрами <4.0.
Чтобы проверить текущее значение swappiness:
$ sysctl vm.swappiness
Также можно посмотреть файл /sys/fs/cgroup/memory/memory.swappiness
(специфичный для cgroup v1) или /proc/sys/vm/swappiness
.
Чтобы временно установить значение swappiness:
# sysctl -w vm.swappiness=10
Чтобы сделать изменение постоянным, создайте файл настроек sysctl.d(5), например:
/etc/sysctl.d/99-swappiness.conf
vm.swappiness = 10
Чтобы значение swappiness задавал загрузчик при загрузке ядра, добавьте параметр ядра, например sysctl.vm.swappiness=10
.
Чтобы проверить и больше узнать, почему оно так работает, посмотрите эту статью. Смотрите также более новую статью о распространённых заблуждениях.
VFS cache pressure
Ещё один sysctl параметр, влияющий на производительность подкачки, — vm.vfs_cache_pressure
. Он контролирует склонность ядра к задействованию (reclaim) памяти, которая используется для кэширования VFS caches, вместо кэша страниц и подкачки. Увеличение этого значения увеличивает частоту, с которой будет забираться память VFS caches[1]. Более подробная информация есть в документации ядра Linux.
Приоритет
Если у вас несколько файлов или разделов подкачки, можно присвоить им приоритеты (от 0 до 32767). Система будет использовать пространства подкачки с высоким приоритетом перед использованием пространств с низким приоритетом. Например, если у вас есть быстрый диск (/dev/sda
) и медленный (/dev/sdb
), назначьте высокий приоритет для подкачки, расположенной на быстром устройстве. Приоритет можно задать в файле fstab с помощью параметра pri
:
/dev/sda1 none swap defaults,pri=100 0 0 /dev/sdb2 none swap defaults,pri=10 0 0
Или с помощью параметра --priority
в команде swapon:
# swapon --priority 100 /dev/sda1
Если несколько подкачек будут иметь одинаковый приоритет и он будет самым высоким из доступным приоритетов, то страницы будут распределяться по кругу между этими подкачками.
Чередование
Нет необходимости использовать RAID для повышения производительности подкачки. Ядро самостоятельно может чередовать подкачку на нескольких устройствах, если вы присвоите им одинаковый приоритет в /etc/fstab
. Подробнее смотрите The Software-RAID HOWTO.