Это старая версия документа.
Содержание
SWAP – это специальный раздел на диске или файл в который операционная система перемещает отдельные блоки оперативной памяти в случае когда оперативной памяти не хватает для работы приложений.
Более подробно о механизме своппинга можно прочитать в Википедии
Дополнительно SWAP используется при организации режима сна (hibernation или suspend to disk). При этом в SWAP сохраняется образ оперативной памяти.
Размещение
SWAP может быть размещен на разделе диска, в файле или в RAM. Исторически в Linux SWAP размещался на разделе, но, начиная с версии ядра 2.6 работа, swap-файла не уступает по производительности swap-разделу. Однако стандартный установщик Ubuntu (до версии 17.04) не умеет создавать swap-файл при установке и выдает предупреждение, если swap-раздел не определен при разметке диска. Начиная с версии 17.10 Ubuntu предлагает по умолчанию создавать swap в файле. Использование swap-файла имеет некоторые преимущества: он не занимает отдельный раздел, легко удаляется, легко меняет свой размер.
Безопасность
При работе с секретными данными, часть этих данных, в процессе работы, может оказаться в SWAP, кроме того значительный объем секретных данных может оказаться в SWAP в режиме сна (suspend to disk). Поэтому в таких случаях рекомендуется шифровать не только данные, но и сам SWAP. Однако нужно учитывать, что у режима сна при шифровании SWAP могут возникнуть сложности.
Размер
О размере SWAP в Интернете можно найти множество рекомендаций. Однако универсального ответа - нет, при определении размера SWAP следует учесть некоторые аспекты:
- Каков размер оперативной памяти?
- Какие приложения будут использоваться?
- Будет ли вестись работа с секретными данными?
- Нужен ли режим сна (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)
1. Не все пропиетарные видеодрайвера умеют нормально восстанавливаться из этого режима.
2. При объеме памяти 4Gb и более становится довольно затруднительно пользоваться этим режимом (особенно если у вас не SSD диск). Ведь и при сохранении на диск записывается несколько гигабайт из оперативной памяти и столько же считывается при восстановлении. По времени это, как правило, в разы дольше чем просто выключить и включить компьютер. Да, в случае простого выключения нет сохранения открытых документов и приложений, но если у вас еще нет провалов в памяти, то даже закрыть и после загрузки открыть документы - все равно будет быстрее чем ждать сохранения и восстановления.
Для поддержки Hibernate исключительно важен SWAP (потому как именно туда сохраняется образ оперативной памяти) и SWAP должен уместить в себя все полезное что есть в памяти. А это означает, что размер SWAP достаточный для активации режима Hibernate может быть и меньше полного объема оперативной памяти (когда в ней не весь объем занят сохраняемыми данными), однако в более общем случае SWAP должен вместить в себя и то, что в нем было размещено при активации этого режима и все важное, что находилось в оперативной памяти в это момент. Из этих соображения и надо выбирать размер SWAP.
Параметр 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 не превратит волшебным образом «старый пень в цветущее дерево». Урезаете кеши - понижаете отзывчивость системы при работе с файлами (операции по работе с файлами будут чаще промахиваться мимо кэшей и уходить на долгую работу с диском), урезаете память процессов, заставляя чаще использовать своп - также снижаете отзывчивость системы при переключении задач (в этом случае уже задачи чаще «промахиваются» и лезут на диск за своими компонентами).
Нужное вам значение, скорее всего, стоит подбирать экспериментально (к рекомендациям поставить какое-то определенное значение и все будет «зашибись» - стоит относиться как минимум с сомнением).