Ответ
Когда свободная ОЗУ (RAM) заканчивается, ядро Linux активирует механизм подкачки (swapping). Вот что происходит по шагам:
1. Активное использование SWAP:
- Ядро находит "неактивные" страницы памяти в RAM и перемещает их в специальный раздел или файл на диске — SWAP.
- Это освобождает RAM для текущих процессов.
- Главное последствие — резкое падение производительности, так как доступ к диску на порядки медленнее, чем к RAM. Система начинает "тормозить",
wa(I/O wait) вtopвозрастает.
2. Если SWAP тоже заполняется:
- Ядро запускает OOM Killer (Out-Of-Memory Killer).
- OOM Killer вычисляет "плохойness score" для каждого процесса (учитывает потребление памяти, приоритет (oom_score_adj), время работы) и принудительно завершает (
SIGKILL) процесс с наибольшим score, чтобы освободить память. - В системный журнал (
/var/log/syslogилиjournalctl) пишется сообщение вида:Killed process 12345 (java) total-vm:123456kB, anon-rss:87654kB, file-rss:0kB, shmem-rss:0kB
Как это диагностировать:
# Проверить использование памяти и swap
free -h
# Мониторить своппинг в реальном времени (смотреть столбец 'si' - swap in, 'so' - swap out)
vmstat 1
# Проверить, какие процессы используют много памяти
top -o %MEM
Из практики: На production-серверах приложений мы стараемся настраивать мониторинг (например, в Prometheus с Alertmanager), чтобы получать алерты при активном использовании swap (> 10 МБ в секунду), так как это ранний признак проблем с памятью, и принимать меры (оптимизировать приложение, добавить RAM, масштабировать), не дожидаясь срабатывания OOM Killer.