# Swap - когда RAM кончается _Процессы и ресурсы · LinuxLab Knowledge Base_ **TL;DR:** Swap - место на диске, куда ядро вытесняет редко используемые страницы памяти, когда RAM нужнее. Раздел или файл. Управляется `vm.swappiness` (0-100). ## Что это Когда RAM кончается, у ядра есть выбор: 1. Выкинуть **clean** страницы page cache (можно перечитать с диска) 2. **Записать** грязные anonymous-страницы (heap процесса) на диск и освободить RAM - это **swap-out** 3. Если ни то ни другое не дало места → [oom-killer](/kb/oom-killer.md) Swap не делает систему быстрее. Он делает её **возможной** в условиях «RAM кончилась, но работа должна продолжаться». ## Swap partition vs swap file Раньше - отдельный раздел. Сейчас на современных дистро - обычно файл: ```bash # Создать swap-файл 4 GB sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile # права обязательно жёсткие sudo mkswap /swapfile sudo swapon /swapfile # Постоянно - в /etc/fstab echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab ``` Раздел: ```bash sudo mkswap /dev/sdb2 sudo swapon /dev/sdb2 # fstab: UUID=... none swap sw 0 0 ``` ## Просмотр ```bash swapon # активные swap-устройства/файлы cat /proc/swaps # то же из ядра free -h # колонки used/free/total для swap vmstat 1 # si/so = swap-in/out в KB/s cat /proc/meminfo | grep -i swap ``` Формат `swapon`: ``` NAME TYPE SIZE USED PRIO /swapfile file 4G 300M -2 /dev/sdb2 partition 8G 1.2G -3 ``` PRIO - приоритет; чем выше число, тем раньше используется. Несколько swap'ов с одинаковым PRIO работают как RAID-0. ## vm.swappiness ```bash cat /proc/sys/vm/swappiness # default 60 (на ноуте) или 30 (на сервере) ``` - **0** - почти не свопить anonymous-страницы; жди пока кончится - **60** - баланс (default desktop) - **100** - свопь агрессивно На прод-серверах БД часто ставят **1-10** - чтобы heap БД не уходил в swap (БД своим bufferpool управляет лучше ядра). ```bash echo 'vm.swappiness = 10' | sudo tee /etc/sysctl.d/99-swappiness.conf sudo sysctl --system ``` ## Когда swap полезен - **Burst-память при импорте** - раз в неделю прилетает 10GB job, RAM 8GB, но job медленный и редкий → пусть свопится - **Hibernate (suspend-to-disk)** - нужен swap >= размер RAM - **Безопасность от OOM-kill** - лучше медленно, чем убить критичный процесс - **Виртуалки** - гость сам не знает что ему дают; swap страховка ## Когда swap ВРЕДЕН - **Latency-sensitive сервисы** - подкачка страницы стоит миллисекунды, SLA рушится. Лучше OOM-kill и redeploy. - **БД** - управляются bufferpool'ом, ядро не знает что важно - **Контейнерные ноды k8s** - k8s рассчитывает на «нет swap'а»; с swap'ом метрики и QoS ломаются. До k8s 1.22 swap **обязательно отключать**. ## Thrashing Если процесс активно использует больше памяти чем RAM, ядро бесконечно свопит туда-обратно. Признаки: - `vmstat 1` - `si`/`so` высокие (десятки тысяч KB/s) - `top` - процессы в state `D`, [load-average](/kb/load-average.md) зашкаливает - `iowait` 90%+ - Система фактически не отвечает Лечение: убить процесс, отключить swap, поставить лимит [cgroups](/kb/cgroups.md), или добавить RAM. ## Отключение ```bash sudo swapoff -a # все swap'ы sudo swapoff /swapfile # конкретный sudo rm /swapfile # если файл, удалить # И убрать строку из /etc/fstab ``` `swapoff` может занять минуты - нужно сначала вернуть всё в RAM. ## zram - swap в сжатой памяти Альтернатива: вместо swap'а на диск - **сжатый блок RAM**. Меньше IOPS на диск, быстрее, но занимает RAM: ```bash sudo modprobe zram echo lz4 | sudo tee /sys/block/zram0/comp_algorithm echo 2G | sudo tee /sys/block/zram0/disksize sudo mkswap /dev/zram0 sudo swapon -p 100 /dev/zram0 # высокий приоритет - используется первым ``` Default на Fedora, ChromeOS, многих embedded дистро. ## Команды ```bash swapon ``` Активные swap-устройства с размером и приоритетом ```bash free -h ``` RAM + swap usage - быстрая проверка ```bash vmstat 1 5 ``` 5 секунд паттерна si/so - реально ли свопит сейчас ```bash sudo sysctl -w vm.swappiness=10 ``` Снизить агрессивность swap'а - типично для серверов с БД ```bash sudo swapoff -a && sudo swapon -a ``` Полная очистка swap'а - заставляет ядро вернуть всё в RAM ## См. также - [Virtual memory - виртуальные адреса, page tables](/kb/virtual-memory.md) - [OOM killer](/kb/oom-killer.md) - [Page cache - диск в памяти](/kb/page-cache.md)