Linux #Linux #Ubuntu #Терминал #Сервер #Память

Swap в Ubuntu: как проверить, создать или увеличить файл подкачки и настроить zram

Как проверить swap в Ubuntu, создать или увеличить файл подкачки, прописать его в fstab, настроить swappiness и включить zram. Таблица размеров по объёму RAM и поиск OOM в журнале.

24 минуты
Содержание
  1. 1Что такое swap и когда он нужен
  2. 2Как проверить swap
  3. free -h — общая картина
  4. swapon --show и /proc/swaps — что именно подключено
  5. vmstat — используется ли swap прямо сейчас
  6. 3Как создать swap-файл
  7. Шаг 1. Создать файл нужного размера
  8. Шаг 2. Закрыть доступ для всех, кроме root
  9. Шаг 3. Разметить файл как swap
  10. Шаг 4. Включить swap
  11. Шаг 5. Прописать в /etc/fstab
  12. Шаг 6. Проверить
  13. 4Как увеличить существующий /swap.img
  14. 5Как удалить swap
  15. 6swappiness: как часто система уходит в swap
  16. 7zram: сжатый swap в оперативной памяти
  17. Вариант 1: zram-tools
  18. Вариант 2: systemd-zram-generator
  19. Проверка zram
  20. Что выбрать: zram или файл
  21. 8Сколько swap нужно
  22. 9Как понять, что памяти реально не хватает
  23. 10Шпаргалка команд
  24. 11Если не работает
  25. 12Чек-лист
  26. 13Частые вопросы
  27. Нужен ли swap, если памяти много?
  28. Swap-файл медленнее раздела?
  29. Вредит ли swap SSD?
  30. Можно ли использовать zram и swap-файл одновременно?
  31. Почему swap занят, хотя память свободна?
  32. Как очистить swap, не перезагружаясь?
  33. Какой swappiness поставить на сервер?
  34. Как сделать swap в Docker-контейнере или LXC?
  35. 14Что дальше

Swap — это место на диске, куда ядро Linux выгружает редко используемые страницы оперативной памяти, когда её не хватает. Он не заменяет RAM: диск в сотни раз медленнее памяти. Зато swap даёт системе запас прочности — вместо того чтобы убить процесс, ядро спокойно отодвигает в сторону то, что давно не трогали.

Особенно он нужен в трёх случаях: на VPS с 1–2 ГБ памяти, где без подкачки базу данных или сборку проекта может убить OOM killer; на ноутбуках, где включают гибернацию; и на любой машине, где память иногда заканчивается на пиках нагрузки.

Ниже покажу, как проверить, есть ли swap, создать файл подкачки, увеличить стандартный /swap.img, настроить swappiness и включить zram — сжатый swap прямо в оперативной памяти. Все команды — для Ubuntu 22.04 и 24.04, на Debian работает так же.

Что такое swap и когда он нужен

В Linux swap бывает двух видов: раздел (отдельный кусок диска) и файл на обычной файловой системе. Для ядра разницы почти нет, а файл гораздо удобнее: его можно создать, увеличить или удалить без переразметки диска. Поэтому установщик Ubuntu уже много лет создаёт именно файл — /swap.img в корне.

Когда swap полезен:

  • 🖥️ VPS с 1–2 ГБ RAM. Обновление пакетов, composer install, сборка Node.js-проекта или всплеск запросов к MySQL легко съедают всю память. Swap превращает падение в кратковременное замедление.
  • 💤 Гибернация. При «спящем режиме на диск» всё содержимое RAM записывается в swap. Если swap меньше занятой памяти — гибернация не сработает.
  • 📦 Редко нужные данные. Фоновые службы, которые запустились и висят без дела, можно отодвинуть в swap и отдать освободившуюся память под кеш файлов.

Когда swap не спасёт: если программе постоянно не хватает памяти, система будет бесконечно гонять страницы между диском и RAM и превратится в слайд-шоу. Это лечится добавлением памяти или настройкой самой программы, а не огромным файлом подкачки.

Как проверить swap

free -h — общая картина

Терминал
free -h

Ключ -h выводит размеры в удобных единицах (Ги, Ми). Вот вывод на машине, где swap ещё не создан:

Вывод
               total        used        free      shared  buff/cache   available
Mem:           7.8Gi       916Mi       6.6Gi        14Mi       689Mi       6.9Gi
Swap:             0B          0B          0B

Смотрите на две строки:

  • Mem → available — сколько памяти реально доступно программам. Это главная цифра. Колонка free почти всегда маленькая, потому что Linux занимает свободную память под кеш (buff/cache) и отдаёт её по первому требованию.
  • Swap — общий размер подкачки, сколько занято и сколько свободно. Нули означают, что swap отсутствует.

swapon --show и /proc/swaps — что именно подключено

Терминал
swapon --show

Без swap команда ничего не выведет. Если он есть, увидите таблицу:

Вывод
NAME      TYPE  SIZE USED PRIO
/swapfile file 1024M   0B   -2
  • NAME — путь к файлу или разделу (/dev/sda3, /dev/zram0);
  • TYPE — file для файла, partition для раздела;
  • USED — сколько уже занято;
  • PRIO — приоритет. Если swap-устройств несколько, ядро сначала заполняет то, у которого приоритет выше.

То же самое ядро отдаёт через файл /proc/swaps — он есть в любой системе, даже где нет swapon:

Терминал
cat /proc/swaps
Вывод
Filename                Type        Size        Used        Priority
/swapfile                               file        1048572        0        -2

Размеры здесь в килобайтах.

Если нужны сырые цифры, например для скрипта, добавьте --bytes. А в /proc/meminfo можно отдельно посмотреть строки SwapTotal, SwapFree и SwapCached:

Терминал
grep -i swap /proc/meminfo
Вывод
SwapCached:            0 kB
SwapTotal:             0 kB
SwapFree:              0 kB

vmstat — используется ли swap прямо сейчас

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

Терминал
vmstat 1 5

Аргументы значат «обновлять раз в секунду, всего 5 раз». Первая строка — средние значения с момента загрузки, смотреть нужно на следующие.

Пример вывода
procs -----------memory---------- ---swap-- -----io---- -system-- -------cpu-------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st gu
 2  1 812400  48212   2104  96320    0    0   120    40  410  780  5  3 90  2  0  0
 3  2 846112  41980   1980  90112  312 4480  1530  4600 1210 2310 12 18 41 29  0  0
 2  3 901228  40120   1640  88400 1880 6120  3020  6200 1600 2900 10 21 30 39  0  0
 1  2 930640  42260   1720  89100 2040 3360  2900  3400 1450 2600  8 16 38 38  0  0
 2  1 948800  45020   1800  90200  960 1220  1300  1300  980 1700  6 10 66 18  0  0

Главное здесь — колонки блока swap:

  • si (swap in) — сколько килобайт в секунду читается из swap обратно в память;
  • so (swap out) — сколько выгружается из памяти в swap;
  • swpd — сколько swap занято всего.

Нули в si и so — всё хорошо, даже если swpd большой. Постоянные ненулевые значения в обеих колонках вместе с высоким wa (ожидание диска) означают, что памяти реально не хватает.

Как создать swap-файл

Покажу на примере файла /swapfile размером 2 ГБ. Все команды выполняются от root — через sudo или после входа под root.

Шаг 1. Создать файл нужного размера

Терминал
sudo fallocate -l 2G /swapfile

fallocate мгновенно резервирует место под файл, ключ -l задаёт размер: 512M, 2G, 4G. Перед этим проверьте, что на диске хватит места — подробнее в статье про свободное место на диске.

Если fallocate недоступен или файловая система его не поддерживает, используйте dd — он честно заполняет файл нулями, поэтому работает медленнее:

Терминал
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
  • if=/dev/zero — источник нулей;
  • of=/swapfile — куда писать;
  • bs=1M count=2048 — 2048 блоков по 1 МБ, то есть 2 ГБ;
  • status=progress — показывать прогресс.

Шаг 2. Закрыть доступ для всех, кроме root

Терминал
sudo chmod 600 /swapfile
ls -lh /swapfile
Вывод (тестовый файл на 1 ГБ)
-rw------- 1 root root 1.0G Oct 11 19:57 /swapfile

Права 600 — чтение и запись только для владельца. В swap попадает содержимое памяти, в том числе пароли и ключи, поэтому читать его не должен никто, кроме root. Если забыть этот шаг, swapon предупредит:

Вывод
swapon: /swapfile: insecure permissions 0644, 0600 suggested.

Что значат цифры в правах, можно посчитать в калькуляторе chmod.

Шаг 3. Разметить файл как swap

Терминал
sudo mkswap /swapfile
Вывод (тестовый файл на 1 ГБ)
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=44120682-0d0a-4c33-b7e4-c7abb05d9227

mkswap записывает в начало файла служебный заголовок. Без него ядро не примет файл и swapon ответит read swap header failed.

Шаг 4. Включить swap

Терминал
sudo swapon /swapfile
swapon --show
free -h
Вывод (тестовый файл на 1 ГБ)
NAME      TYPE  SIZE USED PRIO
/swapfile file 1024M   0B   -2
               total        used        free      shared  buff/cache   available
Mem:           7.8Gi       691Mi       6.3Gi        14Mi       1.1Gi       7.2Gi
Swap:          1.0Gi          0B       1.0Gi

Swap подключён и работает. Но только до перезагрузки.

Шаг 5. Прописать в /etc/fstab

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

Терминал
sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

tee -a дописывает строку в конец файла (обычный >> через sudo не сработает: перенаправление выполняется ещё от имени вашего пользователя). Поля строки: путь к файлу, точка монтирования none (у swap её нет), тип swap, опции sw и два нуля — без резервного копирования и без проверки диска.

Шаг 6. Проверить

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

Терминал
sudo swapoff /swapfile
sudo swapon -a
swapon --show

swapon -a включает все swap-устройства из /etc/fstab. Если /swapfile снова появился в списке — всё настроено верно.

Как увеличить существующий /swap.img

Ubuntu при установке создаёт /swap.img и сама прописывает его в fstab. Если его размера не хватает, файл нужно отключить, пересоздать большего размера и включить снова. Строку в /etc/fstab менять не придётся — путь тот же.

Терминал
sudo swapoff /swap.img
sudo fallocate -l 4G /swap.img
sudo chmod 600 /swap.img
sudo mkswap /swap.img
sudo swapon /swap.img

mkswap заметит старый заголовок и честно об этом предупредит — это нормально:

Вывод (тот же приём на /swapfile, увеличенном до 2 ГБ)
mkswap: /swapfile: warning: wiping old swap signature.
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=c0b64e0d-857e-4cc8-ace5-352b7e71ab27

Уменьшают swap так же: отключить, удалить, создать новый меньшего размера (fallocate сам не обрезает файл).

Как удалить swap

Терминал
sudo swapoff /swapfile
sudo rm /swapfile

После этого обязательно уберите строку из /etc/fstab — откройте его в sudo nano /etc/fstab и удалите строку с /swapfile (или /swap.img). Если оставить строку на несуществующий файл, при загрузке появится ошибка, а systemd будет ждать устройство.

Отключить все swap-устройства разом можно командой sudo swapoff -a — это действует до перезагрузки.

swappiness: как часто система уходит в swap

Параметр vm.swappiness определяет, насколько охотно ядро выгружает память программ в swap, вместо того чтобы освобождать кеш файлов. Значения — от 0 до 200, в Ubuntu по умолчанию 60.

Терминал
cat /proc/sys/vm/swappiness
Вывод
60
  • Меньше (10–20) — ядро старается держать программы в памяти и сначала сокращает кеш. Хороший выбор для десктопа и для серверов с обычным swap-файлом на диске.
  • 60 — сбалансированное значение по умолчанию.
  • Больше 100 — имеет смысл только с zram: «диск» там — это та же быстрая память.

Изменить значение до перезагрузки:

Терминал
sudo sysctl vm.swappiness=10
Вывод
vm.swappiness = 10

Чтобы настройка сохранилась, запишите её в отдельный файл в /etc/sysctl.d/ и примените:

Терминал
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system

Отдельный файл лучше правки общего /etc/sysctl.conf: его легко найти и удалить. Цифра 99 в имени означает, что он загрузится последним и перекроет другие настройки.

Рядом часто советуют vm.vfs_cache_pressure — насколько активно ядро освобождает кеш каталогов и метаданных файлов. По умолчанию 100; значение 50 заставляет держать этот кеш дольше, что может ускорить работу с большим количеством файлов. Менять его без причины не нужно, а значения больше 100 обычно только вредят.

zram: сжатый swap в оперативной памяти

zram создаёт в RAM блочное устройство со сжатием и использует его как swap. Страницы, которые ядро выгружает, сжимаются примерно в 2–3 раза и остаются в памяти. Работает это на порядки быстрее диска, а места на диске не занимает совсем.

Вариант 1: zram-tools

Самый простой способ в Ubuntu и Debian:

Терминал
sudo apt install zram-tools

Настройки лежат в /etc/default/zramswap. По умолчанию все строки закомментированы; полезные параметры:

/etc/default/zramswap
# Алгоритм сжатия: lz4 быстрее, zstd сжимает сильнее
ALGO=zstd
# Размер zram в процентах от объёма RAM (перекрывает SIZE)
PERCENT=50
# Приоритет выше, чем у swap-файла на диске
PRIORITY=100

Раскомментируйте нужные строки и перезапустите службу:

Терминал
sudo systemctl restart zramswap

Вариант 2: systemd-zram-generator

Альтернатива от разработчиков systemd, которая по умолчанию стоит в Fedora:

Терминал
sudo apt install systemd-zram-generator

Сразу после установки он готов создать /dev/zram0 размером в половину RAM, но не больше 4 ГиБ. Изменить это можно в /etc/systemd/zram-generator.conf:

/etc/systemd/zram-generator.conf
[zram0]
zram-size = ram / 2
compression-algorithm = zstd
swap-priority = 100

Применить без перезагрузки:

Терминал
sudo systemctl daemon-reload
sudo systemctl start systemd-zram-setup@zram0.service

Проверка zram

Терминал
zramctl
swapon --show
Пример вывода
NAME       ALGORITHM DISKSIZE  DATA  COMPR  TOTAL STREAMS MOUNTPOINT
/dev/zram0 zstd          3.8G  412M  98.6M 104.2M       4 [SWAP]

NAME       TYPE       SIZE USED PRIO
/swap.img  file         2G   0B   -2
/dev/zram0 partition  3.8G 412M  100
  • DISKSIZE — максимальный объём несжатых данных;
  • DATA — сколько данных сейчас лежит в zram;
  • COMPR — сколько они занимают после сжатия, TOTAL — вместе со служебными данными. В примере 412 МБ поместились примерно в 104 МБ памяти.

Обратите внимание на приоритет: у zram 100, у файла -2. Поэтому сначала заполняется zram, а диск используется, только когда zram кончился.

Какие алгоритмы поддерживает ваше ядро, видно в файле устройства, текущий — в квадратных скобках:

Терминал
cat /sys/block/zram0/comp_algorithm
Пример вывода
lzo lzo-rle lz4 lz4hc [zstd]

Что выбрать: zram или файл

СитуацияЧто выбрать
Десктоп или ноутбук с 4–16 ГБ, без гибернацииzram, можно вместе с небольшим файлом
VPS с 1–2 ГБ и медленным дискомzram + файл на 1–2 ГБ как запасной
Нужна гибернацияТолько файл или раздел: в zram образ памяти не сохранить
Raspberry Pi и SD-картыzram — бережёт карту от износа
Сервер с большим объёмом RAMНебольшой файл на всякий случай, zram по желанию

С zram имеет смысл поднять swappiness до 100–180: ядру незачем бояться «медленного» swap, который на самом деле живёт в памяти.

Сколько swap нужно

Старое правило «swap в два раза больше RAM» придумано для машин с 64 МБ памяти. Сейчас ориентируются на задачу. Примерные значения:

Объём RAMБез гибернацииС гибернацией
1 ГБ1–2 ГБ2 ГБ
2 ГБ2 ГБ3 ГБ
4 ГБ2–4 ГБ6 ГБ
8 ГБ2–4 ГБ9–10 ГБ
16 ГБ2–4 ГБ17–20 ГБ
32 ГБ2–4 ГБ33–40 ГБ
64 ГБ и больше4 ГБгибернация обычно не нужна

Логика простая. Для гибернации swap должен быть не меньше объёма RAM плюс запас. Без гибернации большому swap нечего хранить: если на машине с 32 ГБ понадобилось больше 4 ГБ подкачки, проблема не в размере swap. Для VPS с 1–2 ГБ swap размером с RAM — разумный минимум.

Как понять, что памяти реально не хватает

Когда памяти не хватает даже со swap, срабатывает OOM killer — механизм ядра, который принудительно завершает самый «тяжёлый» процесс. Обычно это выглядит так: сайт внезапно отдаёт 502, MySQL перезапустился, сборка оборвалась без внятной ошибки.

Следы остаются в журнале ядра:

Терминал
sudo journalctl -k | grep -i "out of memory"

Ключ -k показывает только сообщения ядра. Если система стартовала недавно, то же самое есть в dmesg:

Терминал
sudo dmesg -T | grep -i "out of memory"

-T переводит время в человеческий вид. Найденная строка выглядит примерно так:

Пример вывода
[Sat Oct 11 03:12:44 2026] Out of memory: Killed process 2143 (mysqld) total-vm:1834220kB, anon-rss:612480kB, file-rss:0kB, shmem-rss:0kB, UID:110 pgtables:1640kB oom_score_adj:0

Здесь видно, какой процесс убит (mysqld), его PID и сколько памяти он занимал (anon-rss — около 600 МБ). Если такие записи повторяются — нужно больше памяти или более скромные настройки программы. Подробнее о работе с журналом — в статье про systemd и journalctl.

Признаки нехватки памяти, даже без OOM:

  • 🐢 в vmstat постоянно ненулевые si и so;
  • 📉 в free -h значение available близко к нулю;
  • 💾 swap заполнен почти полностью, и диск постоянно занят.

Кто именно съел память, удобно смотреть в htop или btop с сортировкой по памяти — о них в статье про информацию о системе в терминале.

Шпаргалка команд

ЗадачаКоманда
Сколько памяти и swapfree -h
Какие swap подключеныswapon --show или cat /proc/swaps
Используется ли swap сейчасvmstat 1 5 (колонки si, so)
Создать файл 2 ГБsudo fallocate -l 2G /swapfile
Права и разметкаsudo chmod 600 /swapfile && sudo mkswap /swapfile
Включить / отключитьsudo swapon /swapfile / sudo swapoff /swapfile
Включить всё из fstabsudo swapon -a
Строка для fstab/swapfile none swap sw 0 0
Текущий swappinesscat /proc/sys/vm/swappiness
Поменять до перезагрузкиsudo sysctl vm.swappiness=10
Поменять навсегда/etc/sysctl.d/99-swappiness.conf + sudo sysctl --system
Состояние zramzramctl
Поиск OOMsudo journalctl -k | grep -i "out of memory"

Если не работает

swapon: /swapfile: read swap header failed — файл не размечен. Выполните sudo mkswap /swapfile и повторите.

swapon: /swapfile: insecure permissions 0644, 0600 suggested. — swap включится, но права слишком открытые. Исправьте: sudo chmod 600 /swapfile.

swapon: /swapfile: swapon failed: Invalid argument — файл с «дырами» или файловая система его не поддерживает. Чаще всего это btrfs или файл, созданный fallocate на необычной ФС. Пересоздайте файл через dd или, на btrfs, через btrfs filesystem mkswapfile.

swapon failed: Operation not permitted — обычно это контейнер (LXC, Docker) или VPS на OpenVZ. Там swap управляется хостом, изнутри его не создать. В контейнере Proxmox размер swap задаётся в настройках самого контейнера — подробнее в статье про Proxmox на мини-ПК.

После перезагрузки swap пропал — нет строки в /etc/fstab или в ней опечатка. Проверьте командой sudo swapon -a: если что-то не так, она напишет, что именно.

swapoff долго висит — ядро переносит содержимое swap обратно в RAM. Если свободной памяти мало, дождитесь окончания или прервите Ctrl + C и сначала освободите память.

Чек-лист

Частые вопросы

Нужен ли swap, если памяти много?

Небольшой swap на 2–4 ГБ полезен почти всегда: ядро сможет вытеснить в него давно не используемые данные и отдать память под кеш файлов. А при неожиданном пике нагрузки система замедлится, а не начнёт убивать процессы.

Swap-файл медленнее раздела?

На современных ядрах и файловых системах ext4 и xfs разница незаметна. Ядро заранее запоминает, где на диске лежат блоки файла, и пишет в них напрямую.

Вредит ли swap SSD?

Современные SSD рассчитаны на сотни терабайт записи, а обычный swap пишет немного. Если swap постоянно активен, проблема в нехватке памяти, а не в износе диска. Для SD-карт и дешёвых флешек лучше zram.

Можно ли использовать zram и swap-файл одновременно?

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

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

Ядро однажды выгрузило туда неиспользуемые данные и не возвращает их без необходимости — это экономит работу. Если в vmstat колонки si и so нулевые, беспокоиться не о чем.

Как очистить swap, не перезагружаясь?

Выполните sudo swapoff -a && sudo swapon -a: содержимое вернётся в оперативную память, и swap подключится заново пустым. Делайте это, только если свободной RAM больше, чем занято в swap.

Какой swappiness поставить на сервер?

Для сервера со swap-файлом на диске обычно ставят 10–20. С zram — 100 и выше. Значение 0 не отключает swap полностью, но заставляет ядро избегать его до последнего — это редко бывает полезно.

Как сделать swap в Docker-контейнере или LXC?

Изнутри контейнера — никак: подкачкой управляет ядро хоста. Swap создают на самом хосте, а контейнеру выдают лимит в его настройках.

Что дальше

Swap — часть базовой настройки сервера. После него стоит пройтись по защите Ubuntu Server, а если сервер ещё не установлен — начать с установки Ubuntu Server и ручной разметки диска, где swap можно сразу вынести в отдельный раздел.

Статья помогла?

Комментарии

Пока никто не написал. Будьте первым — вопрос или свой опыт одинаково полезны.

Комментарий появится после проверки. Ссылки и реклама не публикуются.