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


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

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

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

Размещение

SWAP может быть размещен на разделе диска, в файле или в RAM. Исторически в Linux SWAP размещался на разделе, но, начиная с версии ядра 2.6 работа, swap-файла не уступает по производительности swap-разделу. Однако стандартный установщик Ubuntu не умеет создавать swap-файл при установке и выдает предупреждение, если swap-раздел не определен при разметке диска. Использование swap-файла имеет некоторые преимущества: он не занимает отдельный раздел, легко удаляется, легко меняет свой размер.

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

При работе с секретными данными, часть этих данных, в процессе работы, может оказаться в 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

Но учтите, что эти изменения система забудет при следующей перезагрузке.

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

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

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

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

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

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

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

Ссылки

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