Добавление файла подкачки (swap)
Как создать файл подкачки на сервере с малым объёмом памяти, как его настроить и когда лучше сделать апгрейд.
На этой странице
Swap (подкачка) — это место на диске, которое Linux использует как запасную память, когда заканчивается оперативная память (ОЗУ). В этом руководстве описано, как создать файл подкачки, настроить его и удалить. Все команды выполняются на сервере в SSH-сессии под root (Подключение к серверу по SSH (Windows, macOS, Linux)). Объём ОЗУ вашего тарифа указан в панели app.blackbox.md: на карточке сервера на странице «Мои серверы», в поле «Конфигурация».
Доступно: владельцу сервера с доступом по SSH как root. Команды одинаковы для всех Linux-систем, доступных при заказе: Ubuntu, Debian, AlmaLinux и CentOS Stream. В AlmaLinux и CentOS Stream добавляется всего один шаг, он отмечен в тексте.
Когда swap помогает
Файл подкачки полезен, если:
- у сервера 1–2 GB ОЗУ;
- память заканчивается лишь время от времени, например при пиках трафика или во время задания по расписанию;
- вы устанавливаете или собираете пакеты (обновления системы,
composer,npm), которым ненадолго нужно много памяти.
Без swap при нехватке памяти ядро Linux принудительно завершает какой-нибудь процесс (OOM killer), обычно самый крупный: базу данных или веб-сервер. Со swap сервер замедляется, но процессы продолжают работать, пока не заполнится и подкачка.
| Тариф | ОЗУ | Диск | Рекомендуемый swap |
|---|---|---|---|
| Basic XS | 1 GB | 20 GB | 1 GB |
| Standard S | 2 GB | 20 GB | 1 GB |
| CPU S | 2 GB | 30 GB | 1 GB |
| Basic S | 2 GB | 50 GB | 2 GB |
На тарифах с 4 GB ОЗУ и больше swap обычно не нужен. Файл на 1 GB можно оставить как запас на случай редких пиков.
Важно Swap не заменяет оперативную память: диск во много раз медленнее ОЗУ. Если сервер постоянно пользуется подкачкой, ему нужен тариф с большим объёмом ОЗУ. Признаки описаны ниже, в разделе «Когда нужен апгрейд».
Проверьте память и текущий swap
free -h
swapon --showПример вывода на сервере без swap:
total used free shared buff/cache available
Mem: 1.9Gi 1.2Gi 118Mi 12Mi 640Mi 560Mi
Swap: 0B 0B 0B- Если в строке
Swap:стоит0B, аswapon --showничего не выводит, подкачки на сервере нет. BLACKBOX не добавляет swap при установке сервера, поэтому на новом сервере обычно так и есть. - Столбец
availableпоказывает, сколько памяти ещё доступно приложениям. - Значение
totalв строкеMem:немного меньше объёма ОЗУ тарифа: часть памяти резервирует система.
Если swapon --show уже показывает файл или раздел, не создавайте ещё один. Как изменить размер существующего swap, описано в частых вопросах в конце статьи.
Проверьте и свободное место на диске. В столбце Avail должно оставаться заметно больше, чем размер создаваемого swap:
df -h /Создайте файл подкачки
Команды создают файл /swapfile размером 2 GB. Для 1 GB укажите 1G вместо 2G.
Зарезервируйте место на диске:
fallocate -l 2G /swapfileОставьте доступ к файлу только для
root:chmod 600 /swapfileПодготовьте файл как область подкачки:
mkswap /swapfileТолько в AlmaLinux и CentOS Stream, где включён SELinux, назначьте файлу метку SELinux, предусмотренную для
/swapfile:restorecon -v /swapfileВключите swap:
swapon /swapfileПроверьте командой
swapon --show. Вывод будет таким, а вfree -hстрокаSwap:перестанет показывать0B:NAME TYPE SIZE USED PRIO /swapfile file 2G 0B -2
Swap работает до следующей перезагрузки. Чтобы он включался автоматически при каждом запуске, добавьте его в /etc/fstab (следующий раздел).
Если fallocate не срабатывает
Если fallocate выдаёт Operation not supported или swapon не принимает файл (it appears to have holes или Invalid argument), создайте файл командой dd. Это дольше, зато dd целиком записывает файл на диск и срабатывает там, где fallocate не помогает. count — размер в МБ: 2048 для 2 GB, 1024 для 1 GB.
rm -f /swapfile
dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progressЗатем повторите шаги 2–6 выше.
Включите swap при каждом запуске
Сделайте копию файла
/etc/fstab:cp /etc/fstab /etc/fstab.bakУбедитесь, что строки для
/swapfileещё нет. Команда не должна ничего вывести:grep swapfile /etc/fstabДобавьте строку в конец файла:
echo '/swapfile none swap sw 0 0' >> /etc/fstabПеречитайте конфигурацию systemd:
systemctl daemon-reloadПроверьте строку без перезагрузки: отключите swap и снова включите его по
/etc/fstab. Если в выводе есть/swapfile, строка записана правильно.swapoff /swapfile swapon -a swapon --show
Если в /etc/fstab что-то пошло не так, восстановите копию до любой перезагрузки:
cp /etc/fstab.bak /etc/fstabВнимание На шаге 3 ставьте два знака
>>. С одним>команда заменит всё содержимое/etc/fstab, и сервер может перестать нормально загружаться. Веб-консоли у клиентов нет, поэтому исправить файл после перезагрузки вы не сможете. Если доступ потерян, напишите нам: Как связаться с поддержкой BLACKBOX.
Настройте swappiness
Параметр vm.swappiness определяет, насколько охотно ядро переносит данные из ОЗУ в swap. Значение по умолчанию обычно 60. При значении 10 ядро как можно дольше держит приложения в ОЗУ и переносит данные в подкачку в основном тогда, когда память почти заполнена.
Посмотрите текущее значение:
cat /proc/sys/vm/swappinessУстановите значение 10 сразу:
sysctl vm.swappiness=10Чтобы настройка сохранилась после перезагрузки, запишите её в новый файл в
/etc/sysctl.d/. Здесь один знак>уместен: файл новый.echo 'vm.swappiness=10' > /etc/sysctl.d/99-swappiness.confПроверьте файл. Должно вывестись
vm.swappiness = 10:sysctl -p /etc/sysctl.d/99-swappiness.conf
Когда нужен апгрейд
Swap выручает при редких пиках. Если памяти не хватает постоянно, решение — больше ОЗУ. Признаки:
в
free -hзначениеusedв строкеSwap:растёт и остаётся высоким, аavailableв строкеMem:близко к нулю;сервер отвечает медленно, хотя процессор не загружен;
в выводе команды ниже столбцы
siиso(данные, прочитанные из swap и записанные в swap, в секунду) больше 0 почти при каждом замере:vmstat 1 5в журнале ядра есть записи о процессах, завершённых из-за нехватки памяти (команда показывает сообщения с последней загрузки):
journalctl -k | grep -i "out of memory"
Что делать:
- Выясните, какой процесс расходует память и можно ли его настроить: Диагностика нагрузки сервера (CPU, RAM, диск, сеть).
- Если приложению действительно нужно больше памяти, перейдите на больший тариф того же семейства кнопкой «Апгрейд» на карточке сервера: Апгрейд сервера: переход на больший тариф.
| Текущий тариф | Следующий тариф в семействе | ОЗУ | Диск |
|---|---|---|---|
| Basic XS | Basic S | 1 → 2 GB | 20 → 50 GB |
| Basic S | Basic M | 2 → 4 GB | 50 → 100 GB |
| Standard S | Standard M | 2 → 4 GB | 20 → 40 GB |
| CPU S | CPU M | 2 → 4 GB | остаётся 30 GB |
Цены всех тарифов — в статье Тарифы VPS: как выбрать. После апгрейда файл подкачки остаётся на сервере: его можно оставить как запас или удалить.
Если на сервере подключена дополнительная услуга «Мониторинг», график «Использование ОЗУ (%)» в блоке «Динамика» на странице «Мониторинг» показывает расход памяти во времени. Swap на этом графике не учитывается: его проверяйте на сервере командой free -h. Подробнее: Страница «Мониторинг».
Swap и место на диске
- Файл подкачки занимает на диске весь свой объём, даже если не используется: 2 GB swap — это на 2 GB меньше места для данных.
- На дисках 20–30 GB (Basic XS, Standard S и семейство CPU) не делайте swap больше 1 GB. В семействах CPU (30 GB) и High-Frequency Compute (50 GB) диск не увеличивается и после апгрейда.
- Исключите
/swapfileиз резервных копий: после перезагрузки его содержимое уже не нужно. - Если диск заполняется, уменьшите или удалите swap и следуйте статье Диск сервера заполнен.
Удалите swap
Проверьте память. Значение
availableв строкеMem:должно быть больше, чемusedв строкеSwap:, иначе данным из подкачки некуда переместиться:free -hОтключите swap. Если в подкачке много данных, команда может выполняться несколько минут:
swapoff /swapfileУдалите строку из
/etc/fstab. Команда сохранит копию файла в/etc/fstab.bak:sed -i.bak '/^\/swapfile /d' /etc/fstabУбедитесь, что строки больше нет (первая команда не должна ничего вывести), и перечитайте конфигурацию:
grep swapfile /etc/fstab systemctl daemon-reloadУдалите файл:
rm /swapfileЕсли вы меняли swappiness, удалите и этот файл. Значение по умолчанию вернётся после следующей перезагрузки:
rm /etc/sysctl.d/99-swappiness.conf
Частые сообщения об ошибках
| Сообщение | Что это значит | Что делать |
|---|---|---|
fallocate: fallocate failed: Operation not supported |
Файловая система не поддерживает fallocate. |
Создайте файл командой dd. |
swapon: /swapfile: skipping - it appears to have holes. или swapon: /swapfile: swapon failed: Invalid argument |
Файл записан на диск не полностью, или файловая система не принимает файл, созданный через fallocate. |
Удалите файл и создайте его командой dd. |
swapon: /swapfile: insecure permissions 0644, 0600 suggested. |
Файл могут читать другие пользователи. | Выполните chmod 600 /swapfile. |
swapon: /swapfile: swapon failed: Device or resource busy |
Swap уже включён. | Проверьте командой swapon --show. Больше ничего делать не нужно. |
No space left on device (при fallocate или dd) |
На диске недостаточно свободного места. | Выберите размер поменьше или освободите место. |
swapoff: /swapfile: swapoff failed: Cannot allocate memory |
Свободной ОЗУ не хватает для данных из подкачки. | Временно остановите крупные приложения и повторите. Или удалите строку из /etc/fstab, перезагрузите сервер и затем удалите файл. |
Частые вопросы
Какой размер swap выбрать? 1 GB на дисках 20–30 GB и 2 GB на остальных серверах с 1–2 GB ОЗУ. Больший swap редко помогает: если серверу нужно больше памяти, выберите тариф с большим объёмом ОЗУ.
Как изменить размер swap?
Отключите swap, удалите файл и создайте его заново нужного размера (в примере — 1 GB). В AlmaLinux и CentOS Stream перед swapon выполните также restorecon -v /swapfile. Строка в /etc/fstab остаётся прежней.
swapoff /swapfile
rm /swapfile
fallocate -l 1G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfileЗамедляет ли swap сервер? Нет, пока он используется изредка. Замедление начинается, когда сервер постоянно переносит данные в подкачку. Тогда нужно больше ОЗУ, а не больше swap.