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

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

Переполнение таблицы conntrack на сервере conntrack table full

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

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

Когда таблица отслеживания соединений (conntrack), в которую файрвол Linux записывает все соединения, достигает лимита, новые пакеты отбрасываются.

Почему Из-за наплыва подключений и множества коротких соединений растёт число записей → Следствие Таблица заполнена, новые соединения и часть пакетов отбрасываются → На экране Ошибка входа, телепортация из-за необъяснимых потерь

Симптомы
Ошибка входа / бесконечная загрузка, Телепортация
Факторы
Потери
У кого
Весь сервер
Когда
Сразу после входа или техработ, При наплыве игроков
Ответственные
Основной ответственный Команда инфраструктуры · Серверная инфраструктура · Совместно Команда разработки · Разработка сервера, Команда разработки · Разработка клиента
Команда разработки: задачи
Сервер: сократить короткие соединения (для межсерверных вызовов переиспользовать соединения). Клиент: при неудачном подключении или обрыве увеличивать интервал между повторами и добавлять случайный разброс.
Команда инфраструктуры: задачи
Увеличить размер таблицы (nf_conntrack_max), исключить игровые порты из отслеживания (NOTRACK в таблице raw), настроить алерт по заполненности.
Цифры для ориентира
Лимит по умолчанию в зависимости от памяти сервера составляет примерно от 60 000 до 260 000 записей. При переполнении в журнале ядра появляется «nf_conntrack: table full, dropping packet».
На графике
Упор в лимит (плато) · число записей conntrack (nf_conntrack_count)
Где смотреть
Вывести net.netfilter.nf_conntrack_count из sysctl (текущее число записей) на один график с nf_conntrack_max и найти в dmesg «nf_conntrack: table full, dropping packet»
Подтверждает
nf_conntrack_count выходит на плато на уровне max, и с этого момента в журнале ядра появляется table full
Опровергает
Если число записей далеко от max, причина в другом. Лимит отслеживания соединений самого инстанса AWS проверяют по conntrack_allowance_exceeded (см. «Превышен лимит PPS в облаке»)
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)

Источники

  1. Netfilter Conntrack Sysfs variables Linux kernel
    nf_conntrack_max по умолчанию равен числу бакетов хеш-таблицы (nf_conntrack_buckets), а число бакетов зависит от объёма памяти
  2. net/netfilter/nf_conntrack_core.c (Linux v6.12) Linux kernel
    Размер по умолчанию 65 536 при памяти больше 1 GB и 262 144 при памяти больше 4 GB (на 64-битных системах). При заполнении пакет отбрасывается с записью «nf_conntrack: table full, dropping packet»
  3. iptables-extensions(8) — Linux manual page netfilter
    CT --notrack в таблице raw исключает трафик из отслеживания соединений

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

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

Причины с тем же симптомом (Ошибка входа / бесконечная загрузка) на других слоях

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