Анатомия игровых лагов › Поиск по симптомам
Перемотка: причины (36) и ответственные
Иначе говорят: ускоренная перемотка, всё разом, урон прилетает пачкой
Открыть в каталоге симптомов с иллюстрациями →
Замерший экран снова оживает, и накопившиеся движения, удары и урон проносятся разом на большой скорости.
Монстры и игроки двигаются как на ускоренной перемотке, цифры урона и эффекты сыплются все сразу.
Где-то по пути пакеты копились, а потом разом освободились. Типичные случаи: TCP ждёт повторной передачи, сервер нагоняет отставание, клиент не успевает обрабатывать пакеты.
Причины этого симптома
L1 Процесс игрового клиента
L2 ОС и устройство клиента
- Фоновые процессы занимают CPU: Когда ядра заняты антивирусной проверкой, обновлением Windows, программой для стримов или видео в браузере, игровой поток не получает процессорного времени и ждёт. (Внешние стороны · Внешние стороны)
- Переполнение буфера приёма: Если игра занята и поздно забирает пакеты из сокета (интерфейса ОС для приёма и отправки данных по сети), буфер ОС переполняется. (Команда разработки · Разработка клиента)
- Другие приложения на устройстве забирают пропускную способность: Если на том же ПК идёт синхронизация с облаком, большая загрузка или скачивание патча игры, игровые пакеты ждут в очереди. (Внешние стороны · Внешние стороны)
- Ограничение обработки в свёрнутом или неактивном окне: Когда игрок переключается на другое окно или сворачивает игру, и сама игра, и Windows ради экономии энергии замедляют её работу. По возвращении накопившиеся пакеты приходят разом, или соединение уже оборвано. (Команда разработки · Разработка клиента)
L3 Домашняя сеть
- Bufferbloat (очередь в роутере): Когда кто-то из домашних выкладывает видео или качает большой файл, в очереди роутера скапливаются пакеты на сотни ms, и игровые пакеты ждут за ними. (Внешние стороны · Внешние стороны)
L6 Сетевая карта сервера
- Обслуживание облачного хоста и живая миграция: Во время обслуживания физического сервера (хоста) облачный провайдер переносит виртуальную машину на другой хост (живая миграция) или ненадолго её приостанавливает. На это время замирает весь сервер, а если пауза долгая, соединения рвутся. (Команда инфраструктуры · Серверная инфраструктура)
L7 ОС сервера (ядро)
- Нехватка буферов сокетов в ядре: Если буферы приёма и отправки маленькие, то при всплеске трафика принятые по UDP пакеты отбрасываются, а отправка по TCP встаёт, потому что в буфере нет места. (Команда инфраструктуры · Серверная инфраструктура)
- Скачок системных часов (шаговая коррекция NTP): Если часы сервера разом переводятся на несколько секунд вперёд или назад, таймеры, завязанные на системные часы, срабатывают пачкой или замирают. (Команда разработки · Разработка сервера)
L8 Сокеты и протоколы
- HOL-блокировка в TCP: Чтобы сохранить порядок, TCP не передаёт игре пакеты, пришедшие позже, пока заново не получит один потерянный пакет. (Команда разработки · Разработка сервера)
- Настройка повторных передач в надёжном UDP: Если собственные правила повторной передачи поверх UDP слишком осторожные, потери восстанавливаются поздно, а если слишком агрессивные, они ещё сильнее забивают линию. (Команда разработки · Разработка сервера)
- Резкий спад передачи из-за управления перегрузкой: TCP считает потери признаком перегрузки и снижает скорость передачи на 30–50%. Точно так же он реагирует и на потери в Wi-Fi. (Команда инфраструктуры · Серверная инфраструктура)
L9 Процесс игрового сервера
- Взрывной рост рассылки (broadcast): Если движение каждого игрока отправлять всем, кто его видит, число обновлений растёт как квадрат числа собравшихся. (Команда разработки · Разработка сервера)
- Бой, сосредоточенный на одной цели (мировой босс): Когда сотни игроков одновременно бьют одного босса, все расчёты по этому боссу сходятся в одной точке, а информация о каждом ударе рассылается всем, кто его видит. (Команда разработки · Разработка сервера)
- Лавина спавна при входе в людное место: Когда игрок телепортируется в город, полный людей, сервер должен разом отправить внешность, экипировку и состояние сотен персонажей, которые стали видны. (Команда разработки · Разработка сервера)
L10 Память
- Полная пауза GC на сервере: Сервер на Java или C# останавливает все потоки на время сборки мусора (stop-the-world), и на это время замирает весь сервер. (Команда разработки · Разработка сервера)
Архитектура синхронизации
- Воспроизведение сразу по приходу без меток времени: Если сервер не прикрепляет к событиям время, когда они произошли, а клиент проигрывает их сразу при получении, сетевой джиттер напрямую сбивает тайминг анимаций. (Команда разработки · Разработка клиента)
Проблемы только у части игроков
- Игрок с плохой связью движется на чужих экранах рывками: Ввод игрока с плохим подключением приходит на сервер неравномерно, пачками. Если сервер в каждом тике применяет всё, что успело прийти, другие видят, как этот персонаж замирает, а потом делает сразу несколько шагов. (Команда разработки · Разработка сервера)
- Перемотка на сервере, который обрабатывает ввод сразу по приходу: На сервере, который обрабатывает и рассылает пакеты сразу по приходу, действия тормозящего игрока, пришедшие пачкой, выполняются подряд и немедленно. (Команда разработки · Разработка сервера)
- Управление монстром у тормозящего клиента: В некоторых играх, чтобы снизить нагрузку на сервер, расчёт перемещения монстров поручают клиенту одного из ближайших игроков. Если у этого игрока плохое подключение, монстр странно движется на экранах у всех. (Команда разработки · Разработка сервера)
- Ограничение обработки в фоновом окне: Для клиента в фоновом окне игра, движок и ОС снижают частоту кадров и объём обработки. Полученные пакеты не успевают обрабатываться, копятся и переполняют буфер. (Команда разработки · Разработка клиента)
Первопричины повторных передач TCP
- Потери на беспроводном участке: Wi-Fi и мобильная сеть несколько раз повторяют передачу на беспроводном участке, а если и это не помогает, выбрасывают пакет. Выброшенный пакет TCP отправит повторно только спустя заметное время. (Внешние стороны · Внешние стороны)
- Переполнение очереди в узком месте (потери от перегрузки): Когда заполняется очередь в самом узком месте (в роутере, на стыке провайдеров, на линии связи ЦОД), новые пакеты выбрасываются. (Команда инфраструктуры · Сетевая инфраструктура)
- Переполнение неглубоких буферов всплесками отправки: Когда сервер каждый тик разом выплёскивает обновления для тысяч игроков, маленький буфер коммутатора или мгновенный лимит облака переполняется меньше чем за 1 ms, и часть пакетов выбрасывается. (Команда разработки · Разработка сервера)
- Отбрасывание избытка полисером: Тарифы провайдеров, лимиты облачных инстансов и оборудование защиты от DDoS могут сразу отбрасывать пакеты сверх заданной скорости, не ставя их в очередь. (Команда инфраструктуры · Сетевая инфраструктура)
- Физические ошибки (неисправные кабели, оптические модули и разъёмы): Повреждённый кабель, запылённый оптический разъём или выработавший ресурс оптический модуль дают битовые ошибки, и оборудование молча выбрасывает испорченные пакеты. (Команда инфраструктуры · Сетевая инфраструктура)
- Несовпадение дуплекса: Если на одной стороне включено автосогласование, а на другой скорость и дуплекс заданы жёстко, одна сторона работает в полудуплексе и под нагрузкой каждый раз теряет пакеты из-за коллизий. (Команда инфраструктуры · Сетевая инфраструктура)
- Отбрасывание пакетов на принимающем сервере: Пакеты дошли до сервера, но выбрасываются: переполнен кольцевой буфер NIC (буфер, где ненадолго лежат пришедшие пакеты) или загружено до предела процессорное ядро, на котором ОС обрабатывает приём. (Команда инфраструктуры · Серверная инфраструктура)
- Перегрузка промежуточного оборудования (файрвол, IPS, защита от DDoS): Файрволы, системы предотвращения вторжений (IPS) и оборудование защиты от DDoS проверяют каждый проходящий пакет. Как только поток превышает их возможности, необработанные пакеты выбрасываются. (Команда инфраструктуры · Сетевая инфраструктура)
- Смена маршрута и неисправный путь ECMP: Пакеты пропадают в течение нескольких секунд, пока меняется интернет-маршрут, или постоянно на соединениях, попавших на неисправный путь среди нескольких путей ECMP. (Команда инфраструктуры · Сетевая инфраструктура)
- Ложные повторные передачи из-за скачков задержки: Пакет цел и лишь ненадолго сильно задерживается. Если эта задержка дольше RTO, отправитель считает пакет потерянным и передаёт его повторно. (Внешние стороны · Внешние стороны)
- Неподходящая настройка RTO: Если слишком занизить минимальный RTO, от малейшей задержки возникают ложные повторные передачи, а значение по умолчанию (200 ms) для игры слишком велико, и каждая потеря даёт долгий фриз. (Команда инфраструктуры · Серверная инфраструктура)
- Медленное восстановление потерь в thin stream: Когда мелкие пакеты отправляются редко, как в играх, RTO наступает раньше, чем соберутся «3 следующих пакета». От тех же потерь поток стоит намного дольше, чем при больших передачах. (Команда разработки · Разработка сервера)
- Удаление опций TCP промежуточным оборудованием: Если некоторые файрволы или ускорители удаляют или меняют опции TCP, то при потере нескольких пакетов они восстанавливаются по одному за RTT или окно (сколько можно отправить за раз) становится маленьким, и передача замедляется. (Команда инфраструктуры · Сетевая инфраструктура)
- Нулевое окно (остановка, похожая на повторную передачу): Если программа-получатель не успевает вовремя читать сокет и буфер заполняется, отправитель останавливает передачу и шлёт только пробы нулевого окна. С линией связи это не связано. (Команда разработки · Разработка клиента)
Каталог симптомов с иллюстрациями