linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Уроки
  • How it works
  • Симулятор
  • База знаний
  • Собеседование
Index
Categories
All entries
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
home/linux/kb/Процессы и ресурсы/oom-killer

kb/processes ── Процессы и ресурсы ── advanced

OOM killer

OOM killer - механизм ядра, который выбирает и завершает процесс когда система упирается в лимит памяти. В контейнерах работает per-cgroup.

view as markdownaka: oom, out-of-memory

Когда срабатывает

Linux обычно переподписывается на память (overcommit) - если все процессы попросят одновременно всю свою заявленную память, физических страниц не хватит. Пока никто не пытается активно использовать - работает. Когда упёрлись:

  • на хосте: kernel запускает global OOM killer
  • в контейнере / cgroup'е с memory.max: запускается cgroup OOM, убивает только в пределах этого cgroup'а

Альтернатива - общий kernel panic, но это последнее средство.

Как выбирается жертва

Каждому процессу присваивается oom_score (0..1000) на основе:

  • сколько RAM он съел (главный фактор)
  • oom_score_adj - ручная корректировка (-1000 = неуязвим, +1000 = убьёт первым)
  • root-процессы получают небольшой штраф (минус несколько процентов)

Файлы:

bash
cat /proc/<pid>/oom_score        # текущий итоговый скор
cat /proc/<pid>/oom_score_adj    # ручная корректировка

Как защитить критический процесс

bash
echo -1000 | sudo tee /proc/$(pidof sshd)/oom_score_adj

▸теперь sshd никогда не будет жертвой OOM

В systemd-юните то же самое через OOMScoreAdjust=-1000.

OOM в cgroups v2

В v2 опция memory.oom.group = 1 меняет поведение: при OOM убивает не один «худший» процесс, а весь cgroup. Это критично для приложений где потеря одного worker'а ломает остальных (Kubernetes use case).

Признаки что был OOM

bash
dmesg | grep -i 'killed process'
journalctl -k | grep -i oom
# Mar 14 12:34:56 host kernel: Out of memory: Killed process 1234 (chrome) ...

В контейнере docker inspect покажет:

bash
docker inspect <container> --format '{{.State.OOMKilled}}'
# true → контейнер был убит OOM, не сам завершился

Главные причины OOM на проде:

  1. Memory leak в приложении (Java/Node без heap-limit ровно до RAM сервера)
  2. Слишком тесный лимит в k8s - приложение работает но не помещается в лимит на пиках; решает увеличение request/limit или vertical autoscaling
  3. Большой ALLOCATION одной операцией (читать огромный файл целиком)

§ команды

bash
cat /proc/$$/oom_score

OOM-скор текущего процесса (выше = больше шанс быть убитым)

bash
echo -500 | sudo tee /proc/$$/oom_score_adj

Снизить вероятность что текущий процесс будет жертвой OOM

bash
dmesg -T | grep -i 'killed process'

История OOM-убийств с человекочитаемыми timestamp'ами

bash
cat /sys/fs/cgroup/memory.events

Счётчики low/high/max/oom для текущего cgroup'а

bash
cat /sys/fs/cgroup/memory.oom.group

Если 1 - OOM убивает весь cgroup, не один процесс

§ см. также

  • process-and-pidПроцесс и PIDПроцесс - это запущенная программа со своим PID, памятью, открытыми дескрипторами и UID. Все процессы образуют дерево, корень - init (PID 1).
  • signalsСигналы (SIGTERM, SIGKILL, SIGHUP)Сигнал - асинхронное уведомление процессу от ядра или другого процесса. TERM - попроси завершиться, KILL - убей сразу, HUP - перечитай конфиг.
  • cgroupscgroups (v2)cgroups v2 - иерархическая виртуальная FS под `/sys/fs/cgroup` через которую ядро лимитирует CPU/память/I/O процессов. Docker/k8s/systemd пишут сюда.
  • cgroups-v2-deepcgroups v2 - unified hierarchy, PSI, eBPF controlcgroups v2 - один tree вместо отдельных hierarchies на controller. Чистая семантика, новые fields (memory.high, io.cost). PSI показывает resource pressure. eBPF может управлять resources. Default в RHEL 9, Ubuntu 22+.
  • cmd-dmesgdmesg - kernel ring bufferdmesg - сообщения ядра из ring buffer (фиксированный размер, старое затирается). `-T` человеческие даты, `-w` follow, `-l err,crit` фильтр. Источник правды для драйверов и OOM-killer'а.
  • cmd-sysctlsysctl - крутилки ядра`sysctl` читает и пишет параметры ядра через виртуальную FS `/proc/sys/`. Tuning сети, памяти, файлсистемы - всё через эти ручки.
  • kubelet-internalskubelet - архитектура агента ноды Kuberneteskubelet - демон на каждой ноде. Получает PodSpec через API, запускает контейнеры через CRI, монтирует volumes через CSI, следит за health. При pressure делает eviction. Image GC и cgroup-tree - тоже его.

§ упоминается в уроках

  • ›advanced-02-cgroups-v2
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки