Swap, или файл подкачки, это место на диске, куда Linux временно переносит данные из оперативной памяти, когда её не хватает. На сервере с небольшим объёмом памяти swap спасает от внезапных падений программ во время пиковой нагрузки. В этой статье мы разберём, как устроена подкачка, создадим файл подкачки, сделаем так, чтобы он подключался после перезагрузки, и настроим, насколько охотно система будет им пользоваться. Все команды мы проверили на тестовом сервере с Debian 12.
Как Linux распоряжается памятью и зачем нужен swap
Чтобы понять, когда swap действительно помогает, нужно сначала посмотреть, на что сервер тратит оперативную память. Часть её занимают сами программы, например база данных, веб-сервер или контейнеры Docker. Эту память программы получают в своё распоряжение и заполняют собственными данными, поэтому система не может просто взять и освободить её без потерь. Остальную память Linux не оставляет пустой, а заполняет кэшем файлов. Когда программа читает файл с диска, его содержимое остаётся в памяти, и следующее чтение того же файла происходит мгновенно. Кэш полезен, но его можно в любой момент сбросить, ведь оригинал файла по-прежнему лежит на диске. Именно поэтому команда free часто показывает, что свободной памяти почти нет, хотя в столбце available при этом остаётся много места. Под кэш занята память, которую система вернёт программам по первому требованию.
Трудности начинаются, когда программам становится тесно даже после того, как кэш сброшен. Предположим, что на сервере с 1 ГБ памяти работают сайт и база данных, а вы запускаете обновление системы или сборку проекта, которой на несколько минут нужно ещё 300 МБ. Если свободной памяти нет и забрать её неоткуда, ядро Linux вынуждено выбрать один из процессов и принудительно завершить его. Этим занимается механизм OOM killer (от английского out of memory). Чаще всего под удар попадает самый крупный процесс, то есть та самая база данных, и сайт перестаёт работать посреди ночи без видимой причины.
Swap даёт ядру другой выход. Вместо того чтобы завершать процесс, система переносит на диск те страницы памяти, к которым программы давно не обращались, например код редко используемой функции или данные фоновой службы, которая просыпается раз в час. Освободившееся место получает программа, которой память нужна прямо сейчас. Если позже понадобятся перенесённые данные, ядро прочитает их с диска обратно. Однако диск работает во много раз медленнее оперативной памяти даже на быстрых NVMe, поэтому swap не заменяет память, а служит страховкой. Если сервер постоянно активно читает и пишет подкачку, программы начинают заметно тормозить. На нашем тестовом сервере с 1 ГБ памяти нейросеть, которой памяти не хватало, работала со swap, но печатала одно слово за несколько минут. Такое поведение означает, что серверу нужно больше памяти, и swap здесь уже не поможет.
Остаётся вопрос, как система решает, что выгоднее, сбросить кэш файлов или отправить в подкачку данные программ. Этот баланс задаёт параметр swappiness. Он принимает значения от 0 до 200, и в Debian 12 по умолчанию равен 60. Чем меньше значение, тем дольше ядро будет держать данные программ в памяти и тем охотнее будет жертвовать кэшем. Для сервера обычно разумно уменьшить swappiness до 10. Тогда подкачка включается в основном тогда, когда память действительно на исходе, и не трогает работающие программы в спокойное время.
Что понадобится
- Сервер с Ubuntu или Debian. На тестовом сервере с нашим образом Debian 12 подкачки по умолчанию не было, поэтому её стоит создать самостоятельно.
- Подключение по SSH, например через Termius. Команды выполняются от имени
root. - Свободное место на диске под файл подкачки. Проверить его можно командой
df -h /.
1. Проверьте, есть ли swap
free -h
swapon --showЕсли в строке Swap у команды free -h стоят нули, а swapon --show ничего не выводит, подкачки на сервере нет.
2. Создайте файл подкачки
Сначала решите, какого размера будет файл. Мы советуем ориентироваться так.
- Память до 2 ГБ. Swap размером с объём памяти, то есть 1–2 ГБ.
- От 2 до 8 ГБ. Достаточно 2 ГБ.
- Больше 8 ГБ. Хватит 2–4 ГБ, большая подкачка такому серверу обычно не нужна.
Для примера создадим файл на 2 ГБ. Выполните команды по очереди.
# Выделяем на диске файл нужного размера
fallocate -l 2G /swapfile
# Доступ к файлу только у root
chmod 600 /swapfile
# Размечаем файл как область подкачки
mkswap /swapfile
# Включаем подкачку
swapon /swapfileПроверьте результат ещё раз командами swapon --show и free -h. В строке Swap должен появиться объём 2.0Gi.

До создания swap был пустым, после него система видит 2 ГБ подкачки
Если fallocate не сработал
На некоторых файловых системах fallocate выдаёт ошибку. Тогда создайте файл командой dd, она медленнее, но работает везде. Вместо первой команды выполните dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress, где 2048 это размер в мегабайтах, а остальные шаги оставьте прежними.
3. Подключайте swap после перезагрузки
Команда swapon включает подкачку только до перезагрузки. Чтобы файл подключался автоматически, добавьте его в файл /etc/fstab.
echo "/swapfile none swap sw 0 0" >> /etc/fstabПроверить, что запись правильная, можно без перезагрузки. Команда ниже отключит подкачку и включит её заново уже по записям из /etc/fstab.
swapoff -a && swapon -a && swapon --showЕсли в выводе снова есть /swapfile, всё настроено верно.
Знак >> важен
В команде с echo должно быть два знака >>. Они добавляют строку в конец файла. Один знак > полностью перезапишет /etc/fstab, и сервер может не загрузиться. Перед правкой можно сделать копию файла командой cp /etc/fstab /root/fstab.bak.
4. Настройте swappiness
Посмотрите текущее значение и уменьшите его до 10. Настройка в отдельном файле в каталоге /etc/sysctl.d/ сохранится после перезагрузки.
# Текущее значение, по умолчанию 60
cat /proc/sys/vm/swappiness
# Сохраняем новое значение и сразу применяем его
echo "vm.swappiness=10" > /etc/sysctl.d/99-swappiness.conf
sysctl -p /etc/sysctl.d/99-swappiness.conf
Swap прописан в fstab, swappiness уменьшен до 10
Как изменить размер swap
Увеличить файл можно на месте. Отключите подкачку, задайте новый размер, разметьте файл заново и включите его.
swapoff /swapfile
fallocate -l 4G /swapfile
mkswap /swapfile
swapon /swapfileУменьшить файл таким способом не получится, fallocate только добавляет место. Чтобы сделать swap меньше, удалите старый файл и создайте новый нужного размера.
swapoff /swapfile
rm /swapfile
fallocate -l 1G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfileЗапись в /etc/fstab менять не нужно, имя файла осталось прежним.
Как отключить и удалить swap
# Отключаем подкачку
swapoff /swapfile
# Удаляем файл
rm /swapfile
# Убираем строку из fstab
sed -i '\|^/swapfile |d' /etc/fstabПеред удалением убедитесь командой free -h, что в памяти хватит места для данных, которые сейчас лежат в подкачке. Иначе swapoff будет долго переносить их обратно и может не справиться из-за нехватки памяти.
Частые вопросы
swapon: /swapfile: insecure permissions 0644, 0600 suggested
Файл подкачки доступен для чтения другим пользователям, а в нём могут оказаться пароли и другие данные из памяти программ. Ограничьте доступ.
chmod 600 /swapfileswapon: /swapfile: swapon failed: Device or resource busy
Этот файл уже подключён как подкачка. Проверьте командой swapon --show. Если нужно что-то в нём поменять, сначала выполните swapoff /swapfile.
Swap есть, но сервер всё равно тормозит
Посмотрите, сколько подкачки занято, командой free -h. Если в swap постоянно лежат сотни мегабайт и система продолжает активно с ним работать, программам не хватает оперативной памяти. Swap здесь уже не поможет, нужно уменьшить потребление памяти или перейти на тариф с большим её объёмом. Как перейти на тариф мощнее, рассказано в частых вопросах, данные и IP-адрес при этом сохраняются.
Нужен ли swap, если памяти много
Небольшой swap полезен и на сервере с большим объёмом памяти. Он позволяет системе вынести из памяти данные, которые давно не используются, и оставить больше места под кэш файлов. Кроме того, он даёт запас на случай утечки памяти в какой-нибудь программе, и у вас будет время заметить проблему до того, как сработает OOM killer.
Наши ресурсы
Telegram-канал: https://t.me/f3cloud_news
Официальный сайт: https://f3cloud.com