Анатомия игровых лагов › Поиск по симптомам
Ошибка входа / бесконечная загрузка: причины (45) и ответственные
Иначе говорят: не заходит в игру, загрузка не заканчивается
Открыть в каталоге симптомов с иллюстрациями →
В игру не пускает, или всё застревает на экране загрузки или входа.
Раз за разом «Не удаётся подключиться к серверу», после выбора персонажа полоса загрузки не доходит до конца.
Переполнено звено, которое принимает новые подключения (очередь подключений сервера, файрвол, сервер авторизации, БД). Особенно часто сразу после техработ.
Причины этого симптома
L2 ОС и устройство клиента
- Проверка пакетов защитным ПО: Когда антивирус или файрвол проверяет каждый пакет, задержка растёт, а при слишком строгих правилах игра принимается за атаку и блокируется. (Внешние стороны · Внешние стороны)
L3 Домашняя сеть
L4 Интернет-маршрут
- Ограничение UDP и DPI на уровне страны или провайдера: Некоторые сети блокируют отдельные UDP-адреса и порты или ограничивают скорость UDP, а оборудование инспекции пакетов (DPI) отсеивает протоколы, которые не может распознать. Игры, работающие по UDP, в таких сетях не подключаются или часто теряют соединение. (Внешние стороны · Внешние стороны)
- Сбои и задержки DNS: DNS превращает имя сервера в адрес. Если DNS отвечает медленно или с ошибкой, клиент не может найти сервер авторизации и сервер патчей. (Внешние стороны · Внешние стороны)
- Перегрузка общих линий из-за DDoS: Массированная атака на игровую компанию или на другого клиента в той же сети забивает общие линии связи. (Команда инфраструктуры · Сетевая инфраструктура)
- Общий IP провайдера (CGNAT): В мобильных сетях и у некоторых провайдеров один IP делят много абонентов, а записи NAT для неактивных соединений быстро удаляются. (Команда разработки · Разработка клиента)
- Трафик через VPN или игровой ускоритель: С включённым VPN или игровым ускорителем пакеты идут через промежуточные серверы этого сервиса. Если такой сервер далеко или перегружен, соединение становится даже медленнее, чем без него. (Внешние стороны · Внешние стороны)
L5 Сетевое оборудование ЦОД
- Переполнение таблицы сессий файрвола: Файрвол записывает каждое пропущенное соединение в таблицу сессий и отслеживает его. Когда таблица заполнена, новые соединения принять нельзя. (Команда инфраструктуры · Сетевая инфраструктура)
- Задержка и ложные срабатывания защиты от DDoS: Когда для отражения атаки трафик заворачивают через центр очистки, маршрут удлиняется, а нормальных пользователей защита иногда принимает за атаку и блокирует. (Команда инфраструктуры · Сетевая инфраструктура)
- Лимиты соединений и портов облачного NAT-шлюза: Исходящие соединения серверов из частной подсети во внешний мир (авторизация на платформе, платежи, внешние API) проходят через NAT-шлюз, который подменяет адрес и порт. Если одновременных соединений к одной цели больше, чем позволяет лимит портов шлюза, новые соединения не устанавливаются. (Команда инфраструктуры · Сетевая инфраструктура)
- Перекос балансировки и ошибки health check: Соединения скапливаются на одном сервере, или балансировщик продолжает отправлять игроков на уже упавший сервер. (Команда инфраструктуры · Сетевая инфраструктура)
- Несовпадение MTU (пропадают только большие пакеты): Если на промежуточном участке MTU (максимальный размер пакета за одну передачу) меньше, а уведомления о превышении размера блокируются, постоянно пропадают только большие пакеты. (Команда инфраструктуры · Сетевая инфраструктура)
L7 ОС сервера (ядро)
- Переполнение очереди подключений (backlog): Когда сразу после техработ одновременно подключаются десятки тысяч игроков, очередь подключений ядра (backlog) переполняется и попытки подключения отбрасываются. (Команда разработки · Разработка сервера)
- Лимит файловых дескрипторов: Каждому соединению нужен файловый дескриптор (fd, номер, который ОС присваивает открытому файлу или сокету), а число fd, которые может открыть один процесс, ограничено. (Команда инфраструктуры · Серверная инфраструктура)
- Переполнение таблицы conntrack на сервере: Когда таблица отслеживания соединений (conntrack), в которую файрвол Linux записывает все соединения, достигает лимита, новые пакеты отбрасываются. (Команда инфраструктуры · Серверная инфраструктура)
- Исчерпание эфемерных портов в межсерверных соединениях: Если игровой сервер часто открывает и закрывает короткие соединения с БД или другими серверами, закрытые соединения ещё какое-то время занимают порты, и новые соединения открыть не удаётся. (Команда разработки · Разработка сервера)
L8 Сокеты и протоколы
- Keepalive по умолчанию: 2 часа: Если другая сторона пропадает без сигнала о закрытии, TCP замечает это очень нескоро. Keepalive (механизм TCP, который проверяет, живо ли неактивное соединение) по умолчанию выключен, а если его включить, проверка начинается только после 2 часов простоя. (Команда разработки · Разработка сервера)
- Перекос распределения в SO_REUSEPORT: Когда несколько процессов принимают трафик на одном порту, ядро закрепляет каждое подключение за процессом по хешу адреса и больше его не меняет. Если один процесс зависает, ждут только игроки, закреплённые за ним. (Команда разработки · Разработка сервера)
L9 Процесс игрового сервера
- Исчерпание пула потоков: Если все рабочие потоки заняты медленными задачами, новые запросы ждут неопределённо долго. (Команда разработки · Разработка сервера)
L11 Диск
- Запись core dump: При падении сервер пишет на диск несколько GB памяти, и перезапуск может задерживаться на несколько минут. (Команда инфраструктуры · Серверная инфраструктура)
L12 База данных
- Запрос без индекса: Без индекса, чтобы найти строки по условию, приходится читать всю таблицу (полное сканирование). (Команда разработки · Разработка сервера)
- Исчерпание пула соединений: Число соединений с БД фиксировано, поэтому, когда медленные запросы занимают соединения, остальные запросы ждут. (Команда разработки · Разработка сервера)
- Холодный кэш (сразу после перезапуска): После перезапуска БД кэш в памяти пуст, и какое-то время все запросы читают данные с диска. (Команда инфраструктуры · Инфраструктура БД)
- Наплыв входов и запросы N+1: Если для загрузки одного персонажа нужны десятки отдельных запросов, одновременный вход десятков тысяч игроков превращается в миллионы запросов. (Команда разработки · Разработка сервера)
- Переключение БД на резерв: Пока после отказа основной БД идёт переключение на резервную, запись невозможна, а последние данные, которые не успели реплицироваться, могут пропасть. (Команда инфраструктуры · Инфраструктура БД)
- Cache stampede: Когда кэш популярных данных истекает одновременно, тысячи запросов разом идут в БД. (Команда разработки · Разработка сервера)
- Медленные команды Redis: Redis обрабатывает команды по одной, поэтому одна медленная команда блокирует все запросы за ней. (Команда разработки · Разработка сервера)
- Замедление запроса из-за смены плана выполнения: Код не менялся, но если БД меняет способ выполнения того же запроса (план выполнения), вчерашний запрос на 2 ms сегодня занимает сотни ms. (Команда инфраструктуры · Инфраструктура БД)
- Блокировка при изменении схемы (DDL) на работающем сервисе: Если во время работы сервиса добавить в таблицу столбец или индекс, из-за одной кратковременной блокировки могут встать все запросы к этой таблице. (Команда инфраструктуры · Инфраструктура БД)
L13 Архитектура и эксплуатация серверов
- Переход между зонами (передача на другой сервер): При входе в другую локацию или данж данные персонажа передаются на другой сервер, и на этом этапе возникают задержки и сбои. (Команда разработки · Разработка сервера)
- Каскадный отказ: Когда один сервис тормозит, вызывающие его серверы зависают в ожидании ответа, и останавливаются даже функции, которые с ним не связаны. (Команда разработки · Разработка сервера)
- Сбой вспомогательного сервера: Если отказывает сервер, который работает отдельно от игрового (чат, группы, аукцион), перестаёт работать только эта функция. (Команда разработки · Разработка сервера)
- Деплой и перезапуск: Если при перезапуске сервера ради обновления не перенести соединения, у всех игроков на этом сервере будет дисконнект, а сохранения перед остановкой и переподключения придут разом. (Команда разработки · Разработка сервера)
- Задержка автомасштабирования: При наплыве игроков серверы добавляются автоматически, но подготовка занимает несколько минут, и всё это время существующие серверы перегружены. (Команда инфраструктуры · Серверная инфраструктура)
- Зависимость от внешних сервисов: Если тормозит или останавливается внешний сервис (вход через платформу, оплата, подтверждение личности), всё застревает на этом этапе. (Внешние стороны · Внешние стороны)
- Истёкший или неверно настроенный TLS-сертификат: Если у сервера авторизации, API или патчей истекает сертификат или пропадает промежуточный сертификат, с этого момента у новых подключений клиентов не устанавливается TLS-соединение. (Команда инфраструктуры · Сетевая инфраструктура)
- Лимит очереди на вход и короткое окно переподключения: Когда сразу после релиза или техработ идёт наплыв подключений, очередь на вход упирается в лимит и перестаёт принимать новых игроков, а тот, кто уже ждал, при коротком обрыве теряет место и снова оказывается в конце очереди. (Команда разработки · Разработка сервера)
Архитектура синхронизации
Проблемы только у части игроков
- Раздутые данные отдельного персонажа: У персонажа, у которого накопились тысячи предметов и писем или необычно много друзей, записей в чёрном списке и баффов, данных для загрузки при входе, сохранения и рассылки окружающим в разы больше, чем у других. Тормозит только этот персонаж, независимо от подключения. (Команда разработки · Разработка сервера)
- Конфликт фиксированного UDP-порта: Если клиент рассчитан на конкретный локальный порт, второй клиент на том же ПК не может занять порт или делит пакеты с первым. (Команда разработки · Разработка клиента)
- Ограничение на несколько клиентов: Если модуль защиты или политика сервера ограничивает число клиентов на одном ПК, второй клиент не запускается или не подключается, либо у первого случается дисконнект. Некоторые игры блокируют только функции дополнительного клиента. (Команда разработки · Разработка клиента)
Первопричины повторных передач TCP
- Отбрасывание пакетов файрволом или conntrack: Файрвол или conntrack в Linux (функция, которая записывает проходящие соединения в таблицу) выбрасывает пакеты, если таблица заполнена или состояние соединения кажется ему неверным. (Команда инфраструктуры · Сетевая инфраструктура)
- Чёрная дыра MTU (большие пакеты теряются раз за разом): Если на промежуточном участке допустимый размер пакета уменьшился, а уведомление «слишком большой» (ICMP) блокируется, большие пакеты пропадают, сколько бы раз их ни отправляли повторно. (Команда инфраструктуры · Сетевая инфраструктура)
- Повторная передача запроса на подключение (SYN): Если запрос на подключение теряется из-за переполнения очереди подключений (backlog) или блокировки файрволом, ОС клиента отправляет его повторно через 1 с, а затем с растущими интервалами. (Команда разработки · Разработка сервера)
Каталог симптомов с иллюстрациями