Операционная система делит свою оперативную память на так называемые страницы (кусочки), и иногда возникают ситуации, когда часть данных из оперативной памяти необходимо освободить. Сделать это можно с помощью специального механизма, который позволяет перенести часть данных из оперативной памяти на HDD или SSD накопитель, а точнее на специально сконфигурированный для этого раздел на диске. Этот процесс называется swapping (своппинг).
В большинстве случаев своппинг используется, когда оперативная память переполнена и для дальнейшей работы операционной системы необходимо ее освободить.
В данной статье рассмотрим, как создать специальный раздел на диске (SWAP (своп), или виртуальное пространство подкачки, или файл подкачки), как проверить его работу, а также как сделать так, чтобы после перезагрузки данный раздел подключался автоматически.
Все действия выполняются пользователем root, либо привилегированным пользователем с помощью sudo.
Рекомендуем использовать объём для SWAP максимум в два раза больше, чем реальный размер оперативной памяти. На практике обычно достаточно 50-100% от размера ОЗУ. Если для работы вам необходимо увеличить объем ОЗУ на сервере — лучше увеличить его, так как SWAP работает намного медленнее, чем ОЗУ (а в случаях с дисками SSD и NVMe ещё и сокращает время их жизни), и использование SWAP вместо ОЗУ приведёт к потерям скорости.
Linux (Ubuntu, Debian, CentOS, AlmaLinux)
Данная инструкция подходит для операционных систем Ubuntu 18.04, Ubuntu 20.04, Ubuntu 22.04, Debian 10, Debian 11, CentOS 7, AlmaLinux 8, AlmaLinux 9, и других.
Добавление SWAP
В целом для всех операционных систем семейства Linux механизм добавления SWAP одинаковый.
Проверяем, подключен ли SWAP:
# swapon --show
Если вывод пустой, то SWAP-а в системе нет. Если вывод выглядит примерно так:
NAME TYPE SIZE USED PRIO /swapfile file 512M 0B -2
Значит, SWAP уже подключен. В нашем случае его размер равен 512 МБ.
Также проверим наличие SWAP с помощью команды free
:
# free -h
Вывод будет примерно таким:
total used free shared buff/cache available Mem: 1.9Gi 69Mi 1.7Gi 2.0Mi 128Mi 1.7Gi Swap: 512Mi 0B 512Mi
Здесь мы видим, что SWAP есть и его размер 512МБ. В случае его отсутствия строки Swap не будет.
Перед созданием SWAP обязательно нужно проверить, есть ли свободное место на диске:
# df -h
Смотрим вывод и видим, что на диске свободно 36 ГБ. Если на диске мало места, перед добавлением SWAP необходимо очистить его либо увеличить объём диска. Для работоспособности системы необходимо минимум 5% свободного дискового пространства (либо больше, в зависимости от особенностей ваших проектов). После добавления SWAP раздел подкачки будет занят, имейте это ввиду при расчётах оставшегося свободного места на диске.
Filesystem Size Used Avail Use% Mounted on udev 966M 0 966M 0% /dev tmpfs 199M 596K 199M 1% /run /dev/vda2 40G 1.9G 36G 5% / tmpfs 994M 0 994M 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock tmpfs 994M 0 994M 0% /sys/fs/cgroup tmpfs 199M 0 199M 0% /run/user/0
Сначала рассмотрим случай, когда SWAP в системе нет. Создаём файл для SWAP размером 2 ГБ:
# dd if=/dev/zero of=/swapfile bs=1M count=2048
Вывод будет таким:
2048+0 records in 2048+0 records out 2147483648 bytes (2.1 GB, 2.0 GiB) copied, 5.2341 s, 410 MB/s
Данная команда создаст файл /swapfile
размером 2048 мегабайт. Нужно больше или меньше — можно увеличить или уменьшить значение count
.
Чтобы никто не мог читать или править файл, кроме владельца — root, устанавливаем права на него:
# chmod 600 /swapfile
Проверим, что права выставлены верно:
# ls -la /swapfile
Вывод должен быть таким (rw для пользователя, владелец и группа root, размер 2 ГБ):
-rw------- 1 root root 2147483648 Dec 18 19:05 /swapfile
Форматируем файл под swap:
# mkswap /swapfile
Вывод будет примерно таким:
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes) no label, UUID=38e12a0a-58ea-4bc5-b0f9-58a29a1dd8db
Включаем SWAP:
# swapon /swapfile
После проверим, что SWAP включен и его размер соответствует тому, что мы указывали:
# free -m total used free shared buff/cache available Mem: 1977 113 65 2 1799 1691 Swap: 2047 0 2047 # swapon --show NAME TYPE SIZE USED PRIO /swapfile file 2G 0B -2
Готово. Мы добавили SWAP в систему.
Автоматическое подключение SWAP после перезагрузки
Далее сделаем так, чтобы SWAP подключался автоматически после перезагрузки системы. Чтобы SWAP включался при загрузке, нужно добавить его в /etc/fstab
.
Добавляем в конец файла /etc/fstab
строку:
/swapfile none swap sw 0 0
Конец файла /etc/fstab
будет выглядеть примерно так:
<file system> <mount point> <type> <options> <dump> <pass> /dev/vda2 / ext4 errors=remount-ro 0 1 /swapfile none swap sw 0 0
После этого можно перезагрузить VDS и проверить наличие SWAP командой free -m
.
Должно быть что-либо вида:
Swap: 2048 0 2048
Изменение SWAP
Рассмотрим случай, когда в системе уже есть SWAP, и нам нужно его изменить.
# swapon --show /swapfile file 256M 0B -2
Видим, что у нас в /swapfile
256 МБ, а нам нужно 2 ГБ. Как уже писали ранее, проверяем, что на накопителе есть свободное место с помощью команды df -h
.
Далее выключаем имеющийся файл подкачки /swapfile:
# swapoff /swapfile
Проверяем с помощью swapon --show
. Важно, что при отключении SWAP не должен использоваться системой. В противном случае можно отключить некоторые сервисы, которые потребляют ОЗУ, и после увеличения SWAP включить их обратно.
Меняем размер файла подкачки уже знакомой командой:
# dd if=/dev/zero of=/swapfile bs=1M count=2048
Далее инструкция такая же, как и при добавлении SWAP, только в нашем случае /swapfile уже имеет правильные права. Просто проверим, что это так:
# ls -la /swapfile -rw------- 1 root root 2147483648 Dec 18 20:24 /swapfile
Помечаем /swapfile как файл подкачки:
# mkswap /swapfile
И активируем SWAP:
# swapon /swapfile
Проверяем, что SWAP увеличился, а также проверяем файл /etc/fstab
:
# swapon --show # cat /etc/fstab
FreeBSD
Добавление SWAP
В ОС FreeBSD 12 и FreeBSD 13 SWAP добавляется иначе.
Для начала необходимо проверить, есть ли в системе SWAP. Это можно сделать с помощью команд:
# swapinfo
(если вывод пустой, SWAP-а нет)
или
# top
(если в выводе не будет строки SWAP, то файла подкачки нет).
Обязательно проверяем наличие свободного дискового пространства:
# df -H
Если места недостаточно, либо если после добавления SWAP его останется меньше 5% — нужно очистить место на сервере либо увеличить размер дискового пространства.
Создаём файл для SWAP:
# dd if=/dev/zero of=/swapfile bs=1m count=2048
Вывод будет примерно таким:
2048+0 records in 2048+0 records out 2147483648 bytes transferred in 5.780501 secs (371504758 bytes/sec)
Данная команда создаст файл /swapfile размером 2048 мегабайт. Нужно больше — можно увеличить count
.
Правим права на него:
# chmod 600 /swapfile
Это чтобы никто не мог писать и читать файл, кроме владельца — root.
Проверим, что права и владелец файла подкачки правильные:
# ls -la /swapfile
Вывод будет таким:
-rw------- 1 root wheel 2147483648 Dec 18 21:36 /swapfile
Пользователь root, группа wheel (для FreeBSD это нормально), права rw для пользователя.
Включаем SWAP:
# swapon -aq
И проверяем:
# swapinfo -k
Вывод будет примерно таким:
Device 1K-blocks Used Avail Capacity /dev/md42 2097152 0 2097152 0%
Также можно проверить с помощью команды top, в выводе будет строка с SWAP:
Swap: 2048M Total, 2048M Free
Автоматическое подключение SWAP после перезагрузки
Осталось сделать так, чтобы SWAP подключался после перезагрузки системы. Для этого в конец файла /etc/fstab
нужно добавить строку:
md42 none swap sw,file=/root/swap1 0 0
После этого можно перезагрузить VDS и проверить наличие SWAP командой top
. Вывод должен быть вида:
Swap: 2048M Total, 2048M Free
Готово. Мы добавили SWAP в FreeBSD.