linux-labs

Вики / Процессы

Память и swap

Как читать free, что такое swap и swappiness, OOM-killer.

free -h                           # память и swap

Ключевая колонка — available (сколько реально доступно приложениям), а не «free». Linux намеренно занимает свободную RAM под кэш (buff/cache) и отдаёт её при необходимости — высокий used из-за кэша это нормально.

swap — место на диске под вытеснение страниц памяти. Диск медленный, поэтому активный своп = тормоза, но он спасает от OOM.

free -h                           # итог по памяти/swap (смотри available!)
free -h -s2                       # обновлять каждые 2с
cat /proc/meminfo                 # подробности (MemAvailable, Dirty, Slab…)
swapon --show                     # активные swap-устройства/файлы
vmstat 1                          # колонки si/so — своп in/out (>0 = свопит)
ps aux --sort=-%mem | head        # топ процессов по памяти (RSS)
smem -tk                          # память с учётом shared (точнее RSS; если установлен)
sudo cat /proc/<PID>/status | grep -E 'VmRSS|VmSwap'   # память конкретного процесса
# добавить swap-файл (если своп кончился/его нет):
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# постоянно — строка в /etc/fstab: /swapfile none swap sw 0 0

sysctl vm.swappiness              # склонность к свопу (0..100, по умолч. 60)
sudo sysctl vm.swappiness=10      # на серверах часто снижают (см. sysctl)
# постоянно: /etc/sysctl.d/99-swap.conf → vm.swappiness=10
sudo swapoff -a && sudo swapon -a # сбросить/перезалить swap

Сервер тормозит, swap растёт

Не хватает RAM — система свопит (vmstat 1si/so > 0). Найди пожирателя (ps aux --sort=-%mem), добавь RAM/swap или ограничь сервис. Снизь vm.swappiness.

Процесс убит «из ниоткуда» (OOM)

OOM-killer при нехватке памяти. Подтверди: journalctl -k | grep -i oom / dmesg | grep -i oom — там видно, кого и почему убили. Увеличь RAM/swap, ограничь сервис через cgroups (MemoryMax=, см. cgroups-namespaces) или почини утечку. Защитить процесс: oom_score_adj (choom).

available мало, хотя «free» вроде есть

Смотри именно available; «free» без кэша вводит в заблуждение. Кэш отдастся приложениям сам.

Память течёт у конкретного сервиса

/proc/PID/status (VmRSS) в динамике, smem. Ограничь через systemd MemoryMax= и поймай рост (см. cgroups-namespaces).

Хочу освободить кэш (редко нужно)

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches — обычно не требуется (кэш и так отдаётся под нагрузку).

free -h                           # смотри available, не free
vmstat 1                          # si/so — активность свопа
swapon --show                     # активный swap
ps aux --sort=-%mem | head        # топ по памяти
journalctl -k | grep -i oom       # OOM-killer
# swap-файл: fallocate→chmod 600→mkswap→swapon (+ fstab) ; vm.swappiness=10