Что это
Когда RAM кончается, у ядра есть выбор:
- Выкинуть clean страницы page cache (можно перечитать с диска)
- Записать грязные anonymous-страницы (heap процесса) на диск и освободить RAM - это swap-out
- Если ни то ни другое не дало места → oom-killer
Swap не делает систему быстрее. Он делает её возможной в условиях «RAM кончилась, но работа должна продолжаться».
Swap partition vs swap file
Раньше - отдельный раздел. Сейчас на современных дистро - обычно файл:
# Создать 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
Раздел:
sudo mkswap /dev/sdb2
sudo swapon /dev/sdb2
# fstab: UUID=... none swap sw 0 0
Просмотр
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
cat /proc/sys/vm/swappiness # default 60 (на ноуте) или 30 (на сервере)
- 0 - почти не свопить anonymous-страницы; жди пока кончится
- 60 - баланс (default desktop)
- 100 - свопь агрессивно
На прод-серверах БД часто ставят 1-10 - чтобы heap БД не уходил в swap (БД своим bufferpool управляет лучше ядра).
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- процессы в stateD, load-average зашкаливаетiowait90%+- Система фактически не отвечает
Лечение: убить процесс, отключить swap, поставить лимит cgroups, или добавить RAM.
Отключение
sudo swapoff -a # все swap'ы
sudo swapoff /swapfile # конкретный
sudo rm /swapfile # если файл, удалить
# И убрать строку из /etc/fstab
swapoff может занять минуты - нужно сначала вернуть всё в RAM.
zram - swap в сжатой памяти
Альтернатива: вместо swap'а на диск - сжатый блок RAM. Меньше IOPS на диск, быстрее, но занимает RAM:
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 дистро.