Linux swap что это

Обновлено: 01.07.2024

Каждая операционная система имеет в своем распоряжении некоторый выделенный объем оперативной памяти, с помощью которого она производит обработку различных программ. Однако этот объем ограничен и не может вместить в себя слишком большое количество данных. В связи с этим у системы появляется потребность в дополнительном резерве памяти, к которому можно было бы обратиться всякий раз, когда исчерпывается оперативная память.

Swapping vs. Paging

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

Рассмотрим основные различия между Swapping и Paging:

Swapping Paging
Процедура копирования памяти всего процесса. Метод выделения памяти.
Возникает тогда, когда память всего процесса переносится на диск. Возникает тогда, когда какая-то часть процесса переносится на диск.
Происходит временное вытеснение данных из основной памяти во вторичную. Непрерывный фрагмент памяти разбивается на несколько отдельных блоков фиксированного размера, называемых фреймами (frames) или страницами (pages).
Может выполняться без какого-либо управления памятью. Управляется менеджером памяти.
Выполняется над неактивными процессами. Выполняется только с участием активных процессов.

Типы памяти подкачки

Как правило, существует два различных типа памяти подкачки:

Чтобы узнать, каким объемом памяти подкачки вы владеете, используйте следующую команду:


Каждая перечисленная строка на вышеприведенном скриншоте (у нас всего 1 строка) обозначает имеющиеся у нас пространства подкачки. Рассмотрим детально пункты вывода:

Filename — указывает на расположение пространства подкачки (мы видим, что наш раздел подкачки находится в /dev/sda5).

Type — указывает, что пространство подкачки является разделом (partition), а не файлом (file).

Size — размер пространства подкачки в килобайтах.

Used — указывает на использованное количество килобайт памяти подкачки.

Priority — определяет, какое пространство подкачки использовать в первую очередь.

Одна из замечательных особенностей подсистемы подкачки Linux заключается в том, что если вы смонтируете два (или более) пространства подкачки (на двух разных устройствах) с одинаковым приоритетом, то Linux будет чередовать активность подкачки между ними, что может значительно повысить производительность системы подкачки.

Примечание: Монтирование в Linux — это подключение диска в основную файловую систему.

Преимущества использования памяти подкачки

Изучая работу памяти подкачки, мы можем легко понять преимущества её использования, основные из которых перечислены ниже:

Память подкачки может легко удерживать те неактивные блоки оперативной памяти, которые задействовались всего один или два раза, после чего к ним больше не было никаких обращений. Освобожденная таким образом оперативная память может быть отдана в работу программам с более высоким приоритетом.

Память подкачки действует как резервная копия для увеличения фактического пространства оперативной памяти.

В процессе гибернации всё содержимое оперативной памяти записывается на диск в память подкачки.

Повышает общую производительность вашей системы.

Раздел подкачки

Добавление раздела подкачки

Чтобы добавить дополнительный раздел подкачки в вашу систему, вам сначала нужно выполнить его подготовку. На первом шаге требуется убедиться, что раздел жесткого диска помечен как swap. На втором — создать файловую систему swap. Чтобы проверить, что раздел помечен как swap, запустите команду:

$ sudo fdisk -l /dev/sda

Примечание: Замените /dev/sda на путь к диску в вашей системе с разделом подкачки на нем.

Вы должны увидеть примерно следующее:


Если раздел не помечен как swap, то вам нужно изменить его, запустив команду fdisk с параметром t . Будьте осторожны при работе с разделами, т.к. информация раздела подкачки будет полностью удалена, поэтому дважды перепроверяйте каждое выполняемое вами изменение.

$ sudo mkswap /dev/sda5

Если при этом не было получено никаких ошибок, то ваш раздел подкачки готов к использованию. Для его активации введите команду:

$ sudo swapon /dev/sda5

Вы можете убедиться, что данный раздел теперь задействован системой, выполнив команду swapon -s . Чтобы автоматически смонтировать раздел подкачки во время загрузки системы, необходимо добавить соответствующую запись в файл /etc/fstab, содержащий список файловых систем и пространств подкачки:

/dev/sda5 swap swap defaults 0 0

/dev/sda5 — путь к разделу подкачки;

swap — означает, что раздел будет смонтирован как раздел подкачки;

swap — тип раздела;

defaults — означает использовать настройки по умолчанию;

0 (последние два параметра) означает, что данные параметры не используются.

Чтобы без перезагрузки проверить, что ваш раздел подкачки монтируется автоматически, вы можете запустить команду swapoff -a (которая отключает все пространства подкачки), а затем swapon -a (которая монтирует все пространства подкачки, перечисленные в файле /etc/fstab), а затем проверить статус вашего раздела подкачки с помощью swapon -s .

Удаление раздела подкачки

Чтобы удалить раздел подкачки, нужно выполнить следующие шаги:

Шаг №1: Отключаем раздел подкачки следующей командой:

$ sudo swappoff /dev/sda5

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

$ sudo swappoff -a

Шаг №2: Поскольку раздел подкачки управляется подсистемой инициализации systemd, то при следующем запуске системы он будет снова активирован. Чтобы навсегда отключить автоматическую активацию обнаруженного раздела подкачки, необходимо найти ответственный за подкачку swap-юнит:

$ sudo systemctl --all --type swap


UNIT (devsda5.swap) — это название swap-юнита, соответствующего разделу подкачки.

LOAD (loaded) — означает, что наш swap-юнит успешно загружен.

ACTIVE (inactive) — обобщенный статус юнита. Может принимать значения:

active — юнит запущен;

inactive — юнит остановлен.

SUB (dead) — более низкоуровневый статус юнита. В зависимости от типа юнита, может принимать значения:

exited — успешно завершил выполнение;

failed — ошибка при выполнении;

dead — не запущен;

DESCRIPTION (/dev/sda5) — указывает на путь к swap-юниту (разделу подкачки).

Шаг №3: Отключаем дальнейшие запуски выбранного юнита с помощью команды mask :

$ sudo systemctl mask dev-sda5.swap

Шаг №4: Перезагружаем систему.

Примечание: Если вы хотите немедленного (без перезагрузки) исполнения команды mask , то достаточно добавить к ней ключ --now , например:

$ sudo systemctl mask dev-sda5.swap --now

Вышеописанные действия отключают использование раздела подкачки системой и не приводят к его физическому удалению. В этом можно убедиться, просмотрев список всех разделов системы с помощью следующей команды:


Или с помощью графической утилиты управления дисками GParted:


Примечание: Если в вашей системе отсутствует GParted, то вы можете установить её с помощью следующей команды:

sudo apt-get install gparted

Для полного удаления раздела подкачки через GParted, необходимо кликнуть по нему ПКМ и выбрать пункт "Удалить" :


Или же воспользоваться следующей командой в терминале:

$ sudo fdisk /dev/sda


В завершении, чтобы в момент старта система знала, что такого раздела больше нет, нужно выполнить следующую команду:

$ sudo update-initramfs -u


Готово! Раздел подкачки удален!

Файл подкачки

Добавление файла подкачки

Чтобы добавить в систему файл подкачки, нужно выполнить следующие шаги:

Шаг №1: Создаем файл, который будет использоваться в качестве файла подкачки:

$ sudo fallocate -l 1G /swapfile

$ sudo dd if=/dev/zero of=/swapfile bs=1024 count=1048576

Часть /swapfile — это имя файла подкачки, а count=1048576 — размер файла подкачки в килобайтах (1048576 КБ ≈ 1.05 ГБ).

Шаг №2: Только root-пользователь должен иметь возможность записывать и читать файл подкачки. Для этого необходимо задать правильный тип разрешений:

$ sudo chmod 600 /swapfile

Шаг №3: Нужно подготовить файл подкачки с помощью команды mkswap так же, как мы это делали в случае с разделом, но на этот раз используем имя файла подкачки:

$ sudo mkswap /swapfile

Шаг №4: И точно так же монтируем файл подкачки с помощью команды swapon :

$ sudo swapon /swapfile

Затем нужно добавить запись в файл /etc/fstab для файла подкачки:

/swapfile swap swap defaults 0 0

Шаг №5: Чтобы убедиться, что мы активировали файл подкачки, используем команду swapon :

$ sudo swapon --show


Или команду free :


$ sudo cat /proc/swaps


Удаление файла подкачки

Если по какой-либо причине вы хотите отключить и удалить файл подкачки, выполните следующие шаги:

Шаг №1: Отключаем подкачку памяти с помощью следующей команды:

$ sudo swapoff -v /swapfile

Шаг №2: Удаляем запись о файле подкачки из файла /etc/fstab:

/swapfile swap swap defaults 0 0

Шаг №3: Удаляем непосредственно сам файл подкачки с помощью команды rm :

$ sudo rm /swapfile

Насколько большим должно быть пространство подкачки?

Можно запустить Linux-систему и без пространства подкачки, система будет замечательно работать, если у вас достаточно большой объем оперативной памяти. Но если она у вас закончится, то в вашей системе может произойти критический сбой, поэтому все же желательно иметь пространство подкачки, тем более что дисковое пространство относительно дешево.

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

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

Для старых настольных компьютеров (имеющих, например, только 128 МБ оперативной памяти) по возможности выделяйте от 1 ГБ пространства и больше.

Настройка частоты использования пространства подкачки

Значение по умолчанию для swappiness равно 60 . Вы можете временно изменить его (до следующей перезагрузки), введя команду:

$ sudo echo 50 > /proc/sys/vm/swappiness

Или, например, чтобы установить значение swappiness равным 10 через sysctl, нужно выполнить следующую команду:

$ sudo sysctl vm.swappiness=10

Если вы хотите перманентно изменить данное значение, то вам необходимо определить параметр vm.swappiness в файле /etc/sysctl.conf.

Оптимальное значение подкачки зависит от рабочей нагрузки вашей системы и того, как используется память. Регулируйте этот параметр небольшими шагами, чтобы найти оптимальное значение.

Заключение

В этой статье мы рассмотрели использование и работу памяти подкачки, а также её многочисленные преимущества. Память подкачки служит резервным вариантом для оперативной памяти, когда у последней не остается свободного места. Однако мы все знаем, что у нас не может быть бесконечного объема оперативной памяти, но у нас должно быть достаточное её количество, чтобы избежать сбоя наших приложений.

Кроме того, есть затраты, связанные с (физическим) добавлением большего объема оперативной памяти, в то время как нет затрат на использование памяти подкачки. Кроме того, не всегда представляется возможным добавить несколько планок оперативной памяти в ваш компьютер. Следовательно, единственный вариант, который у нас остается, — это использовать память подкачки, которая может заставить нашу систему работать эффективнее без каких-либо затрат.

Жажда тюнинга может завести в неведомые дебри. И, пожалуй, едва ли не самая частая неправильная оптимизация — отключение swap-файла. Если прикинуть частоту, с которой эта ошибка встречается, то, наверное, она входит в негласный top-10 (а может и top-5) самых распространенных, самых бесполезных и самых вредных оптимизаций - потому что swap-файл это одна из самых интересных, сложно понимаемых и недооцененных сущностей в подсистеме управления виртуальной памятью.

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

В начале был … вопрос

Когда возникает необходимость в swap-файле? Самый частый ответ — «когда не хватает памяти». И, естественно, это ответ неправильный почти полностью. Правильный ответ - необходимость в использовании swap-файла возникает тогда, когда система не может удержать в памяти необходимый кэш и грязные страницы. А чтобы понять, что это значит, нам надо сделать маленький экскурс внутрь ядра операционной системы.

Вся память, которой оперирует система, разбита на страницы. Каждый процесс в системе имеет свое «плоское» адресное пространство. Для каждого процесса система поддерживает карту страниц — какая страница адресного пространства процесса (страница виртуальной памяти) отображена в какую страницу физической памяти - если вообще отображена, разумеется.

И когда процесс пытается получить доступ к какой-то странице своей памяти, MMU (memory management unit) процессора фактически производит обращение к той странице физической оперативной памяти, куда страница отображена.

А если страница не отображена ни в какую физическую страницу, то возникает page fault — исключительная ситуация «страница не найдена». При обработке этой ситуации система (ядро) проверяет, имеет ли процесс право получить доступ к своей логической странице: если не имеет (например эта страница заразервирована ядром или находится «за хвостом кучи» процесса) - то процессу придет сигнал SEGFAULT — и процесс умрет.

А если имеет — то ядро выполнит все нужные действия, чтобы восстановить правильное содержимое страницы, и предъявит её процессу - после чего операция успешно выполнится.

Какие группы страниц памяти живут в системе?

Свободная — страница физической памяти, которая не используется для хранения данных и может быть свободно использована в любой момент времени

Используемая — страница, хранящая данные, не принадлежащие кэшу

Чистая страница кэша (clean cache page)- страница, в которой хранятся закэшированные данные файла, которые не менялись.

Грязная страница кэща (dirty cache page) — страница, в которой хранятся данные файла, которые были изменены (данные в кэше поменяли но на диск изменения не сохранили)

Недоступная — процесс не имеет права на доступ к этой странице. Если процесс к ней обращается "неподобающим образом" то получает SEGFAULT

Доступная, сопоставленная физической странице, не принадлежащей кэшу. Процесс может работать с этой страницей

Доступная, сопоставленная физической странице кэша, в которую загружены данные файла. Процесс может работать с этой страницей.

Доступная, не сопоставленная физической странице, но сопоставленная региону какого-либо файла. Прежде чем процесс сможет работать с этой страницей, система должна выделить физическую страницу, отдать ее в кэш, загрузить в нее данные из файла — и после этого процесс сможет с ней работать (потому, что она превратится в предыдущую разновидность)

И сейчас, когда мы более-менее определились с видами страниц, мы переходим к самой интересной части

Работа процесса

Чтобы понять как все эти механизмы связаны и работают, давайте рассмотрим запуск нового процесса. Мы запускаем новый процесс, и система загружает исполняемый файл. Как это происходит?

Система открывает бинарный файл с программой и … Нет, она не читает его. Она отображает файл в адресное пространство процесса — то есть создает записи (например)

Ну да, там всё сложнее — но нам сейчас главное понять идею.

С точки зрения системы, эти логические страницы принадлежат процессу, отображены на какой-то файл файловой системы и не сопоставлены никакой физической странице. И теперь, управление отдается процессу — например вызывается инструкция с какой-то страницы или читаются или записываются данные в страницу.

MMU обнаруживает ошибку — странице процесса не сопоставлена никакая физическая страница - ошибка, page fault! Ядро получает эту ошибку, смотрит на статус страницы:

процессу разрешен доступ

физической странице не сопоставлена (и это логично, иначе бы page fault не возник)

но сопоставлена сегменту файла

указанный фрагмент файла в кэше не обнаружен

В указанной ситуации, ядро берет свободную страницу, объявляет её страницей кэша и загружает в неё данные из файла с диска. Теперь это чистая страница кэша - clean page. Затем ядро добавляет ссылку «этой странице процесса сопоставлена эта физическая страница, принадлежащая кэшу и взятая из указанного места файла». Управление возвращается процессу, а проблемная операция завершается успешно. Ну а если это была операция модификации данных (и модификация допустима), то после записи данных страница помечается как измененная — и становится грязной страницей кэша - dirty page с точки зрения ядра.

Если же в кэше системы уже есть физическая страница, в которой лежат данные из файла в неизменном виде (найдена чистая страница кэша), то страница процесса просто начинает ссылаться на обнаруженную страницу кэша.

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

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

Второе "примечание": механизмы работы с отображаемыми в память файлами намного сложнее и если за них браться, эта статья превратилась бы в многостраничный трактат. Но нам сейчас надо понять основные линии поведения системы в стрессовых условиях нехватки RAM

Откуда (и когда) начинается использование swap-файла?

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

Свободных страниц у нас нет — всё ушло на кэш и данные.

Теперь мы открываем еще одну вкладку, что при этом случается? Чтобы найти память, система вынуждена освободить часть чистых страниц кэша и отдать их под данные приложения — ведь данные которые там лежали, можно снова загрузить с диска (это ведь "чистые" страницы!).

Но в этих страницах был ИСПОЛЬЗУЕМЫЙ код — иначе бы они не подтянулись в кэш.

А это значит, что как только (и скорей всего через не самый долгий промежуток времени) программа пойдет в код, который был выгружен из памяти, она получит page fault — и система снова прочтет код из файла библиотеки с диска. В новую пустую страницу. Но чтобы её получить, надо сбросить другую чистую страницу кэша! И система входит в трэшинг - она постоянно вынуждена освобождать и снова погружать код, раз за разом, из одного файла за другим.

То есть фактически, в системе уже есть swap-файл, из которого постоянно ведется чтение — и это разделяемые библиотеки. Но система не может использовать его эффективно, поскольку он ограничен и фактически неуправляем - и скатывается в трэшинг

А если бы у нас был настоящий swap-файл?

На основе учета частоты обращения к различным страницам, система скорей всего не освободила бы страницу с кодом, а поместила в swap данные наиболее давно не использовавшихся вкладок. И вместо постоянного чтения с диска, у нас случились бы одна запись и одно чтение — причем именно в момент обращения к выгруженной в swap вкладке.

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

Для этого, пока поднятая из swap-файла страница не поменялась, место, которое страница занимала в swap-файле, будет по возможности за ней удерживаться и не считается «освобожденным» пока страница не изменится. Это означает, что в случае, если у вас большой swap-файл, редко читаемые и не изменившиеся данные могут «уехать в swap» и многократно доставаться оттуда по мере надобности — то есть в нормальной ситуации, swap работает по принципу «одна запись, много чтений«.

А если swap-файл маленький, то начинается «веселье» с постоянным записью-чтением в swap-файл.

Таким образом, отключение / отсутствие swap-файла, равно как и его малый размер, отрицательно влияет на производительность в условиях начала нехватки памяти, не позволяя системе выгружать наименее используемые страницы и заставляя делать лишние записи там, где запись, на самом деле, не нужна — ведь вместо того, чтобы удержать код, к которому мы обращаемся часто, система вынуждена сохранять в памяти данные, к которым мы не обращаемся - потому что их негде больше сохранить.

Какие выводы можно сделать из всего вышеописанного?

Кэш (page cache) — это не только кэш данных! Кэш - это очень существенный компонент в схеме организации виртуальной памяти - и теперь мы понимаем неправильность вопроса «почему система ушла в свал а не освободила кэш». Ведь ответ очень прост - этот кэш на самом деле не просто кэш, а код. И если код используется чаще, чем данные - то в данном случае более важно сохранить в памяти код (сохранить кэш) чем удерживать в памяти данные!

Поэтому не надо бояться наличия swap-файла — если статистика не покажет необходимости - система не полезет в свап.

Swap-файл может считаться используемым даже если все данные из него уже подняты обратно в память.

Малый размер swap-файла вреден — он не позволяет системе работать эффективно, поскольку увеличивает объем непродуктивного I/O

Резюме?

Это прекрасно, когда объем оперативной памяти достаточно велик, чтобы вместить и весь необходимый кэш, и данные. Но если у вас бюджетная система с 8 … 16ГБ оперативной памяти (не говоря уж об ультрабюджетных ноутбуках с распаянными и нерасширяемыми 4GB), то swap достаточного объема (не менее 1 x ) это "то, что доктор прописал".

И достаточный размер swap-файла на быстром накопителе (кто сказал NVMe?) на бюджетном ноутбуке может очень хорошо увеличить производительность системы, особенно если вы любитель держать много открытых вкладок, документов, рисунков в графическом редакторе и т.д.

Не мешайте системе работать. Нет нужды бояться swap-файла. Если он не нужен — он не будет использован. И то, что вы видите, что он якобы использован - на самом деле совсем не значит, что он использован. Просто нам показали картинку «без подробностей».

Оперативная память имеет очень важное значение для нормальной работы компьютера. В ней размещаются все программы и их данные во время работоспособности устройства. Когда память переполняется, программы могут выдавать различные ошибки или даже прекращать работу. Время отклика системы увеличивается настолько, что работать с ней становиться невозможным.

Самый простой способ увеличить количество оперативной памяти и защитить систему от переполнения памяти, это добавить раздел swap в Ubuntu. В этой статье будет рассмотрено как выполняется настройка swap в Ubuntu 20.04. Будет рассмотрен вариант с добавлением swap как на время работы устройства, так и на постоянное использование.

Обратите внимание

Хотя использование раздела подкачки на жестком диске HDD это привычное явление, применение такого метода для SSD может вызвать проблемы. SSD имеет ограниченное количество перезаписей одного сектора, а область swap постоянно перезаписывается, это очень сильно снизит срок службы вашего диска. Поэтому использование swap пространства на SSD строго не рекомендуется.

Что такое Swap?

Swap (так же известна как пространство подкачки) - это область на жестком диске, которая используется для временного хранения данных из оперативной памяти, для которых там больше нет места. Это позволяет увеличить объем информации, которую система может хранить в рабочей памяти. Пространство подкачки используется только тогда, когда память уже полностью занята, и туда будут помещаться только данные, которые давно использовались.

Работа с информацией будет выполняться намного медленнее, чем в оперативной памяти, но операционная система будет продолжать работать и использовать swap только для старых данных. В целом, это может быть отличной защитой от переполнения оперативной памяти. Пространство подкачки можно настроить двумя способами, добавив раздел подкачки для Ubuntu на диске или создать файл подкачки.

Проверка Swap

Перед тем как перейти к настройке необходимо проверить не подключены ли разделы подкачки к системе. Для этого необходимо выполнить команду:

Если команда вернет строчку с названием swapfile, это означает что swap в системе уже присутствует:

qJQ2DxsvBYQAAAAASUVORK5CYII=

Если ничего не будет выведено, значит в системе swap не настроен:

A3cY5FQKomDiAAAAAElFTkSuQmCC

Также можно убедиться, что swap активирован или не активирован в системе с помощью утилиты free которая помимо отображения объёма оперативной памяти также отображает информацию об разделе swap:

Строка со swap отображает значение 2,0 GB. Это означает что swap включен и будет использоваться 2 ГБ жёсткого диска, когда память будет переполнена:

wPh8SYp013UQwAAAABJRU5ErkJggg==

Если значения в разделе swap отображаются по нулям это значит, что раздел swap не подключен:

UBzAeNQ8JV+GsqUS+iVd7P8BIqvvLekDC5MAAAAASUVORK5CYII=

Настройка файла подкачки в Ubuntu 20.04

На серверах часто используется файл подкачки, такой способ применяется, потому что не всегда есть возможность менять разметку диска для выделения раздела swap.

1. Проверка места на диске

Необходимо убедится, что на жёстком диске есть достаточно свободного места. Самый простой способ узнать количество свободного места в терминале – воспользоваться утилитой df:

+XxBVBSAALDlaAAAAAElFTkSuQmCC

В данном случае есть достаточно места для размещения и увеличения пространства подкачки. Размер swap в Ubuntu 20.04 зависит от потребностей. Обычно рекомендуют использовать объем в два раза больше, чем реальный размер оперативной памяти. Но как правило больше 4 Гб использовать не нужно. Если планируется использовать гибернацию на персональном компьютере, то нужно использовать объем, равный объему ОЗУ.

2. Создание файла подкачки

Самый быстрый способ создать swap файл в Ubuntu 20.04 – это использовать утилиту fallocate, она создает файл нужного размера мгновенно. Поскольку в качестве примера используется машина с 8 Гб оперативной памяти, необходимо добавить раздел подкачки на 3 Гб. Для этого необходимо выполнить команду:

sudo fallocate -l 3G /swapfile

SiSMholxvNzbOT14P8BylQiMlDAoy4AAAAASUVORK5CYII=

Далее, необходимо убедиться действительно ли зарезервировано нужное количество памяти. Для проверки необходимо выполнить команду:

fBG1QUdPg9+33f4fgtonZcmABAAAAAElFTkSuQmCC

Активация swap

Когда файл готов, необходимо превратить его в файл swap. Сначала нужно заблокировать доступ к нему всем кроме суперпользователя. Для этого необходимо выполнить:

sudo chmod 600 /swapfile

Теперь только пользователь root может читать и изменить данный файл:

8HGmNHSI0QOR0AAAAASUVORK5CYII=

Далее необходимо создать файловую систему swap командой:

sudo mkswap /swapfile

wHzZy75GQ2mTwAAAABJRU5ErkJggg==

Когда файл будет размещен и промаркирован необходимо включить файл подкачки чтобы начать его использовать:

sudo swapon /swapfile

v9x1DKSlc9uMgAAAABJRU5ErkJggg==

После этого можно убедиться, что swap включен, выполнив команду:

ob4+lbrbVzVelggXPXzf8PzYN09Od4zasAAAAASUVORK5CYII=

Так же наличие swap можно проверить при помощи утилиты free, выполнив команду:

x+0OpXwVbrkTQAAAABJRU5ErkJggg==

Файл подкачки был успешно создан и активирован. Теперь памяти доступно больше и система не зависнет при нехватке оперативной памяти. Но данный способ будет работать только до перезагрузки устройства.

Постоянный файл подкачки

Как уже было сказано ранее, данный swap будет работать только до перезагрузки сервера или компьютера. Чтобы настройка swap в Ubuntu 20.04 сохранялась после перезагрузки нужно отредактировать файл /etc/fstab. Можно вручную добавить строку в файл, но также можно использовать следующую команду:

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

wUGkEFAhJkf4QAAAABJRU5ErkJggg==

Настройка раздела подкачки в Ubuntu 20.04

Настройка swap в Ubuntu 20.04 в виде раздела аналогична тем же методам, которые применяются для создания swap в виде файла, отличие только в том, что вместо файла используется раздел. Предположим, необходимо использовать раздел /dev/sda2. Сначала необходимо создать swap из обычного раздела:

sudo mkswap /dev/sda2

Далее активировать раздел подкачки:

sudo swapon /dev/sda2

И проверить все ли прошло правильно:

Если да, то в списке подключенных разделов отобразится нужный. Последним шагом остаётся добавить строку в /etc/fstab для автоматической активации после перезагрузки:

echo '/dev/sda2 none swap sw 0 0' | sudo tee -a /etc/fstab

Дополнительные настройки

Можно контролировать интенсивность использования пространства подкачки в Ubuntu 20.04 с помощью параметра ядра swappiness:

wMf6qQE4DRUfgAAAABJRU5ErkJggg==

По умолчанию установлено значение 60. Если это значение ближе к 100, система будет пытаться поместить в подкачку больше данных и сберечь память, при значениях близких к нулю, ядро не переносит данные на диск, если в этом нет крайней необходимости. Этот вариант может сделать систему быстрее, особенно актуально для домашних компьютеров.

Чтобы установить значение 10 необходимо выполнить команду:

sudo sysctl vm.swappiness=10

lP1App8xjPQAAAAASUVORK5CYII=

А для сохранения этой настройки после перезагрузки:

sudo sysctl -w vm.swappiness=10

w879gLuUtXoKgAAAABJRU5ErkJggg==

Другой параметр, который влияет на количество используемой памяти -vfs_cache_pressure. Он указывает системе какое время нужно хранить открытые файлы в кэше оперативной памяти. Значение 100 заставляет систему удалять такие файлы очень быстро, 0 - держать их в памяти как можно дольше. Проверить текущее состояние можно при помощи команды:

2IgWfMNN7QwAAAABJRU5ErkJggg==

Чтобы хранить файлы дольше, можно установить значение в 50 используя команду:

sudo sysctl -w vm.vfs_cache_pressure=50

B7v8POBFbt7CZog4AAAAASUVORK5CYII=

Выводы

С помощью данной инструкции можно на время решить проблему с пространством подкачки если серверу недостаточно памяти, или поможет предотвратить компьютер от зависания. Настройка swap в Ubuntu 20.04 выполняется очень просто. Если у вас остались вопросы, спрашивайте в комментариях!

Нет похожих записей

Оцените статью:

(29 оценок, среднее: 4,66 из 5)

Об авторе

40 комментариев

Всегда использовал раздел подкачки, но после прочтения статьи возник вопрос, если создать постоянный файл подкачки, то можно будет с этим файлом ипользовать гибернацию или нужны дополнительные настройки?

swapon: /swapfile: не удалось выполнить swapon: Недопустимый аргумент

swapon без двоеточия

Такое случается если раздел или файл отформатирован не правильно или там находится что-то лишнее.

ADMIN:
А что-ж Вы не упомянули про параметр --priority влияющей на паритет обращения к разделу и файлу swap ??

Если партишн, на котором создается файл отформатирован в btrfs - то свап, созданный таким образом, работать не будет.

А тот своп раздел что мы создаем при установке он что не рабочий получается?

Рабочий, только не все создают раздел подкачки при установке.

а что лучше файл или раздел?

Раздел в определенной степени быстрее, так как не зависит от файловой системы, но этого заметно не будет. Файл гибче, поскольку вы всегда можете изменить размер.

А подскажи пожалуйста, как изменить размер swap-файла? У меня Ubuntu 17.04 x64. Просто работаю с тяжелыми программами и они всю память сжирают за считанные минуты, поэтому есть необходимость не много увеличить swap-файл.

Файл гибче, поскольку вы всегда можете изменить размер. Как изменить размер swap-файла? Ubuntu 16.04 x64.

Ну как сказать технология так называемой виртуальной памяти (которая кстати и в Windows NT используется) не заменит по быстродействию
настоящий RAМ . Тут ещё подбирать нужно кооф. swap т.к для тяжёлых приложений он нужен больше для сервера вообще отдельная песня.

ADMIN: В большинстве дистрибутивов установщик Аnaconda не начнёт установку или разметку HDD пока Вы не создадите swap раздел.
и я считаю это правильно чем позднее после установки уменьшать разделы на уже работающей системе . (:imho)

OS: Mint Linux 18 Cinnamon
Данная команда не сохраняет параметр после перезагрузки!
$ sudo sysctl -w vm.swappiness=10

Помогает только добавление параметра в файл /etc/sysctl.conf

Почитал статью, подумал подумал и решил отказаться от свап-раздела в угоду zram. Весь SSD отдал под корень с хомяком с ФС btrfs, затем sudo apt install zram-config и усё..

Вы советуете изменить значение интенсивности использования пространства подкачки с 60 на 10,
(этот вариант может сделать систему быстрее),
и параметр в vfs_cache_pressure со 100 на 50. Но не рассказали что дает изменение со 100 на 50.
Ответьте пожалуйста.

Вопрос интересный. Везде рекомендуют это значение наоборот увеличить если ОЗУ больше 2ГБ, но тут 1 ГБ. Вот типичное описание:
"В псевдофайле vfs_cache_pressure хранится значение - уровень выделяемой памяти под кэш. Значение по умолчанию: 100. Увеличение этого параметра заставляет ядро активнее выгружать неиспользуемые страницы памяти из кеша, т.е. количество выделяемой оперативной памяти под кеш будет расти медленнее, что в свою очередь снизит вероятность того, что будет задействован раздел swap. При уменьшении этого параметра ядро, наоборот, будет дольше держать страницы памяти в кеше, в том числе и в swap'е. Это имеет смысл при небольшом количестве ОЗУ, например, если у нас 512 МБ памяти, то параметр vfs_cache_pressure можно выставить равным 50. Это позволит сократить количество дисковых операций в swap разделе, так удаление неиспользуемых страниц будет происходить реже. Дальнейшее уменьшение этого параметра может привести к нехватке памяти.
Если вы хотите ускорить работу системы и у вас достаточно оперативки (2 Гб и более), то измените значение системы, так: swappiness = 10 , vfs_cache_pressure = 1000 (по умолчанию 100)"

SWAP – один из механизмов виртуальной памяти, при котором отдельные фрагменты памяти (обычно неактивные) перемещаются из ОЗУ во вторичное хранилище (отдельный раздел или файл), освобождая ОЗУ для загрузки других активных фрагментов памяти.

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

Дополнительно SWAP используется при организации режима сна (hibernation или suspend to disk). При этом в 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. Однако нужно учитывать, что у режима сна при шифровании SWAP могут возникнуть сложности.

Размер

В Интернете можно найти множество рекомендаций по определению размера SWAP, однако универсального ответа не существует.

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

Для машин с незначительным объемом памяти (меньше 2 Гб) рекомендуется создавать SWAP размером от 1,5 до 2-х размеров оперативной памяти. И стоит попробовать изменять vm.swappiness, но лучше поискать возможность увеличить объем оперативной памяти.
Для машин с объемом памяти 3-4 Гб нужно решить, будет ли использоваться suspend to disk. Если да, то нужно создавать SWAP размером на 10-15% больше размера оперативной памяти. Если же suspend to disk использоваться не будет, то можно создать SWAP небольшого размера (размером от половины до 1 объема оперативной памяти). Можно не создавать SWAP при установке системы, а при необходимости добавить его позже как файл.
На компьютерах с объемами оперативной памяти более 6Gb имеет смысл создать SWAP размером в половину от объема оперативной памяти. При этом, если вы хотите использовать гибернацию, следует оценить загрузку оперативной памяти в процессе работы и задать величину SWAP, исходя из этого. К примеру, если объем оперативной памяти составляет 16 ГБ, а рабочая загрузка не превышает в среднем 5-6 ГБ, величины SWAP-раздела в 8 ГБ вам хватит для гибернации. При таком подходе следует помнить, что при использовании ресурсоёмких программ (рендеринг изображения, компиляция огромных проектов и т.п.) оперативная память может заполняться полностью, а SWAP - использоваться в качестве подкачки. В таких ситуациях размер SWAP нужно выбирать индивидуально.

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

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

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

Подключим раздел как SWAP:

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

Сделаем автомонтирование SWAP-раздела при запуске системы. Узнаем UUID раздела:

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

SWAP с динамически изменяемым размером

Если вы не хотите думать об объеме SWAP, имеет смысл воспользоваться утилитой swapspace (динамический менеджер подкачки). Эта утилита работает в фоновом режиме и динамически управляет подкачкой. При необходимости swapspace автоматически создаёт дополнительные файлы подкачки требуемого размера. Неиспользуемые файлы подкачки удаляются и не занимают место.
Однако, если вы работаете с секретными документами, не забудьте указать swapspace создавать SWAP-файлы на зашифрованном диске или внутри шифрованного контейнера 1) .

Hibernate (suspend to disk, гибернация)

О настройке режима гибернации можно прочитать здесь.

Параметр vm.swappiness

Скорректировать значение, применяемое при загрузке системы, можно, указав в файле /etc/sysctl.conf значение vm.swappiness. Пример:

Мгновенно применить эту настройку можно с помощью следующей команды:

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

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

Читайте также: