Анатомия игровых лагов › Поиск по симптомам
Задержка ввода: причины (76) и ответственные
Иначе говорят: инпут-лаг, запоздалый отклик, ватное управление
Открыть в каталоге симптомов с иллюстрациями →
Между нажатием и результатом проходит заметное время. При этом картинка может оставаться плавной.
Умение срабатывает через 0,2–0,5 с после нажатия. Действия, которые ждут подтверждения (подбор предметов, диалог, обмен), выполняются медленно.
Пинг (время пути туда и обратно) слишком велик, или где-то растёт очередь. Проверьте расстояние, очередь роутера, Nagle (функция TCP, которая копит мелкие пакеты и отправляет их вместе), серверные очереди. Если пинг низкий, а управление всё равно ватное, проверьте ПК игрока (V-Sync, низкий FPS) или архитектуру, где каждое действие ждёт подтверждения сервера (глава о моделях синхронизации).
Причины этого симптома
L1 Процесс игрового клиента
- Нагрузка на рендеринг при большом скоплении игроков: Когда в кадр попадают сотни игроков, как на осаде или у мирового босса, клиент не справляется уже с самой отрисовкой. (Команда разработки · Разработка клиента)
- Узкое место: обработка пакетов в главном потоке: Если за кадр обрабатывается только фиксированное число полученных пакетов, при наплыве пакеты всё время переносятся на следующие кадры. (Команда разработки · Разработка клиента)
- V-Sync и очередь рендеринга: Отрисованные GPU кадры по несколько штук ждут в очереди и выводятся в такт монитору, поэтому ввод доходит до экрана с опозданием. (Команда разработки · Разработка клиента)
L2 ОС и устройство клиента
- Энергосбережение и тепловой троттлинг: Из-за работы ноутбука от батареи, режима энергосбережения на телефоне или нагрева устройства падает скорость CPU и GPU. Характерный признак перегрева: сначала всё нормально, а тормоза начинаются заметно позже. (Внешние стороны · Внешние стороны)
- Другие приложения на устройстве забирают пропускную способность: Если на том же ПК идёт синхронизация с облаком, большая загрузка или скачивание патча игры, игровые пакеты ждут в очереди. (Внешние стороны · Внешние стороны)
- Задержка дисплея, устройств ввода и генерации кадров: Если пинг в норме, а управление ватное, задержку между вводом и экраном может добавлять обработка изображения в телевизоре, беспроводной контроллер или генерация кадров. (Внешние стороны · Внешние стороны)
L3 Домашняя сеть
- Перегруженный радиоканал Wi-Fi: Там, где рядом десятки роутеров (например, в многоквартирном доме), они делят один радиоканал, и каждому приходится ждать своей очереди на передачу. (Внешние стороны · Внешние стороны)
- Bufferbloat (очередь в роутере): Когда кто-то из домашних выкладывает видео или качает большой файл, в очереди роутера скапливаются пакеты на сотни ms, и игровые пакеты ждут за ними. (Внешние стороны · Внешние стороны)
- Задержка перехода состояний RRC (энергосбережение радиомодуля): Если связи какое-то время нет, телефон переводит радиосоединение в экономичное состояние, а при следующем пакете поднимает его снова, и пакет опаздывает. (Команда разработки · Разработка клиента)
L4 Интернет-маршрут
- Задержка распространения (физическое расстояние): Даже свет в оптоволокне проходит всего около 200 000 km в секунду. Если сервер далеко, задержка будет большой, каким бы хорошим он ни был. (Команда инфраструктуры · Серверная инфраструктура)
- Спутниковый интернет (низкоорбитальный и геостационарный): В спутниковом интернете радиосигнал летит в космос и обратно. Через геостационарный спутник один только путь туда и обратно занимает больше 0,5 с. Низкоорбитальные спутники вроде Starlink обычно быстрые, но в моменты перераспределения маршрута задержка скачет, а связь может ненадолго прерываться. (Внешние стороны · Внешние стороны)
- Неоптимальная маршрутизация: Из-за договоров о соединении между провайдерами трафик даже до близкого сервера идёт в обход через далёкие точки. (Команда инфраструктуры · Сетевая инфраструктура)
- Аварии на подводных кабелях и международных линиях: После обрыва подводного кабеля трафик несколько недель (иногда месяцев), пока идёт ремонт, ходит дальними обходными маршрутами, а оставшиеся линии перегружены. (Внешние стороны · Внешние стороны)
- Ограничение скорости и управление трафиком у провайдера: Если превышен лимит трафика или тариф предусматривает управление определённым трафиком, пакеты задерживаются или отбрасываются. (Внешние стороны · Внешние стороны)
- Трафик через VPN или игровой ускоритель: С включённым VPN или игровым ускорителем пакеты идут через промежуточные серверы этого сервиса. Если такой сервер далеко или перегружен, соединение становится даже медленнее, чем без него. (Внешние стороны · Внешние стороны)
L5 Сетевое оборудование ЦОД
- Задержка и ложные срабатывания защиты от DDoS: Когда для отражения атаки трафик заворачивают через центр очистки, маршрут удлиняется, а нормальных пользователей защита иногда принимает за атаку и блокирует. (Команда инфраструктуры · Сетевая инфраструктура)
- Перегрузка линии связи ЦОД: Если раздача патчей, отправка логов и бэкапы идут по той же линии, что и игра, линия забивается. (Команда инфраструктуры · Сетевая инфраструктура)
L6 Сетевая карта сервера
- Все прерывания NIC на одном ядре: Если NIC отправляет прерывания о приходе пакетов только на одно ядро CPU, это ядро становится узким местом. (Команда инфраструктуры · Серверная инфраструктура)
- Избыточное объединение прерываний: Если ради разгрузки CPU NIC копит пакеты и сообщает о них разом, пакеты задерживаются на время накопления. (Команда инфраструктуры · Серверная инфраструктура)
- Исчерпание пропускной способности NIC: Если карта на 1 Gbps или 10 Gbps загружена до предела, очередь отправки растёт, и в итоге пакеты отбрасываются. (Команда разработки · Разработка сервера)
- Ожидание объединения пакетов в GRO/LRO: GRO и LRO объединяют несколько пакетов в один, чтобы снизить нагрузку на CPU. При некоторых настройках маленький игровой пакет ненадолго ждёт следующий, чтобы объединиться с ним. (Команда инфраструктуры · Серверная инфраструктура)
L7 ОС сервера (ядро)
- Всплески задержки из-за управления питанием сервера (C-state, управление частотой): Простаивающее ядро CPU ради экономии энергии переходит в глубокое состояние сна (C-state) и снижает частоту. Когда приходит пакет или срабатывает таймер, на пробуждение и подъём частоты уходит время, и к обработке даже маленьких пакетов добавляется задержка. (Команда инфраструктуры · Серверная инфраструктура)
- Изменение производительности после обновления ОС, ядра, драйверов или прошивки: Игровой код не менялся, но после обновления ОС, ядра, драйверов или прошивки сервер стал работать медленнее. Обновление может поменять значения по умолчанию, планировщик, защиту от уязвимостей CPU (mitigations) и поведение драйверов. (Команда инфраструктуры · Серверная инфраструктура)
L8 Сокеты и протоколы
- Алгоритм Нейгла + отложенный ACK: Алгоритм Нейгла, который копит мелкие пакеты перед отправкой, и отложенный ACK, который придерживает подтверждения, мешают друг другу, и каждое сообщение, записанное по частям, задерживается на 40–200 ms. (Команда разработки · Разработка сервера)
- Медленный старт после простоя: Если соединение какое-то время простаивало, TCP снова уменьшает окно перегрузки (объём, который можно отправить за раз), и внезапно понадобившийся большой объём данных уходит в несколько заходов. (Команда инфраструктуры · Серверная инфраструктура)
- Резкий спад передачи из-за управления перегрузкой: TCP считает потери признаком перегрузки и снижает скорость передачи на 30–50%. Точно так же он реагирует и на потери в Wi-Fi. (Команда инфраструктуры · Серверная инфраструктура)
- Архитектура с блокирующим вводом-выводом: Если поток, ожидая один сокет, не может делать ничего другого, то с ростом числа игроков тормозит всё. (Команда разработки · Разработка сервера)
L9 Процесс игрового сервера
- Превышение бюджета тика: Если работа одного тика не укладывается в бюджет, интервал тиков сервера растягивается, и вся локация идёт замедленно или с микрофризами. (Команда разработки · Разработка сервера)
- Взрывной рост рассылки (broadcast): Если движение каждого игрока отправлять всем, кто его видит, число обновлений растёт как квадрат числа собравшихся. (Команда разработки · Разработка сервера)
- Перегрузка однопоточной локации (хотспот): Если каждую локацию обслуживает один поток, то при скоплении игроков в одном месте на 100% загружается только одно ядро. (Команда разработки · Разработка сервера)
- Конкуренция за блокировки: Если несколько потоков ждут одну блокировку, чтобы работать с одними и теми же данными, то сколько потоков ни добавляй, выполняется только один за раз. (Команда разработки · Разработка сервера)
- Затор в очереди сообщений: Если запросы поступают быстрее, чем обрабатываются, и копятся в очереди, запросы в её хвосте обрабатываются лишь через несколько секунд или выбрасываются. (Команда разработки · Разработка сервера)
- Затраты на сериализацию и сжатие: Превращение данных для отправки в байты и их сжатие тоже требуют CPU, и при большом числе игроков эти затраты резко растут. (Команда разработки · Разработка сервера)
- Исчерпание пула потоков: Если все рабочие потоки заняты медленными задачами, новые запросы ждут неопределённо долго. (Команда разработки · Разработка сервера)
- Бой, сосредоточенный на одной цели (мировой босс): Когда сотни игроков одновременно бьют одного босса, все расчёты по этому боссу сходятся в одной точке, а информация о каждом ударе рассылается всем, кто его видит. (Команда разработки · Разработка сервера)
- Лавина спавна при входе в людное место: Когда игрок телепортируется в город, полный людей, сервер должен разом отправить внешность, экипировку и состояние сотен персонажей, которые стали видны. (Команда разработки · Разработка сервера)
- Накопление объектов (неубранные предметы и призванные существа): Если предметы на земле, призванные существа и отработавшие таймеры, которые должны исчезать, не удаляются и копятся, то чем дольше сервер работает, тем больше работы в каждом тике. (Команда разработки · Разработка сервера)
- Патч изменил характер трафика: Если новый контент, эффекты и синхронизируемые поля увеличивают размер и частоту пакетов, сервер, который работал нормально, после патча упирается в MTU, пропускную способность или лимиты по числу пакетов. (Команда разработки · Разработка сервера)
L11 Диск
- Лавина fsync: Запрос записать данные на диск «гарантированно» занимает от 0,1 ms до десятков ms в зависимости от диска, а когда таких запросов много, очередь растёт. (Команда разработки · Разработка сервера)
- Исчерпание burst-кредитов облачного диска: У некоторых облачных дисков и небольших конфигураций серверов есть burst-кредиты, которые позволяют какое-то время работать быстрее базовой производительности. Если высокая нагрузка держится долго и кредиты кончаются, скорость резко падает. (Команда инфраструктуры · Серверная инфраструктура)
- Лимит IOPS и насыщение очереди: Если запросов больше, чем диск может обработать за секунду, очередь растёт и задержка резко увеличивается. (Команда инфраструктуры · Серверная инфраструктура)
- Бэкап, сжатие и сканирование: Когда ночной бэкап, сжатие логов или проверка безопасности занимают диск целиком, чтение и запись игрового сервера застревают. (Команда инфраструктуры · Серверная инфраструктура)
- Задержка позиционирования HDD: У HDD головка должна перемещаться над пластинами (позиционирование, seek), поэтому каждое чтение или запись разбросанных данных занимает почти 10 ms. (Команда инфраструктуры · Серверная инфраструктура)
L12 База данных
- Запрос без индекса: Без индекса, чтобы найти строки по условию, приходится читать всю таблицу (полное сканирование). (Команда разработки · Разработка сервера)
- Конкуренция за блокировку горячей строки: Когда все пытаются изменить одну и ту же строку (гильдейский склад, популярный лот на аукционе, общий счётчик сервера), блокировку получает только один запрос за раз. (Команда разработки · Разработка сервера)
- Дедлок в БД: Если две транзакции (операции БД, которые выполняются как единое целое) ждут строки, заблокированные друг другом, БД принудительно отменяет одну из них. (Команда разработки · Разработка сервера)
- Исчерпание пула соединений: Число соединений с БД фиксировано, поэтому, когда медленные запросы занимают соединения, остальные запросы ждут. (Команда разработки · Разработка сервера)
- Контрольные точки и сброс журнала: В моменты, когда БД периодически сбрасывает накопленные в памяти изменения на диск, запросы замедляются. (Команда инфраструктуры · Инфраструктура БД)
- Холодный кэш (сразу после перезапуска): После перезапуска БД кэш в памяти пуст, и какое-то время все запросы читают данные с диска. (Команда инфраструктуры · Инфраструктура БД)
- Наплыв входов и запросы N+1: Если для загрузки одного персонажа нужны десятки отдельных запросов, одновременный вход десятков тысяч игроков превращается в миллионы запросов. (Команда разработки · Разработка сервера)
- Тяжёлые пакетные задания: Если подсчёт рейтингов, массовую рассылку почты или чистку старых данных запускать во время работы сервиса, они занимают блокировки и диск. (Команда разработки · Разработка сервера)
- Cache stampede: Когда кэш популярных данных истекает одновременно, тысячи запросов разом идут в БД. (Команда разработки · Разработка сервера)
- Долго открытая транзакция: Если одна транзакция долго остаётся открытой, она продолжает держать блокировки, а БД не может очистить (purge) старые версии данных, и всё постепенно замедляется. (Команда разработки · Разработка сервера)
- Медленные команды Redis: Redis обрабатывает команды по одной, поэтому одна медленная команда блокирует все запросы за ней. (Команда разработки · Разработка сервера)
- Замедление запроса из-за смены плана выполнения: Код не менялся, но если БД меняет способ выполнения того же запроса (план выполнения), вчерашний запрос на 2 ms сегодня занимает сотни ms. (Команда инфраструктуры · Инфраструктура БД)
- Блокировка при изменении схемы (DDL) на работающем сервисе: Если во время работы сервиса добавить в таблицу столбец или индекс, из-за одной кратковременной блокировки могут встать все запросы к этой таблице. (Команда инфраструктуры · Инфраструктура БД)
L13 Архитектура и эксплуатация серверов
- Трафик через шлюз или прокси: Если поставить между клиентом и игровым сервером промежуточный сервер, каждый проход через него добавляет время обработки, а сам он становится единой точкой отказа. (Команда разработки · Разработка сервера)
- Каскадный отказ: Когда один сервис тормозит, вызывающие его серверы зависают в ожидании ответа, и останавливаются даже функции, которые с ним не связаны. (Команда разработки · Разработка сервера)
- Деплой и перезапуск: Если при перезапуске сервера ради обновления не перенести соединения, у всех игроков на этом сервере будет дисконнект, а сохранения перед остановкой и переподключения придут разом. (Команда разработки · Разработка сервера)
- Избыток макросов и ботов: Боты шлют запросы гораздо чаще людей и съедают производительность сервера. (Команда разработки · Разработка сервера)
- Ошибки матчмейкинга и выбора региона: Если игрока отправили на сервер в дальнем регионе вместо ближнего, у него одного пинг всегда высокий, даже если с подключением всё в порядке. (Команда разработки · Разработка сервера)
Архитектура синхронизации
- Отклик только после ответа сервера (модель запрос-ответ): После нажатия кнопки нет ни анимации, ни звука, пока не придёт ответ сервера. Скорость отклика становится равна пингу. (Команда разработки · Разработка клиента)
- Протокол с множеством последовательных обменов (chatty): Если для одного действия нужно несколько обменов с сервером по очереди, пинг умножается на их число. (Команда разработки · Разработка сервера)
- Нет буферизации ввода умений: Если следующее умение можно нажать только после подтверждения сервера, что предыдущее закончилось, в каждую связку вклинивается путь туда и обратно. (Команда разработки · Разработка клиента)
- Короткое окно реакции, которое съедает пинг: Если на реакцию (уклонение, парирование, блок) отведено мало времени, пинг съедает это время, и появляются атаки, от которых невозможно уйти. (Команда разработки · Разработка сервера)
- Ожидание самого медленного игрока в lockstep: В схеме, где все вместе рассчитывают один и тот же ход, при опоздании ввода одного игрока ждут все. (Команда разработки · Разработка сервера)
- Двойное ожидание тика: Если запросы копятся до следующего тика и только тогда обрабатываются, а результат уходит ещё через тик, интервал тика добавляется дважды. (Команда разработки · Разработка сервера)
Проблемы только у части игроков
- Размер буфера ввода на игрока: Если сервер немного накапливает ввод каждого игрока и берёт по одной команде за тик, на чужих экранах движение плавное, но момент, когда действие самого игрока подтверждается сервером, сдвигается на столько же. (Команда разработки · Разработка сервера)
- Один тормозящий участник группы и механики босса: В рейдовых механиках, где все должны отреагировать в один и тот же момент, запоздалая реакция одного тормозящего игрока проваливает всю группу. (Команда разработки · Разработка сервера)
- Раздутые данные отдельного персонажа: У персонажа, у которого накопились тысячи предметов и писем или необычно много друзей, записей в чёрном списке и баффов, данных для загрузки при входе, сохранения и рассылки окружающим в разы больше, чем у других. Тормозит только этот персонаж, независимо от подключения. (Команда разработки · Разработка сервера)
- Бюджет отправки и приоритеты для каждого соединения: Если сервер ограничивает объём отправки для каждого соединения и отправляет сначала ближние объекты, соединение с низким лимитом получает дальних NPC поздно или не получает вовсе. (Команда разработки · Разработка сервера)
Первопричины повторных передач TCP
- Отбрасывание пакетов на принимающем сервере: Пакеты дошли до сервера, но выбрасываются: переполнен кольцевой буфер NIC (буфер, где ненадолго лежат пришедшие пакеты) или загружено до предела процессорное ядро, на котором ОС обрабатывает приём. (Команда инфраструктуры · Серверная инфраструктура)
- Ложные повторные передачи из-за скачков задержки: Пакет цел и лишь ненадолго сильно задерживается. Если эта задержка дольше RTO, отправитель считает пакет потерянным и передаёт его повторно. (Внешние стороны · Внешние стороны)
- Ложные быстрые повторные передачи из-за нарушения порядка: Если на нескольких путях или агрегированных линках порядок пакетов меняется, получатель дублирующими ACK сообщает «пакета не хватает», и отправитель повторно отправляет пакеты, которые не терялись. (Команда инфраструктуры · Сетевая инфраструктура)
- Задержка и потеря ACK (забитая отдача): Данные дошли нормально, но если ACK «получено» задерживается или теряется в забитой очереди отдачи, отправитель считает данные потерянными и передаёт их повторно. (Внешние стороны · Внешние стороны)
- Неподходящая настройка RTO: Если слишком занизить минимальный RTO, от малейшей задержки возникают ложные повторные передачи, а значение по умолчанию (200 ms) для игры слишком велико, и каждая потеря даёт долгий фриз. (Команда инфраструктуры · Серверная инфраструктура)
Каталог симптомов с иллюстрациями