Swap в Ubuntu: как проверить, создать или увеличить файл подкачки и настроить zram
Как проверить swap в Ubuntu, создать или увеличить файл подкачки, прописать его в fstab, настроить swappiness и включить zram. Таблица размеров по объёму RAM и поиск OOM в журнале.
Содержание
- 1Что такое swap и когда он нужен
- 2Как проверить swap
- free -h — общая картина
- swapon --show и /proc/swaps — что именно подключено
- vmstat — используется ли swap прямо сейчас
- 3Как создать swap-файл
- Шаг 1. Создать файл нужного размера
- Шаг 2. Закрыть доступ для всех, кроме root
- Шаг 3. Разметить файл как swap
- Шаг 4. Включить swap
- Шаг 5. Прописать в /etc/fstab
- Шаг 6. Проверить
- 4Как увеличить существующий /swap.img
- 5Как удалить swap
- 6swappiness: как часто система уходит в swap
- 7zram: сжатый swap в оперативной памяти
- Вариант 1: zram-tools
- Вариант 2: systemd-zram-generator
- Проверка zram
- Что выбрать: zram или файл
- 8Сколько swap нужно
- 9Как понять, что памяти реально не хватает
- 10Шпаргалка команд
- 11Если не работает
- 12Чек-лист
- 13Частые вопросы
- Нужен ли swap, если памяти много?
- Swap-файл медленнее раздела?
- Вредит ли swap SSD?
- Можно ли использовать zram и swap-файл одновременно?
- Почему swap занят, хотя память свободна?
- Как очистить swap, не перезагружаясь?
- Какой swappiness поставить на сервер?
- Как сделать swap в Docker-контейнере или LXC?
- 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/swapsFilename Type Size Used Priority
/swapfile file 1048572 0 -2Размеры здесь в килобайтах.
Если нужны сырые цифры, например для скрипта, добавьте --bytes. А в /proc/meminfo можно отдельно посмотреть строки SwapTotal, SwapFree и SwapCached:
grep -i swap /proc/meminfoSwapCached: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kBvmstat — используется ли 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 /swapfilefallocate мгновенно резервирует место под файл, ключ -l задаёт размер: 512M, 2G, 4G. Перед этим проверьте, что на диске хватит места — подробнее в статье про свободное место на диске.
Если fallocate недоступен или файловая система его не поддерживает, используйте dd — он честно заполняет файл нулями, поэтому работает медленнее:
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progressif=/dev/zero— источник нулей;of=/swapfile— куда писать;bs=1M count=2048— 2048 блоков по 1 МБ, то есть 2 ГБ;status=progress— показывать прогресс.
Шаг 2. Закрыть доступ для всех, кроме root
sudo chmod 600 /swapfile
ls -lh /swapfile-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 /swapfileSetting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=44120682-0d0a-4c33-b7e4-c7abb05d9227mkswap записывает в начало файла служебный заголовок. Без него ядро не примет файл и swapon ответит read swap header failed.
Шаг 4. Включить swap
sudo swapon /swapfile
swapon --show
free -hNAME 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.0GiSwap подключён и работает. Но только до перезагрузки.
Шаг 5. Прописать в /etc/fstab
Чтобы swap включался при загрузке, добавьте строку в /etc/fstab. Сначала сделайте резервную копию — ошибка в этом файле может помешать системе загрузиться:
sudo cp /etc/fstab /etc/fstab.bak
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstabtee -a дописывает строку в конец файла (обычный >> через sudo не сработает: перенаправление выполняется ещё от имени вашего пользователя). Поля строки: путь к файлу, точка монтирования none (у swap её нет), тип swap, опции sw и два нуля — без резервного копирования и без проверки диска.
Шаг 6. Проверить
Не дожидаясь перезагрузки, можно проверить, что запись в fstab правильная:
sudo swapoff /swapfile
sudo swapon -a
swapon --showswapon -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.imgmkswap заметит старый заголовок и честно об этом предупредит — это нормально:
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/swappiness60- Меньше (10–20) — ядро старается держать программы в памяти и сначала сокращает кеш. Хороший выбор для десктопа и для серверов с обычным swap-файлом на диске.
- 60 — сбалансированное значение по умолчанию.
- Больше 100 — имеет смысл только с zram: «диск» там — это та же быстрая память.
Изменить значение до перезагрузки:
sudo sysctl vm.swappiness=10vm.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. По умолчанию все строки закомментированы; полезные параметры:
# Алгоритм сжатия: 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:
[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 --showNAME 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_algorithmlzo 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 с сортировкой по памяти — о них в статье про информацию о системе в терминале.
Шпаргалка команд
| Задача | Команда |
|---|---|
| Сколько памяти и swap | free -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 |
| Включить всё из fstab | sudo swapon -a |
| Строка для fstab | /swapfile none swap sw 0 0 |
| Текущий swappiness | cat /proc/sys/vm/swappiness |
| Поменять до перезагрузки | sudo sysctl vm.swappiness=10 |
| Поменять навсегда | /etc/sysctl.d/99-swappiness.conf + sudo sysctl --system |
| Состояние zram | zramctl |
| Поиск OOM | sudo 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 можно сразу вынести в отдельный раздел.
Если статья пригодилась — отметьте, это помогает выбирать темы
Статья помогла?
Комментарии
Пока никто не написал. Будьте первым — вопрос или свой опыт одинаково полезны.