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

Мониторинг игровых серверов: Prometheus, node_exporter и алерты

Мониторинг инфраструктуры игровых серверов на базе Prometheus: экспорт метрик CPU/RAM через node_exporter, отслеживание tick rate и алерты в Telegram.

Мониторинг игровых серверов: Prometheus, node_exporter и алерты

Диагностика производительности игрового сервера часто начинается слишком поздно — когда игроки уже жалуются на лаги в Discord, персонажи застревают в текстурах, а тикрейт падает вдвое. При этом стандартные графики загрузки процессора в панели хостинга часто показывают обманчивые 25–30% общей утилизации CPU, скрывая тот факт, что главное ядро симуляции загружено на 100%.

Современный стек мониторинга на базе Prometheus, экспортера метрик node_exporter и визуализации в Grafana позволяет отслеживать критические параметры игровых серверов в реальном времени: однопоточную нагрузку процессора, очереди сетевых пакетов UDP, доступную оперативную память и просадки тиков. В этой статье разобран процесс настройки мониторинга на Linux VPS с правилами оповещения в Alertmanager.

Установка и изоляция node_exporter на сервере#

Агент node_exporter собирает метрики ядра Linux (процессор, диски, память, сеть) и отдаёт их в формате Prometheus по HTTP на порту 9100.

Создайте сервисного пользователя и установите бинарный файл node_exporter:

bash
sudo useradd --no-create-home --shell /bin/false node_exporter
curl -LO https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar -xvf node_exporter-*.tar.gz
sudo mv node_exporter-*.linux-amd64/node_exporter /usr/local/bin/
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
rm -rf node_exporter-*

Создайте юнит-файл systemd для фоновой работы:

bash
cat << 'EOF' | sudo tee /etc/systemd/system/node_exporter.service
[Unit]
Description=Prometheus Node Exporter
After=network.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter --web.listen-address=127.0.0.1:9100
Restart=always

[Install]
WantedBy=multi-user.target
EOF

Обратите внимание на параметр --web.listen-address=127.0.0.1:9100. Он привязывает метрики к локальному интерфейсу, закрывая метрики хоста от публичного доступа.

Запустите службу:

bash
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
curl -s http://127.0.0.1:9100/metrics | head -n 10

Конфигурация сбора метрик в prometheus.yml#

Настройте сервер Prometheus на опрос метрик с коротким интервалом (15 секунд), чтобы своевременно замечать кратковременные просадки симуляции:

bash
cat << 'EOF' | sudo tee /etc/prometheus/prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'gamehost_node'
    static_configs:
      - targets: ['127.0.0.1:9100']
EOF

Перезагрузите конфигурацию Prometheus:

bash
sudo systemctl restart prometheus
sudo systemctl status prometheus --no-pager

Ключевые PromQL-запросы для игровых серверов#

Для точной диагностики производительности игровых движков используйте специфические PromQL-выражения:

  1. Загрузка процессора по отдельным ядрам (Single-core saturation):Показывает утилизацию каждого ядра в процентах. Если одно ядро упирается в 100%, тикрейт игры начнёт падать даже при свободных остальных ядрах:
text
100 - (avg by (cpu) (rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)
  1. Доступная физическая память без учёта кэша:Сигнализирует о риске срабатывания OOM Killer:
text
node_memory_MemAvailable_bytes / 1024 / 1024 / 1024
  1. Скорость входящих пакетов UDP (Packet Rate / PPS):Позволяет вовремя обнаружить сетевой флуд или резкий наплыв игроков:
text
rate(node_network_receive_packets_total{device="eth0"}[1m])

Настройка правил алертов в Alertmanager#

Чтобы узнавать о зависании игрового сервера или переполнении памяти автоматически, добавьте правила оповещения:

bash
cat << 'EOF' | sudo tee /etc/prometheus/alert_rules.yml
groups:
  - name: game_server_alerts
    rules:
      - alert: HostMemoryCritical
        expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.10
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "Host memory critically low (< 10% available)"

      - alert: SingleCorePinned100
        expr: 100 - (avg by (cpu) (rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100) > 98
        for: 3m
        labels:
          severity: warning
        annotations:
          summary: "CPU core pinned above 98% for 3 minutes (Game tick throttle risk)"
EOF

Проверьте корректность синтаксиса файла правил с помощью утилиты promtool:

bash
promtool check rules /etc/prometheus/alert_rules.yml

Если утилита вывела SUCCESS, добавьте путь к файлу правил в секцию rule_files конфигурации prometheus.yml и примените настройки.

При управлении десятками игровых серверов ручная сборка стека Prometheus и Grafana требует значительного времени на администрирование. В рамках современной панели управления серверами мониторинг ключевых игровых метрик, загрузки потоков и алертов о деградации тикрейта интегрирован по умолчанию.

Источники#