SWAP Сравнение версий

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
wiki:swap [2015/11/26 22:17]
[Hibernate (suspend to disk)]
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 не умеет создавать ​swap-файл при установке и выдает предупреждение,​ если ​swap-раздел не определен при разметке диска. Использование ​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 следует учесть ​следующие аспекты:​
  
   - Каков размер оперативной памяти?​   - Каков размер оперативной памяти?​
Строка 20: Строка 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 небольшого размера (размером от половины до объема оперативной памяти). Можно не создавать 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) ===== +
-Режим сна (он же [[wiki:​спящий_режим|hibernate или suspend to disk]]) предоставляет хорошую возможность сохранив все открытые приложения/​документы полностью выключить компьютер и получить обратно все как было открыто ранее после включения.((Этот режим чем то похож на suspend to RAM (или просто suspend), однако в режиме suspend to RAM компьютер фактически не выключается,​ а переходит в специальный режим пониженного энергопотребления.))  +
-<note important>​В последних дистрибутивах Ubuntu режим Hibirnat по умолчанию отключен. Продиктовано это двумя соображениями:​ +
-1. Не все пропиетарные видеодрайвера умеют нормально восстанавливаться из этого режима. +
-2. При объеме памяти 4Gb и более становится довольно затруднительно пользоваться этим режимом (особенно если у вас не SSD диск). Ведь и при сохранении на диск записывается несколько гигабайт из оперативной памяти и столько же считывается при восстановлении. По времени это, как правило,​ в разы дольше чем просто выключить и включить компьютер. Да, в случае простого выключения нет сохранения открытых документов и приложений,​ но если у вас еще нет провалов в памяти,​ то даже закрыть и после загрузки открыть документы - все равно будет быстрее чем ждать сохранения и восстановления.</​note>​ +
-Для поддержки Hibernate исключительно важен SWAP (потому как именно туда сохраняется образ оперативной памяти) и SWAP должен уместить в себя все полезное что есть в памяти. А это означает,​ что размер SWAP достаточный для активации режима Hibernate может быть и меньше полного объема оперативной памяти (когда в ней не весь объем занят сохраняемыми данными),​ однако в более общем случае SWAP должен вместить в себя и то, что в нем было размещено при активации этого режима и все важное,​ что находилось в оперативной памяти в это момент. Из этих соображения и надо выбирать размер SWAP. +
- +
-<note important>​Размещение SWAP в шифрованный раздел - требует определенных [[wiki:​encrypted-home|усилий]],​ что бы заставить работать Hibernate.</​note>​+
  
-<note important>​А вот ​Hibernate ​со SWAP, размещенным на шифрованном диске((доступно с версии 12.10)), работает нормально.</​note>​+===== Hibernate ​(suspend to diskгибернация) ===== 
 +О настройке режима гибернации ​можно прочитать [[wiki:​спящий_режим|здесь]].
  
-===== Параметр vm.swappiness ​(или "​если копнуть глубже"​) ​===== +===== Параметр vm.swappiness ===== 
-Основной параметр влияющий на работу ​ядра со swap - параметр ​vm.swappiness.+Основной параметрвлияющий на работу ​системы со swap, - это **vm.swappiness**. Очень приблизительно этот параметр можно определить так: он задает процент **свободной** оперативной памяти,​ при котором начинается использование ​подкачки. Более точное определение смысла этой переменной можно уяснить из описания которое было дано в рассылке kernel.org - [[http://​lwn.net/​Articles/​83588/​|статья на английском]].\\ 
 +Без особой необходимости трогать его не рекомендуется.
  
-Задать настройку которая будет применяется системой при загрузке можно указав в /​etc/​sysctl.conf значение vm.swappiness, например ​равное 30.  +Скорректировать ​значение, ​применяемое при загрузке системы, можноуказав в файле ​/​etc/​sysctl.conf значение vm.swappiness. Пример 
-<​code>​vm.swappiness = 30</​code>​ +<​code ​bash>echo "vm.swappiness=30"| sudo tee -a /​etc/​sysctl.conf</​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.
  
-Общая рекомендация - не трогайте этот параметр без особой нужды.+==== Какое ​значение выбрать? ==== 
  
-А если решили, что его нужно тронуть, то не поленитесь почитать о том как устроена виртуальная память ​Linux, ​это сильно ​поможет понять ​как пользоваться настройками ядра.+Маленькое значение vm.swappiness (минимальное значение: 0) будет заставлять ядро использовать больше оперативной памяти под ​память ​процессов (в ущерб буферам и кэшам), ​тогда как большое значение (максимальное ​значение:​ 100) будет выделять ​больше памяти под кэши и буфера (в ущерб памяти для процессов).
  
-Значение swappiness ​= 0 будет заставлять ядро использовать больше оперативной памяти ​под ​память процессов (в ущерб буферам ​и кешам), тогда как ​значение 100 (максимальное) будет наоборот выделять больше памяти под кеши и буфера (в ущерб памяти для ​процессов). Но в этих крайних значениях,​ как правило,​ нет идеального, универсального решения - да если бы было универсальное решение, то и не нужен был бы настраиваемый параметр.+Нужно понимать:​ ни одно значение ​vm.swappiness ​не увеличит волшебным ​образом производительность компьютера многократно. Урезаете кеши - понижаете отзывчивость системы при работе с файламиурезаете память процессов ​- снижаете отзывчивость системы при переключении ​задач
  
-Нужное вам значение,​ скорее всего, стоит подбирать экспериментально ​(к рекомендациям поставить какое-то определенное значение и все будет "​зашибись"​ - стоит относиться как минимум с сомнением).+Нужное вам значение,​ скорее всего, стоит подбирать экспериментально.
 ===== Смотрите также ===== ===== Смотрите также =====
   * [[wiki:​спящий_режим|Спящий режим]]   * [[wiki:​спящий_режим|Спящий режим]]