Различия
Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
wiki:swap [2017/07/03 15:47] [Безопасность] |
wiki:swap [2019/06/27 23:40] (текущий) [Размер] |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
====== SWAP ====== | ====== SWAP ====== | ||
- | **SWAP** -- это специальный раздел на диске или файл в который операционная система перемещает отдельные блоки оперативной памяти в случае когда оперативной памяти не хватает для работы приложений. | + | **SWAP** -- один из механизмов виртуальной памяти, при котором отдельные фрагменты памяти (обычно неактивные) перемещаются из ОЗУ во вторичное хранилище (отдельный раздел или файл), освобождая ОЗУ для загрузки других активных фрагментов памяти. |
- | Более подробно о механизме своппинга можно прочитать в [[wpru>Подкачка страниц|Википедии]] | + | Более подробно о механизме своппинга можно прочитать в [[wpru>Подкачка страниц|Википедии]]. |
Дополнительно SWAP используется при организации режима сна (hibernation или suspend to disk). При этом в SWAP сохраняется образ оперативной памяти. | Дополнительно SWAP используется при организации режима сна (hibernation или suspend to disk). При этом в SWAP сохраняется образ оперативной памяти. | ||
===== Размещение ===== | ===== Размещение ===== | ||
- | SWAP может быть размещен на разделе диска, в [[спящий_режим#создание_swap-файла|файле]] или в [[RAM]]. Исторически в Linux SWAP размещался на разделе, но, начиная с версии ядра 2.6 работа, swap-файла не уступает по производительности swap-разделу. Однако стандартный установщик Ubuntu (до версии 17.04) не умеет создавать swap-файл при установке и выдает предупреждение, если swap-раздел не определен при разметке диска. Начиная с версии 17.04 Ubuntu предлагает по умолчанию создавать swap в файле (об'ем определяется как 5% от свободного на диске места, но не более 2 Гб). Использование swap-файла имеет некоторые преимущества: он не занимает отдельный раздел, легко удаляется, легко меняет свой размер. | + | SWAP может быть размещен на разделе диска, в [[спящий_режим#создание_swap-файла|файле]] или в [[RAM]]. Исторически в Linux SWAP размещался на разделе, но в современных дистрибутивах производительность SWAP-файла не уступает SWAP-разделу. Однако стандартный установщик Ubuntu (до версии 17.04) не умеет создавать SWAP-файл при установке и выдает предупреждение, если SWAP-раздел не определен при разметке диска. Начиная с версии 17.04, Ubuntu предлагает по умолчанию создавать SWAP в файле (объем определяется как 5% от свободного на диске места, но не более 2 Гб). Использование SWAP-файла имеет некоторые преимущества: он не занимает отдельный раздел, его легко создать, изменить его размер или удалить. |
+ | |||
+ | Дополнительно при выборе размещения SWAP нужно учитывать, что не все файловые системы позволяют использовать прямую адресацию блоков SWAP-файла. Так, к примеру, нельзя использовать SWAP в файле на разделе с файловой системой btrfs(по состоянию на середину 2017). | ||
===== Безопасность ===== | ===== Безопасность ===== | ||
- | При работе с секретными данными, часть этих данных, в процессе работы, может оказаться в SWAP в расшифрованном виде, кроме того значительный объем секретных данных может оказаться в SWAP в режиме сна (suspend to disk). Поэтому в таких случаях рекомендуется шифровать не только данные, но и сам SWAP. Однако нужно учитывать, что у режима сна при шифровании SWAP могут возникнуть [[wiki:encrypted-home|сложности]]. | + | При работе с секретными/зашифрованными данными часть этих данных в процессе работы либо при гибернации может оказаться в SWAP в расшифрованном виде. В таких случаях рекомендуется шифровать не только данные, но и сам SWAP. Однако нужно учитывать, что у режима сна при шифровании SWAP могут возникнуть [[wiki:encrypted-home|сложности]]. |
===== Размер ===== | ===== Размер ===== | ||
- | О размере SWAP в Интернете можно найти множество рекомендаций. Однако универсального ответа - нет, при определении размера SWAP следует учесть некоторые аспекты: | + | В Интернете можно найти множество рекомендаций по определению размера SWAP, однако универсального ответа не существует. |
+ | |||
+ | При определении размера SWAP следует учесть следующие аспекты: | ||
- Каков размер оперативной памяти? | - Каков размер оперативной памяти? | ||
Строка 21: | Строка 25: | ||
- Нужен ли режим сна (suspend to disk)? | - Нужен ли режим сна (suspend to disk)? | ||
- | В зависимости от ответов на эти вопросы - можно дать разные рекомендации по размеру SWAP. | + | В зависимости от ответов на эти вопросы рекомендации по размеру SWAP будут значительно различаться. |
- | Для машин с незначительным объемом памяти (меньше 2 Гб) рекомендуется создавать SWAP размером с оперативную память или немного больше. Однако если пользоваться suspend to disk то стоит задать размер SWAP ~ равный полутора-двум объемам оперативной памяти.\\ | + | Для машин с незначительным объемом памяти (меньше 2 Гб) рекомендуется создавать SWAP размером от 1,5 до 2-х размеров оперативной памяти. И стоит попробовать изменять vm.swappiness, но лучше поискать возможность увеличить объем оперативной памяти.\\ |
- | Для машин с объемом памяти 3-4 Гб нужно точно решить - будет ли использоваться suspend to disk. Если да, то нужно создавать SWAP размером на 10-15% больше размера оперативной памяти. Если же suspend to disk использоваться не будет - то можно создать SWAP небольшого размера (половина или даже треть от объема оперативки). Можно даже вовсе не создавать SWAP при установке системы, а (при необходимости) добавить его позже как файл. | + | Для машин с объемом памяти 3-4 Гб нужно решить, будет ли использоваться suspend to disk. Если да, то нужно создавать SWAP размером на 10-15% больше размера оперативной памяти. Если же suspend to disk использоваться не будет, то можно создать SWAP небольшого размера (размером от половины до 1 объема оперативной памяти). Можно не создавать SWAP при установке системы, а при необходимости добавить его позже как файл.\\ |
- | На компьютерах с объемами оперативной памяти > 4Gb уже становится затруднительными использовать suspend to disk - попросту приходится очень долго ждать как окончания сохранения образа памяти на диск так и восстановления. А без suspend to disk необходимость в SWAP уже крайне сомнительна. | + | На компьютерах с объемами оперативной памяти более 6Gb имеет смысл создать SWAP размером в половину от объема оперативной памяти. При этом, если вы хотите использовать гибернацию, следует оценить загрузку оперативной памяти в процессе работы и задать величину SWAP, исходя из этого. К примеру, если объем оперативной памяти составляет 16 ГБ, а рабочая загрузка не превышает в среднем 5-6 ГБ, величины SWAP-раздела в 8 ГБ вам хватит для гибернации. При таком подходе следует помнить, что при использовании ресурсоёмких программ (рендеринг изображения, компиляция огромных проектов и т.п.) оперативная память может заполняться полностью, а SWAP - использоваться в качестве подкачки. В таких ситуациях размер SWAP нужно выбирать индивидуально.\\ |
- | + | ||
- | Но все эти рассуждения сильно корректируются когда вы планируете использовать ресурсоёмкие программы (рендеринг изображения, компиляция огромных проектов и т.п.) Тут уже надо ориентироваться на потребности приложений.\\ | + | |
- | + | ||
- | При работе с секретными (зашифрованными) данными стоит либо шифровать SWAP, либо рассмотреть вариант с отказом от SWAP вовсе (зависит от размера оперативной памяти). Стоит также рассмотреть вариант с шифрованием всего диска (доступно в исталляторе ubuntu начиная с 12.10, но [[wiki:шифрование_всего_диска|реализуемо]] и в более ранних версиях). | + | |
+ | При работе с секретными (зашифрованными) данными стоит либо шифровать SWAP, либо рассмотреть вариант с отказом от SWAP вовсе (зависит от размера оперативной памяти). Стоит также рассмотреть вариант с шифрованием всего диска. | ||
===== Создание SWAP на разделе диска ===== | ===== Создание SWAP на разделе диска ===== | ||
- | Разобравшись с необходимостью и размером swap можно приступить к созданию или изменению swap.\\ | + | Разобравшись с требованиями к SWAP, можно приступить к его созданию или изменению.\\ |
- | Ядро Linux может работать с несколькими частями swap. Поэтому если вы решили, что созданного при установке системы swap раздела вам мало, то можно создать дополнительный "кусок" swap-а как на свободном разделе так и [[wiki:спящий_режим#создание_swap-файла|в файле]]. Однако нужно учитывать, что для hibernate режима нужен непрерывный блок swap-а, который должен иметь размер больший чем оперативная память.\\ | + | Ядро Linux может работать с несколькими частями SWAP. Поэтому если вы решили, что созданного при установке системы SWAP-раздела недостаточно, то стоит создать дополнительный SWAP (выделить место под раздел или [[wiki:спящий_режим#создание_swap-файла|файл]]). Однако нужно учитывать, что для гибернации нужен непрерывный блок SWAP, который должен иметь размер больший, чем оперативная память.\\ |
- | И так, будем считать что у нас есть раздел /dev/sdc2 (для примера, в реалии в команды нужно будет подставить ваш раздел). Создадим на нем необходимую структуру данных для работы swap:\\ | + | К примеру, у нас есть раздел /dev/sdc2 (ваше имя раздела может отличаться). Создадим на нем необходимую структуру данных для работы SWAP:\\ |
<code bash>sudo mkswap /dev/sdc2</code> | <code bash>sudo mkswap /dev/sdc2</code> | ||
- | Теперь сообщим ядру системы, что оно может использовать этот раздел под swap:\\ | + | Подключим раздел как SWAP:\\ |
<code bash>sudo swapon /dev/sdc2</code> | <code bash>sudo swapon /dev/sdc2</code> | ||
- | Проверить результат можно посмотрев на вывод команды | + | Проверить результат можно, посмотрев на вывод команды |
<code bash>sudo swapon -s</code> | <code bash>sudo swapon -s</code> | ||
- | Для того, что бы и после перезагрузки системы наш новый swap-раздел использовался ядром нужно прописать монтирование нашего swap-раздела в /etc/fstab. Для этого нам потребуется UUID раздела. Его нам ранее сообщила команда mkswap, но если вы не сохранили вывод этой команды то UUID можно узнать командой | + | Сделаем автомонтирование SWAP-раздела при запуске системы. Узнаем UUID раздела: |
<code bash>sudo blkid</code> | <code bash>sudo blkid</code> | ||
Теперь пропишем строку в /etc/fstab | Теперь пропишем строку в /etc/fstab | ||
- | <code bash>echo "UUID=<UUID swap-раздела> swap swap defaults 0 0"| sudo tee -a /etc/fstab</code> | + | <code bash>echo "UUID=<UUID swap-раздела> swap swap defaults,pri=<Приоритет (от 0 до 32767)> 0 0"| sudo tee -a /etc/fstab</code> |
- | ===== А есть ли решение, позволяющее не думать про размер swap ===== | + | ===== SWAP с динамически изменяемым размером ===== |
- | Если об объеме swap-а вам не хочется даже задумываться, то в репозитории Ubuntu есть утилита **Swapspace** (динамический менеджер подкачки / a dynamic swap manager). Эта утилита (работающая в фоновом режиме, демон), динамически управляет подкачкой. При необходимости Swapspace автоматически создаёт дополнительные файлы подкачки требуемого размера. Если будет установлено, что требуется всё больший и больший объем swap-а, то будут создаваться более крупные файлы, а если необходимость небольшая то создаются небольшие файлы. Не используемые файлы - удаляются.\\ | + | Если вы не хотите думать об объеме SWAP, имеет смысл воспользоваться утилитой **swapspace** (динамический менеджер подкачки). Эта утилита работает в фоновом режиме и динамически управляет подкачкой. При необходимости swapspace автоматически создаёт дополнительные файлы подкачки требуемого размера. Неиспользуемые файлы подкачки удаляются и не занимают место.\\ |
- | Будучи запущенной Swapspace занимает около 300Кб в оперативной памяти (по мере работы размер не увеличивается). Swapspace во время работы не задаёт никаких вопросов пользователю и старается самостоятельно определить - какой объем swap необходим для обеспечения работоспособности системы в текущих условиях.\\ \\ | + | Однако, если вы работаете с секретными документами, не забудьте указать swapspace создавать SWAP-файлы на зашифрованном диске или внутри шифрованного контейнера ((swapspace создает SWAP-файлы без шифрования внутри файла)). |
- | Однако, если вы работаете с секретными документами - не забудьте указать Swapspace создавать swap-файлы на зашифрованном диске или внутри шифрованного контейнера((Swapspace создает swap-файлы без шифрования внутри файла)). | + | |
- | ===== Hibernate (suspend to disk) ===== | + | ===== Hibernate (suspend to disk, гибернация) ===== |
- | Режим сна (он же [[wiki:спящий_режим|hibernate или suspend to disk]]) предоставляет хорошую возможность сохранив все открытые приложения/документы полностью выключить компьютер и получить обратно все как было открыто ранее после включения.((Этот режим чем то похож на suspend to RAM (или просто suspend), однако в режиме suspend to RAM компьютер фактически не выключается, а переходит в специальный режим пониженного энергопотребления.)) | + | О настройке режима гибернации можно прочитать [[wiki:спящий_режим|здесь]]. |
- | <note important>В последних дистрибутивах Ubuntu режим Hibirnat по умолчанию отключен. Продиктовано это двумя соображениями: | + | |
- | 1. Не все пропиетарные видеодрайвера умеют нормально восстанавливаться из этого режима. | + | ===== Параметр vm.swappiness ===== |
+ | Основной параметр, влияющий на работу системы со swap, - это **vm.swappiness**. Очень приблизительно этот параметр можно определить так: он задает процент **свободной** оперативной памяти, при котором начинается использование подкачки. Более точное определение смысла этой переменной можно уяснить из описания которое было дано в рассылке kernel.org - [[http://lwn.net/Articles/83588/|статья на английском]].\\ | ||
+ | Без особой необходимости трогать его не рекомендуется. | ||
- | 2. При объеме памяти 4Gb и более становится довольно затруднительно пользоваться этим режимом (особенно если у вас не SSD диск). Ведь и при сохранении на диск записывается несколько гигабайт из оперативной памяти и столько же считывается при восстановлении. По времени это, как правило, в разы дольше чем просто выключить и включить компьютер. Да, в случае простого выключения нет сохранения открытых документов и приложений, но если у вас еще нет провалов в памяти, то даже закрыть и после загрузки открыть документы - все равно будет быстрее чем ждать сохранения и восстановления.</note> | + | Скорректировать значение, применяемое при загрузке системы, можно, указав в файле /etc/sysctl.conf значение vm.swappiness. Пример: |
- | Для поддержки Hibernate исключительно важен SWAP (потому как именно туда сохраняется образ оперативной памяти) и SWAP должен уместить в себя все полезное что есть в памяти. А это означает, что размер SWAP достаточный для активации режима Hibernate может быть и меньше полного объема оперативной памяти (когда в ней не весь объем занят сохраняемыми данными), однако в более общем случае SWAP должен вместить в себя и то, что в нем было размещено при активации этого режима и все важное, что находилось в оперативной памяти в это момент. Из этих соображения и надо выбирать размер SWAP. | + | <code bash>echo "vm.swappiness=30"| sudo tee -a /etc/sysctl.conf</code> |
- | + | Мгновенно применить эту настройку можно с помощью следующей команды: | |
- | <note important>Размещение SWAP в шифрованный раздел - требует определенных [[wiki:encrypted-home|усилий]], что бы заставить работать Hibernate.</note> | + | |
- | + | ||
- | <note important>А вот Hibernate со SWAP, размещенным на шифрованном диске((доступно с версии 12.10)), работает нормально.</note> | + | |
- | + | ||
- | ===== Параметр vm.swappiness (или "если копнуть глубже") ===== | + | |
- | Основной параметр влияющий на работу ядра со swap - параметр vm.swappiness. О том что этот параметр означает написано довольно много, но более толкового описания чем было дано в рассылке kernel.org не найти - [[http://lwn.net/Articles/83588/|статья на английском]]. В общем случае - не трогайте этот параметр без особой нужды. | + | |
- | + | ||
- | Задать настройку, которая будет применяется системой при загрузке можно указав в /etc/sysctl.conf значение vm.swappiness, например равное 30. | + | |
- | <code># vm.swappiness = 30</code> | + | |
- | Для того что бы ядро стало использовать настройки в /etc/sysctl.conf нужно загрузить их командой: | + | |
<code=bash># sysctl -f</code> | <code=bash># sysctl -f</code> | ||
- | Актуальное значение, используемое ядром в настоящее время, можно посмотреть или изменить в /proc/sys/vm/swappiness. | + | Актуальное значение, используемое ядром в настоящее время, можно просмотреть или изменить в /proc/sys/vm/swappiness. |
<code=bash># cat /proc/sys/vm/swappiness | <code=bash># cat /proc/sys/vm/swappiness | ||
# echo 10 > /proc/sys/vm/swappiness</code> | # echo 10 > /proc/sys/vm/swappiness</code> | ||
- | Но учтите, что эти изменения система забудет при следующей перезагрузке. | + | Изменения в /proc/sys/vm/swappiness будут сброшены при следующей перезагрузке. |
- | + | ||
- | Значение по умолчанию - 60. | + | |
- | **Какое значение выбрать** | + | Значение vm.swappiness по умолчанию - 60. |
- | А если решили поменять swappiness, то не поленитесь почитать (по ссылке выше) о том, как устроена виртуальная память Linux, это сильно поможет понять как пользоваться настройками ядра. | + | ==== Какое значение выбрать? ==== |
- | Маленькое значение swappiness (минимально - 0) будет заставлять ядро использовать больше оперативной памяти под память процессов (в ущерб буферам и кэшам), тогда как большое значение (максимальное значение: 100) будет наоборот выделять больше памяти под кэши и буфера (в ущерб памяти для процессов). Но в этих крайних значениях, как правило, нет идеального, универсального решения - да если бы было универсальное решение, то и не нужен был бы настраиваемый параметр. | + | Маленькое значение vm.swappiness (минимальное значение: 0) будет заставлять ядро использовать больше оперативной памяти под память процессов (в ущерб буферам и кэшам), тогда как большое значение (максимальное значение: 100) будет выделять больше памяти под кэши и буфера (в ущерб памяти для процессов). |
- | Нужно понимать: ни одно значение swappiness не превратит волшебным образом "старый пень в цветущее дерево". Урезаете кеши - понижаете отзывчивость системы при работе с файлами (операции по работе с файлами будут чаще промахиваться мимо кэшей и уходить на долгую работу с диском), урезаете память процессов, заставляя чаще использовать своп - также снижаете отзывчивость системы при переключении задач (в этом случае уже задачи чаще "промахиваются" и лезут на диск за своими компонентами). | + | Нужно понимать: ни одно значение vm.swappiness не увеличит волшебным образом производительность компьютера многократно. Урезаете кеши - понижаете отзывчивость системы при работе с файлами, урезаете память процессов - снижаете отзывчивость системы при переключении задач. |
- | Нужное вам значение, скорее всего, стоит подбирать экспериментально (к рекомендациям поставить какое-то определенное значение и все будет "зашибись" - стоит относиться как минимум с сомнением). | + | Нужное вам значение, скорее всего, стоит подбирать экспериментально. |
===== Смотрите также ===== | ===== Смотрите также ===== | ||
* [[wiki:спящий_режим|Спящий режим]] | * [[wiki:спящий_режим|Спящий режим]] |