Как добавить файл подкачки на VPS с Ubuntu и настроить swappiness

Валерий Волков

Время прочтения 13 минут

На Ubuntu VPS swap можно добавить обычным файлом без отдельного дискового раздела.

Базовая последовательность выглядит так:

    sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

Чтобы swap подключался после перезагрузки, добавьте в /etc/fstab: /swapfile none swap sw 0 0

Текущее состояние памяти и swap удобно проверять через:

    free -h
swapon --show
vmstat 1

Для VPS можно дополнительно уменьшить vm.swappiness, например до 10, если хочется, чтобы система менее охотно выгружала страницы памяти в swap: sudo sysctl vm.swappiness=10

Постоянное значение лучше сохранить в /etc/sysctl.d/99-swappiness.conf.

При изменении размера swap сначала проверяйте, хватает ли доступной RAM для swapoff. Если swap активно используется, отключать его на почти заполненной памяти опасно.

Небольшое использование swap само по себе нормально. А вот постоянно заполненный swap, низкий available и регулярные ненулевые si/so в vmstat уже говорят о том, что серверу, скорее всего, не хватает RAM.

Что такое swap и когда он действительно нужен

Добро пожаловать!

Сегодня на повестке дня тема попроще, но при этом она одна из тех, которые часто начинают изучать уже после первого неприятного сюрприза на VPS.

Например, сервер вроде бы работает нормально, памяти хватает, приложение отвечает — а потом приходит кратковременный пик нагрузки, какой-нибудь процесс резко съедает остаток RAM, и Linux начинает убивать процессы (как правило самые важные) через OOM Killer.

Вот в таких ситуациях и вспоминают про swap.

Swap — это область на диске, которую Linux может использовать как дополнительное пространство для памяти, когда оперативной памяти становится мало.

Но здесь сразу важно снять одно распространенное заблуждение: swap — это не «бесплатное продолжение RAM».

Он может помочь серверу пережить нехватку памяти, но по очевидным причинам диск не является таким же быстрым, как оперативная память - поэтому это именно помощь, а не "бесплатное" расширение RAM.

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

Как swap связан с RAM

Оперативная память — это основное рабочее пространство для процессов.

Именно туда попадают:

  • Код программ;
  • Данные приложений;
  • Кэш;
  • Страницы памяти процессов;
  • Временные структуры ядра.

Пока RAM хватает, всё работает быстро.

Проблемы начинаются, когда свободной памяти становится мало.

Linux может выгружать менее активно используемые страницы памяти в swap и освобождать RAM для более актуальных задач.

Например, если процесс давно не обращался к какой-то части памяти, ядро может временно перенести ее в swap.

Когда эти данные снова понадобятся, Linux прочитает их обратно.

И вот тут становится заметна разница между RAM и диском.

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

Из-за этого swap лучше воспринимать не как полноценную замену памяти, а как страховочную площадку.

Он особенно полезен, если сервер обычно укладывается в доступную RAM, но иногда получает короткие пики нагрузки.

Когда swap помогает, а когда пора увеличивать память

Swap особенно полезен в нескольких сценариях.

Например, на VPS с 1–2 ГБ RAM может работать небольшое приложение, Nginx, база данных и несколько фоновых процессов.

Большую часть времени всё укладывается в память.

Но иногда происходит:

  • Обновление пакетов;
  • Сборка приложения;
  • Импорт большого файла;
  • Пиковый запрос;
  • Кратковременный рост кэша;
  • Запуск дополнительного процесса.

Без swap сервер может быстро упереться в лимит RAM.

После этого ядру придется освобождать память другими способами, вплоть до завершения процессов через OOM Killer.

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

Но если сервер постоянно использует большую часть swap, ситуация уже другая.

Допустим:

    RAM: 2 GB
Swap: 4 GB
RAM used: 1.9 GB
Swap used: 3.2 GB

И так происходит почти постоянно.

Это не значит, что мы волшебным образом превратили VPS с 2 ГБ памяти в VPS с 6 ГБ.

Скорее серверу уже объективно не хватает RAM.

Особенно плохой признак — постоянная активная запись данных в swap и чтение обратно при общем замедлении работы бизнес-приложений.

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

Поэтому правило довольно простое:

  • Редкое или небольшое использование swap — нормально;
  • Swap во время кратковременного пика — полезно;
  • Постоянно забитый swap — повод разбираться с потреблением памяти;
  • Постоянный активный swapping — уже сигнал, что лучше увеличивать RAM или снижать нагрузку.

То есть swap помогает сгладить нехватку памяти, но не отменяет физические ограничения VPS.

Проверяем память и текущий swap

Прежде чем создавать новый swap-файл, сначала посмотрим, что уже есть на сервере.

Иногда провайдер добавляет swap автоматически. В других случаях его нет вообще.

Заодно оценим текущее состояние оперативной памяти.

Смотрим RAM через free

Самая простая команда: free -h

Опция -h выводит значения в удобном для человека формате: мегабайты и гигабайты вместо количества байтов.

Например:

Здесь особенно полезны несколько колонок.

  • Total — общий объем RAM.
  • Used — сколько памяти сейчас используется.
  • Free — полностью свободная память.

Linux старается не держать RAM пустой без причины и активно использует ее под кэш.

Поэтому для оценки реального запаса обычно полезнее смотреть на: available

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

Например, если:

    free = 200 MB
available = 1.1 GB

Это еще не означает, что сервер почти остался без памяти.

Часть RAM просто занята полезным кэшем, который при необходимости можно освободить.

Проверяем активный swap

Теперь посмотрим, подключен ли swap вообще: swapon --show

Если команда ничего не выводит, активного swap сейчас нет.

Можно перепроверить через: free -h

Если видим: Swap: 0B  0B  0B, значит swap действительно отсутствует.

Если же swap уже создан, swapon --show может показать примерно:

Здесь:

Поле Что означает 
NAME Путь к swap-файлу или разделу 
TYPE Тип swap 
SIZE Общий размер 
USED Сколько сейчас занято 
PRIO Приоритет при наличии нескольких swap-областей 

Можно дополнительно посмотреть данные напрямую через: cat /proc/swaps

Но для повседневной проверки swapon --show обычно удобнее.

Еще одна полезная команда: vmstat 1

Она будет обновлять статистику каждую секунду.

Нас позже особенно заинтересуют колонки: si и so

Где:

  • si — данные, которые читаются из swap в RAM;
  • so — данные, которые выгружаются из RAM в swap.

Если там почти всегда нули — сервер не занимается активным swapping прямо сейчас.

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

Теперь мы знаем, сколько памяти есть на VPS и существует ли swap уже сейчас.

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

Создаем swap-файл

Выделяем место под swap

Допустим, хотим создать swap объемом 2 ГБ.

Проще всего использовать: sudo fallocate -l 2G /swapfile

Команда создаст файл: /swapfile размером 2 ГБ.

Проверим: ls -lh /swapfile

Ожидаем примерно: -rw-r--r-- 1 root root 2.0G ... /swapfile

Если fallocate по какой-то причине не подходит для используемой файловой системы, можно создать файл через dd:

    sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress

Результат будет тот же: на диске появится файл размером около 2 ГБ.

Перед созданием swap стоит убедиться, что на разделе вообще достаточно свободного места: df -h /

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

Настраиваем права

Теперь самое важное — ограничить доступ к файлу.

Выполним: sudo chmod 600 /swapfile

Проверим: ls -lh /swapfile

Теперь права должны выглядеть примерно так: -rw------- 1 root root 2.0G ... /swapfile

Почему здесь нужен именно 600?

Swap может содержать страницы памяти процессов. А в памяти потенциально находятся чувствительные данные: токены, пароли, содержимое запросов и другие значения.

Поэтому обычные пользователи не должны иметь возможность читать этот файл.

Права: 600 означают:

  • Владелец может читать и записывать;
  • Остальные пользователи не получают доступа.

Для swap-файла это нормальная и ожидаемая настройка.

Форматируем и подключаем swap

Сам по себе большой файл еще не является swap.

Сначала нужно пометить его как swap-область: sudo mkswap /swapfile

После этого получим сообщение примерно такого вида: Setting up swapspace version 1, size = 2 GiB

Теперь подключаем: sudo swapon /swapfile

Проверим: swapon --show

Ожидаем:

Также проверим общую память: free -h

Теперь в строке Swap должен появиться наш объем:

Swap:          2.0Gi          0 И       2.0Gdi

Если USED сейчас равен нулю, это совершенно нормально.

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

Делаем swap постоянным

На этом swap уже работает, но пока есть одна проблема.

Команда: sudo swapon /swapfile подключает его только для текущего запуска системы.

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

Чтобы этого не произошло, добавим его в /etc/fstab.

Добавляем swap в /etc/fstab

Файл: /etc/fstab содержит информацию о файловых системах и других ресурсах, которые Linux должен подключать при загрузке.

Перед редактированием полезно сделать резервную копию: sudo cp /etc/fstab /etc/fstab.bak

Теперь откроем файл: sudo nano /etc/fstab

И добавим в конец: /swapfile none swap sw 0 0

Разберем поля:

Значение Что означает 
/swapfile путь к нашему файлу 
none точка монтирования для swap не нужна 
swap тип ресурса 
sw стандартные параметры swap 
0 0 для swap здесь не нужны dump и fsck 

Сохраняем файл.

Важно внимательно проверить строку перед перезагрузкой. 

Проверяем конфигурацию после перезагрузки

Сначала убедимся, что swap работает прямо сейчас: swapon --show

Затем можно перезагрузить VPS: sudo reboot

После повторного подключения проверяем: swapon --show и free -h

Если /swapfile снова отображается как активный, значит запись в /etc/fstab сработала и swap подключается автоматически.

Дополнительно можно проверить строку: grep swap /etc/fstab

Ожидаем: /swapfile none swap sw 0 0

Теперь swap больше не зависит от ручного swapon после каждого reboot.

Настраиваем swappiness

Swap уже создан, подключен и переживает перезагрузку VPS.

Теперь осталось решить, насколько охотно Linux вообще должен им пользоваться.

За это отвечает параметр: vm.swappiness

И здесь тоже есть популярное заблуждение.

swappiness — это не «процент заполнения RAM, после которого включается swap».

То есть значение: 10 не означает «начать использовать swap, когда осталось 10% памяти».

Параметр работает иначе.

Что означает параметр vm.swappiness

vm.swappiness влияет на то, насколько активно ядро Linux предпочитает выгружать неактивные страницы памяти в swap вместо того, чтобы удерживать их в RAM.

Посмотреть текущее значение можно так: cat /proc/sys/vm/swappiness или sysctl vm.swappiness

Например: vm.swappiness = 60

Чем выше значение, тем охотнее система может использовать swap.

Чем ниже — тем дольше ядро старается удерживать данные в оперативной памяти.

Для обычного VPS часто выбирают более умеренное значение, например: 10 или: 20

Но здесь нет одного универсально правильного числа.

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

С другой стороны, ставить 0 тоже не всегда разумно.

Это не «полностью отключить swap». Скорее система просто будет крайне неохотно его использовать.

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

Меняем значение временно

Попробуем изменить swappiness без перезагрузки: sudo sysctl vm.swappiness=10

Проверим: sysctl vm.swappiness

Ожидаем: vm.swappiness = 10

Изменение применяется сразу.

Но только до следующей перезагрузки.

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

Сохраняем настройку постоянно

Чтобы swappiness сохранялся после reboot, создадим отдельный sysctl-файл: sudo nano /etc/sysctl.d/99-swappiness.conf

Добавим: vm.swappiness=10

Сохраняем файл.

Применить настройку без перезагрузки можно так: sudo sysctl --system

После этого снова проверим: sysctl vm.swappiness

Должно остаться: vm.swappiness = 10

После следующей перезагрузки система тоже загрузит это значение автоматически.

Теперь swap не только существует, но и настроено поведение ядра при работе с ним.

Остается еще один практический вопрос: сколько swap вообще нужно выделять.

Как выбрать размер swap

Универсальной формулы здесь нет.

Старое правило вроде: swap должен быть в два раза больше RAM для современных VPS слишком грубое.

Размер зависит от того, сколько памяти на сервере, какая нагрузка и зачем swap вообще создается.

Несколько практических ориентиров

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

RAM на VPS Разумный стартовый swap 
1 ГБ 1–2 ГБ 
2 ГБ 1–2 ГБ 
4 ГБ 1–4 ГБ 
8 ГБ 1–4 ГБ 
16 ГБ и больше зависит от нагрузки 

Если сервер небольшой и периодически ловит кратковременные пики памяти, swap размером 1–2 ГБ часто уже дает полезную страховку.

Если же у VPS:

  • RAM = 2 ГБ
  • Swap = 8 ГБ

И при этом  большая часть этих 8 ГБ регулярно занята, проблема уже не в неправильном размере swap.

Скорее всего, серверу просто не хватает оперативной памяти.

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

И еще один отдельный сценарий — гибернация.

На обычном VPS она почти неактуальна, поэтому подбирать swap размером не меньше RAM ради hibernation здесь обычно не требуется.

В контексте сервера swap — это в первую очередь защита от кратковременных пиков и дополнительный запас памяти, а не полноценная замена RAM.

Увеличиваем или уменьшаем swap

Размер swap не обязательно выбирать один раз и навсегда.

Если позже окажется, что 1 ГБ мало, а 4 ГБ избыточно, swap-файл можно пересоздать с другим размером.

Но здесь есть важный момент: нельзя просто удалить активный swap-файл и создать новый.

Сначала swap нужно корректно отключить, а перед этим убедиться, что системе хватит оперативной памяти.

Проверяем, хватит ли RAM для swapoff

Команда: sudo swapoff /swapfile перемещает используемые страницы из swap обратно в RAM.

И если оперативной памяти в этот момент недостаточно, можно получить зависание, сильное торможение или OOM.

Поэтому сначала смотрим: free -h

Особенно нас интересуют:

available

Swap used

Например, если swap использует 1.5 GiB, а доступной RAM осталось всего 400 MiB, отключать swap прямо сейчас плохая идея.

Лучше сначала:

  • Остановить тяжелые процессы;
  • Дождаться снижения нагрузки;
  • Временно увеличить RAM VPS, если провайдер это позволяет;
  • Либо создать дополнительный swap и только потом менять основной.

Если же swap почти не используется и свободной памяти достаточно, можно продолжать.

Отключаем swap и меняем размер файла

Допустим, хотим увеличить swap с 2 до 4 ГБ.

Сначала отключаем текущий: sudo swapoff /swapfile

Проверяем: swapon --show

Если /swapfile исчез из списка, он больше не активен.

Теперь удалим старый файл: sudo rm /swapfile

И создадим новый: sudo fallocate -l 4G /swapfile

Для уменьшения логика та же.

Например, если хотим 1 ГБ: sudo fallocate -l 1G /swapfile

После создания обязательно возвращаем безопасные права: sudo chmod 600 /swapfile

Проверим: ls -lh /swapfile

Форматируем и подключаем его заново

Новый файл снова нужно превратить в swap-область: sudo mkswap /swapfile

Затем подключить: sudo swapon /swapfile

Проверяем swapon --show и free -h

Если путь остался прежним: /swapfile, то строку в /etc/fstab менять не нужно.

Она по-прежнему будет работать: /swapfile none swap sw 0 0

Но после изменения размера полезно еще раз убедиться, что запись действительно есть: grep swap /etc/fstab

И только потом считать изменение завершенным.

Проверяем, помогает ли swap серверу

Сам факт наличия swap еще не говорит, что сервер теперь чувствует себя хорошо.

После настройки стоит некоторое время наблюдать за памятью и смотреть, как именно система использует этот запас.

Смотрим использование RAM и swap

Начнем с привычной команды: free -h

Например:

220 МБ использованного swap сами по себе не означают проблему.

Linux может выгрузить давно неиспользуемые страницы и не возвращать их обратно только потому, что RAM позже снова освободилась.

Поэтому важнее смотреть не только на Swap used, а на активность обмена.

Для этого: vmstat 1

Нас интересуют колонки:

  • si
  • so

Где:

  • si — страницы, возвращаемые из swap в RAM;
  • so — страницы, отправляемые из RAM в swap.

Если сервер большую часть времени показывает:

  • si = 0
  • so = 0

а swap немного занят — это обычно не страшно.

Можно также посмотреть активный swap: swapon --show

Когда активный swapping уже говорит о нехватке памяти

Насторожиться стоит, когда появляются сразу несколько признаков:

  • Available RAM постоянно очень мало;
  • Swap стабильно заполнен;
  • Si и so регулярно ненулевые;
  • Приложения начинают отвечать медленнее;
  • Растет load average;
  • Появляются сообщения OOM.

Проверить OOM можно так: sudo journalctl -k | grep -i oom или dmesg | grep -i oom

Если система постоянно перемещает данные туда-сюда между RAM и swap, возникает явление, которое называют thrashing.

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

И вот здесь увеличение swap еще сильнее не всегда спасает.

Если проблема постоянная, лучше:

  • Добавить RAM;
  • Уменьшить число worker-процессов;
  • Ограничить тяжелые сервисы;
  • Найти процесс с утечкой памяти;
  • Оптимизировать приложение или базу данных.

То есть swap хорош как страховка и буфер.

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

Заключение

Swap на Ubuntu VPS — это полезная страховка от кратковременной нехватки памяти, но не способ превратить маленький сервер в большой.

Мы создали swap-файл, выставили безопасные права, подключили его через swapon, добавили в /etc/fstab и настроили vm.swappiness. Отдельно разобрали, как менять размер swap без риска и как отличить нормальное использование от ситуации, когда сервер уже постоянно упирается в память.

Главное правило здесь простое: не смотреть только на цифру Swap used.

Если swap немного занят, но si и so почти всегда равны нулю, это само по себе не проблема. А вот постоянный обмен между RAM и swap, низкий available и тормоза уже говорят о том, что серверу, скорее всего, не хватает оперативной памяти.

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

FAQ

Можно ли вообще работать без swap?

Да.

Если на VPS достаточно RAM и нагрузка стабильная, сервер может нормально работать без swap.

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

Почему swap уже используется, хотя свободная RAM есть?

Это нормально.

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

Сам по себе ненулевой Swap used не означает проблему.

Что лучше: swap-файл или отдельный swap-раздел?

Для обычного VPS swap-файл обычно удобнее.

Его проще:

  • Создать;
  • Увеличить;
  • Уменьшить;
  • Удалить;
  • Перенести.

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

Можно ли поставить vm.swappiness=0?

Можно, но это не отключает swap полностью.

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

Для обычного VPS часто выбирают что-то вроде 10–20, а затем смотрят на реальную нагрузку.

Нужно ли делать swap в два раза больше RAM?

Нет, это не универсальное правило.

Для современных VPS размер лучше выбирать по нагрузке.

Например, серверу с 2 ГБ RAM часто достаточно 1–2 ГБ swap, а машине с 16 ГБ RAM совершенно не обязательно создавать еще 32 ГБ.

Что будет, если выполнить swapoff, когда RAM почти закончилась?

Система попытается вернуть используемые страницы из swap обратно в оперативную память.

Если RAM не хватает, сервер может начать сильно тормозить, зависнуть или столкнуться с OOM.

Поэтому перед swapoff обязательно проверяйте free -h и оценивайте, хватает ли available RAM.

Можно ли хранить swap на SSD или NVMe?

Да, и на VPS это как раз обычный сценарий.

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

Как понять, что swap действительно помогает?

Помимо визуальных эффектов - отсутствие падений, событий OOM, можно посмотреть на реальные метрики. Смотрите не только на общий объем занятого swap, но и на: vmstat 1

Если si и so обычно равны нулю, а swap иногда немного занят, это нормально.

Если значения регулярно растут, RAM почти всегда занята, а приложения тормозят, swap уже не столько помогает, сколько маскирует нехватку памяти.

Список источников

  1. Ubuntu Server Documentation — Swap
  2. Linux Kernel Documentation — Swappiness
  3. man7.org — swapon(8)
  4. man7.org — fstab(5)

Подпишитесь на нашу рассылку и получайте статьи и новости

    Ознакомьтесь с другими нашими материалами