Это старая версия документа.


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

Более подробно о механизме своппинга можно прочитать в Википедии

Дополнительно SWAP используется при организации режима сна (hibernation или suspend to disk). При этом в SWAP сохраняется образ оперативной памяти.

Размещение

SWAP может быть размещен на разделе диска, в файле или в RAM. Исторически в Linux SWAP размещался на разделе, но, начиная с версии ядра 2.6 работа, swap-файла не уступает по производительности swap-разделу. Однако стандартный установщик Ubuntu (до версии 17.04) не умеет создавать swap-файл при установке и выдает предупреждение, если swap-раздел не определен при разметке диска. Начиная с версии 17.04 Ubuntu предлагает по умолчанию создавать swap в файле (объем определяется как 5% от свободного на диске места, но не более 2 Гб). Использование swap-файла имеет некоторые преимущества: он не занимает отдельный раздел, его легко создать, изменить его размер или удалить.

Дополнительно, при выборе места где будет создаваться swap, нужно учитывать что не все файловые системы позволяют использовать прямую адресацию блоков swap-файла (именно так ядро linux работает с swap-файлом). Так, к примеру, нельзя использовать swap в файле на btrfs.

Безопасность

При работе с секретными/зашифрованными данными, часть этих данных, в процессе работы, может оказаться в SWAP в расшифрованном виде, кроме того значительный объем секретных данных может оказаться в SWAP в режиме сна (suspend to disk). Поэтому в таких случаях рекомендуется шифровать не только данные, но и сам SWAP. Однако нужно учитывать, что у режима сна при шифровании SWAP могут возникнуть сложности.

Размер

О размере SWAP в Интернете можно найти множество рекомендаций. Однако универсального ответа - нет.

При определении размера SWAP следует учесть следующие аспекты:

  1. Каков размер оперативной памяти?
  2. Какие приложения будут использоваться?
  3. Будет ли вестись работа с секретными данными?
  4. Нужен ли режим сна (suspend to disk)?

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

Для машин с незначительным объемом памяти (меньше 2 Гб) рекомендуется создавать SWAP размером с оперативную память или немного больше. Однако если пользоваться suspend to disk то стоит задать размер SWAP ~ равный полутора-двум объемам оперативной памяти.
Для машин с объемом памяти 3-4 Гб нужно точно решить - будет ли использоваться suspend to disk. Если да, то нужно создавать SWAP размером на 10-15% больше размера оперативной памяти. Если же suspend to disk использоваться не будет - то можно создать SWAP небольшого размера (половина или даже треть от объема оперативки). Можно даже вовсе не создавать SWAP при установке системы, а (при необходимости) добавить его позже как файл. На компьютерах с объемами оперативной памяти > 4Gb уже становится затруднительными использовать suspend to disk - попросту приходится очень долго ждать как окончания сохранения образа памяти на диск так и восстановления. А без suspend to disk необходимость в SWAP уже довольно сомнительна.

Но все эти рассуждения сильно корректируются когда вы планируете использовать ресурсоёмкие программы (рендеринг изображения, компиляция огромных проектов и т.п.) Тут уже надо ориентироваться на потребности приложений.

При работе с секретными (зашифрованными) данными стоит либо шифровать SWAP, либо рассмотреть вариант с отказом от SWAP вовсе (зависит от размера оперативной памяти). Стоит также рассмотреть вариант с шифрованием всего диска (доступно в исталляторе ubuntu начиная с 12.10, но реализуемо и в более ранних версиях).

Создание SWAP на разделе диска

Разобравшись с необходимостью и размером swap можно приступить к созданию или изменению swap.
Ядро Linux может работать с несколькими частями swap. Поэтому если вы решили, что созданного при установке системы swap раздела вам мало, то можно создать дополнительный «кусок» swap-а как на свободном разделе так и в файле. Однако нужно учитывать, что для hibernate режима нужен непрерывный блок swap-а, который должен иметь размер больший чем оперативная память.
И так, будем считать что у нас есть раздел /dev/sdc2 (для примера, в реалии в команды нужно будет подставить ваш раздел). Создадим на нем необходимую структуру данных для работы swap:

sudo mkswap /dev/sdc2

Теперь сообщим ядру системы, что оно может использовать этот раздел под swap:

sudo swapon /dev/sdc2

Проверить результат можно посмотрев на вывод команды

sudo swapon -s

Для того, что бы и после перезагрузки системы наш новый swap-раздел использовался ядром нужно прописать монтирование нашего swap-раздела в /etc/fstab. Для этого нам потребуется UUID раздела. Его нам ранее сообщила команда mkswap, но если вы не сохранили вывод этой команды то UUID можно узнать командой

sudo blkid

Теперь пропишем строку в /etc/fstab

echo "UUID=<UUID swap-раздела> swap swap defaults 0 0"| sudo tee -a /etc/fstab

А есть ли решение, позволяющее не думать про размер swap

Если об объеме swap-а вам не хочется даже задумываться, то в репозитории Ubuntu есть утилита Swapspace (динамический менеджер подкачки / a dynamic swap manager). Эта утилита (работающая в фоновом режиме, демон), динамически управляет подкачкой. При необходимости Swapspace автоматически создаёт дополнительные файлы подкачки требуемого размера. Если будет установлено, что требуется всё больший и больший объем swap-а, то будут создаваться более крупные файлы, а если необходимость небольшая то создаются небольшие файлы. Не используемые файлы - удаляются.
Будучи запущенной Swapspace занимает около 300Кб в оперативной памяти (по мере работы размер не увеличивается). Swapspace во время работы не задаёт никаких вопросов пользователю и старается самостоятельно определить - какой объем swap необходим для обеспечения работоспособности системы в текущих условиях.

Однако, если вы работаете с секретными документами - не забудьте указать Swapspace создавать swap-файлы на зашифрованном диске или внутри шифрованного контейнера1).

Hibernate (suspend to disk)

Режим сна (он же hibernate или suspend to disk) предоставляет хорошую возможность сохранив все открытые приложения/документы полностью выключить компьютер и получить обратно все как было открыто ранее после включения.2)

В последних дистрибутивах Ubuntu режим Hibirnat по умолчанию отключен. Продиктовано это двумя соображениями:

1. Не все пропиетарные видеодрайвера умеют нормально восстанавливаться из этого режима.

2. При объеме памяти 4Gb и более становится довольно затруднительно пользоваться этим режимом (особенно если у вас не SSD диск). Ведь и при сохранении на диск записывается несколько гигабайт из оперативной памяти и столько же считывается при восстановлении. По времени это, как правило, в разы дольше чем просто выключить и включить компьютер. Да, в случае простого выключения нет сохранения открытых документов и приложений, но если у вас еще нет провалов в памяти, то даже закрыть и после загрузки открыть документы - все равно будет быстрее чем ждать сохранения и восстановления.

Для поддержки Hibernate исключительно важен SWAP (потому как именно туда сохраняется образ оперативной памяти) и SWAP должен уместить в себя все полезное что есть в памяти. А это означает, что размер SWAP достаточный для активации режима Hibernate может быть и меньше полного объема оперативной памяти (когда в ней не весь объем занят сохраняемыми данными), однако в более общем случае SWAP должен вместить в себя и то, что в нем было размещено при активации этого режима и все важное, что находилось в оперативной памяти в это момент. Из этих соображения и надо выбирать размер SWAP.

Размещение SWAP в шифрованный раздел - требует определенных усилий, что бы заставить работать Hibernate.
А вот Hibernate со SWAP, размещенным на шифрованном диске3), работает нормально.

Параметр vm.swappiness (или "если копнуть глубже")

Основной параметр влияющий на работу ядра со swap - параметр vm.swappiness. О том что этот параметр означает написано довольно много, но более толкового описания чем было дано в рассылке kernel.org не найти - статья на английском. В общем случае - не трогайте этот параметр без особой нужды.

Задать настройку, которая будет применяется системой при загрузке можно указав в /etc/sysctl.conf значение vm.swappiness, например равное 30.

# vm.swappiness = 30

Для того что бы ядро стало использовать настройки в /etc/sysctl.conf нужно загрузить их командой:

# sysctl -f

Актуальное значение, используемое ядром в настоящее время, можно посмотреть или изменить в /proc/sys/vm/swappiness.

# cat /proc/sys/vm/swappiness
# echo 10 > /proc/sys/vm/swappiness

Но учтите, что изменения в /proc/sys/vm/swappiness система забудет при следующей перезагрузке.

Значение по умолчанию - 60.

Какое значение выбрать

А если решили поменять swappiness, то не поленитесь почитать (по ссылке выше) о том, как устроена виртуальная память Linux, это сильно поможет понять как пользоваться настройками ядра.

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

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

Нужное вам значение, скорее всего, стоит подбирать экспериментально (к рекомендациям поставить какое-то определенное значение «и все будет зашибись» - стоит относиться как минимум с сомнением).

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

Ссылки

1)
Swapspace создает swap-файлы без шифрования внутри файла
2)
Этот режим чем то похож на suspend to RAM (или просто suspend), однако в режиме suspend to RAM компьютер фактически не выключается, а переходит в специальный режим пониженного энергопотребления.
3)
доступно с версии 12.10