Практика Руководство

Где искать причину падения игрового сервера Linux

Найдите причину аварийного падения игрового сервера в Linux: анализ кодов 137, 139 и 143, аудит dmesg на OOM Killer и coredumpctl.

Где искать причину падения игрового сервера Linux

Внезапное исчезновение процесса игрового сервера без сообщений об ошибках в консоли — типичная головная боль системного администратора. Сервер просто перестаёт отвечать, а в файле latest.log последней строкой оказывается обычное игровое событие. В операционной системе Linux процесс никогда не исчезает бесследно: ядро и супервизор служб всегда фиксируют код завершения, сигнал или событие нехватки памяти.

Инструкция предназначена для администраторов игровых серверов на Linux. На 28 октября 2026 года для диагностики используются стандартные средства ядра, systemd и анализ сигналов POSIX.

О чем говорит код завершения процесса#

Когда процесс завершается под управлением Linux, он возвращает числовой код завершения. Если завершение произошло по сигналу операционной системы, код рассчитывается по формуле 128 + номер сигнала:

Код завершенияСигналТипичная причина
137SIGKILL (сигнал 9)Принудительное уничтожение ядром Linux из-за Out-of-Memory (OOM Killer) или лимита памяти в Docker cgroup
139SIGSEGV (сигнал 11)Ошибка сегментации: обращение к невалидной памяти, сбойный мод или несовместимая бинарная библиотека
143SIGTERM (сигнал 15)Штатный запрос на остановку от systemd, планировщика или команды systemctl stop
134SIGABRT (сигнал 6)Аварийный отказ: сработало внутреннее утверждение (assert) в коде C++ или JVM
1Общая ошибкаОшибка синтаксиса конфигурации, занятый сетевой порт или отсутствие прав на запись

Быстро узнать код завершения последней упавшей службы systemd можно одной командой:

bash
systemctl show game-server.service -p Result -p ExecMainStatus -p ExecMainCode

Если статус показывает Result=oom-kill или ExecMainStatus=137, сервер был принудительно убит из-за исчерпания оперативной памяти.

Проверка журналов ядра на срабатывание OOM Killer#

Если сервер завершился с кодом 137, проверьте кольцевой буфер ядра утилитой dmesg:

bash
sudo dmesg -T | grep -i -E 'oom[-_]killer|killed process'

При исчерпании памяти ядро выведет подробную запись с точным временем, именем процесса и объёмом выделенной памяти:

text
Out of memory: Killed process 41829 (RustDedicated) total-vm:18492012kB, anon-rss:14201948kB

Это прямое доказательство того, что падение вызвано не ошибкой в коде игры, а физической нехваткой RAM на хосте или жестким ограничением в cgroup/Docker.

Последовательность локализации сбоя: проверка кода возврата, инспекция dmesg на OOM, аудит journalctl и анализ дампов памяти.

Проверка журналов службы через journalctl#

Если ядро не фиксирует OOM Killer, проверьте стандартный поток вывода службы через journalctl:

bash
sudo journalctl -u game-server.service -e -n 100 --no-pager

Обратите внимание на строки перед завершением процесса:

  • Address already in use — порт сервера уже занят другим процессом или зависшим экземпляром.
  • Permission denied — процесс запущен от пользователя, у которого нет прав на чтение или запись в каталог мира.
  • Failed to open descriptor — исчерпан лимит открытых файловых дескрипторов процесса (nofile).

Поиск дампов памяти при Segmentation Fault (coredumpctl)#

Если сервер падает с кодом 139 (SIGSEGV), операционная система фиксирует сбой обращения к памяти.

Проверьте наличие сохранённых дампов памяти утилитой coredumpctl:

bash
coredumpctl list

Для просмотра информации о конкретном сбое выполните:

bash
coredumpctl info

В блоке Stack trace вы увидите конкретную динамическую библиотеку (.so), вызвавшую сбой: это позволяет мгновенно понять, вызвана ли ошибка модом (например, расширением Metamod), системным драйвером или движком самой игры.

Если вы сопровождаете инфраструктуру игровых серверов через Nexardo, проверяйте системные лимиты памяти и параметры супервизора в едином интерфейсе: автоматический сбор телеметрии хоста помогает устранять причины падений до того, как они повторятся.

Источники#