한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Анатомия игровых лагов › L7 ОС сервера (ядро)

OOM killer Out-of-memory killer

ID причины so-oom · Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Серверная инфраструктура

Открыть карточку в основной версии с иллюстрациями и экспериментами →

Когда память заканчивается, Linux выбирает процесс, который занимает больше всего памяти, и принудительно его завершает. Обычно это игровой сервер.

Почему Память исчерпана из-за утечки или резкого роста потребления, либо контейнер упёрся в лимит памяти → Следствие Ядро принудительно завершает процесс игрового сервера → На экране Дисконнект у всех на этом сервере одновременно, возможен роллбэк недавнего прогресса

Симптомы
Дисконнект, Съеденные действия / роллбэк
Факторы
Остановка
У кого
Весь сервер
Когда
Чем дольше без перезапуска, При наплыве игроков
Ответственные
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Серверная инфраструктура
Команда разработки: задачи
Исправить утечки, задать верхнюю границу потребления памяти и при приближении к ней сохранять данные и штатно завершать работу.
Команда инфраструктуры: задачи
Настроить алерты по памяти, задать лимит памяти контейнера по фактическому потреблению, настроить очерёдность завершения процессов (oom_score_adj).
Цифры для ориентира
В журнале ядра (dmesg) остаётся запись «Out of memory: Killed process», а в Kubernetes виден статус OOMKilled. В Windows OOM killer нет, и там сервер чаще падает с ошибкой, когда не удаётся выделить память.
На графике
Массовый обрыв соединений · число подключений, расход памяти
Где смотреть
Сопоставить с моментом обрыва подключений запись «Out of memory: Killed process» в dmesg, статус пода OOMKilled в Kubernetes или прирост oom_kill в memory.events в cgroup v2
Подтверждает
В момент массового обрыва подключений есть запись о завершении процесса игрового сервера, а перед этим расход памяти дорос до лимита
Опровергает
Если записи OOM нет, а процесс завершился, смотреть лог падения и core dump, как в причине «Падение сервера»
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)

Источники

  1. mm/oom_kill.c (Linux v6.12) Linux kernel
    Оценка рассчитывается так, чтобы самый высокий балл получал процесс, занимающий больше всего памяти (с учётом oom_score_adj). При завершении записывается «Out of memory: Killed process …»
  2. Assign Memory Resources to Containers and Pods Kubernetes
    Если контейнер продолжает расходовать память сверх limit, он завершается, а в статусе отображается OOMKilled
  3. Pushing the Limits of Windows: Virtual Memory Microsoft
    В Windows при достижении предела выделения (commit limit) выделение памяти с фиксацией (commit) завершается ошибкой, что может привести к сбою приложения или системы
  4. Control Group v2 Linux kernel
    oom_kill в memory.events: число процессов в этой cgroup, завершённых OOM killer

Смотрите также

Тот же слой: L7 ОС сервера (ядро)

Причины с тем же симптомом (Дисконнект) на других слоях

Карточка в основной версии с иллюстрациями и экспериментами