Анатомия игровых лагов › Поиск по симптомам
Фриз: причины (67) и ответственные
Иначе говорят: всё замерло, стоп-кадр, «не отвечает»
Открыть в каталоге симптомов с иллюстрациями →
Всё на экране ненадолго (от 0,5 с до нескольких секунд) замирает, а потом снова движется.
Все замерли. Только ваш персонаж немного сдвигается за счёт предсказания или бежит на месте. Когда отпускает, накопившиеся движения догоняют разом, перемоткой или телепортацией.
Целиком встал сервер (GC, дедлок, синхронный вызов), ненадолго оборвалась связь или остановился ПК игрока.
Причины этого симптома
L1 Процесс игрового клиента
- Всплески времени кадра: Расчёт одного кадра занимает в несколько раз больше времени, чем обычно, и картинка на миг замирает. (Команда разработки · Разработка клиента)
- Сборка мусора на клиенте: Пока освобождается использованная и уже ненужная память (мусор), вся игра стоит. Характерный признак: микрофризы через равные промежутки. (Команда разработки · Разработка клиента)
- Синхронная загрузка и компиляция шейдеров в главном потоке: Перед первой отрисовкой новой локации, монстра или эффекта игра останавливается, чтобы прочитать файлы и скомпилировать шейдеры. (Команда разработки · Разработка клиента)
- Стриминг ассетов отстаёт из-за медленного накопителя: На медленном накопителе вроде HDD текстуры и модели открытого мира читаются медленнее, чем перемещается игрок. Объекты появляются с опозданием, или игра дёргается, ожидая окончания чтения. (Команда разработки · Разработка клиента)
- Проверки модуля защиты игры (античита): Модуль защиты от взлома работает вместе с игрой и периодически выполняет проверки. Если проверка тяжёлая или хартбит (периодический сигнал «я жив») с сервером защиты запаздывает, появляются микрофризы или дисконнект. (Команда разработки · Разработка клиента)
L2 ОС и устройство клиента
- Переключение Wi-Fi ↔ LTE/5G: Когда игрок выходит из дома, Wi-Fi пропадает и устройство переключается на LTE или 5G. IP-адрес меняется, и старое соединение перестаёт работать. (Команда разработки · Разработка сервера)
- Нехватка памяти и своп на клиенте: Если вместе с игрой открыты десятки вкладок браузера, ОС выгружает часть памяти игры на диск. (Внешние стороны · Внешние стороны)
- Нехватка видеопамяти (VRAM): Если графическим настройкам нужно больше памяти, чем есть на видеокарте, ОС выгружает текстуры в оперативную память ПК и загружает обратно, и появляются микрофризы. (Команда разработки · Разработка клиента)
- Энергосбережение NIC и проблемы драйверов: Если сетевая карта или модуль Wi-Fi уходят в энергосбережение между пакетами, на пробуждение нужно время. (Внешние стороны · Внешние стороны)
- Вмешательство оверлеев: Мессенджеры, лаунчеры, программы записи и счётчики FPS встраиваются в рендеринг игры (хукинг), чтобы рисовать свой UI поверх игровой картинки. Работы в каждом кадре становится больше, а иногда оверлей конфликтует с игрой, и она дёргается или принудительно закрывается. (Внешние стороны · Внешние стороны)
L3 Домашняя сеть
L4 Интернет-маршрут
- Смена маршрута BGP и сходимость: Когда в интернете меняется маршрутная информация, пакеты теряются, пока маршруты снова не сойдутся: от нескольких секунд до нескольких десятков секунд (изредка несколько минут). (Команда инфраструктуры · Сетевая инфраструктура)
- Плохое качество линии связи: Плохой контакт в разъёмах, старый кабель или неисправный модем дают постоянные потери и периодические обрывы связи. (Внешние стороны · Внешние стороны)
L5 Сетевое оборудование ЦОД
- Переключение сетевого оборудования на резерв (failover): Когда маршрутизатор или файрвол выходит из строя и трафик переключается на резервное устройство (failover), на эти несколько секунд у всех фриз. (Команда инфраструктуры · Сетевая инфраструктура)
- Несовпадение MTU (пропадают только большие пакеты): Если на промежуточном участке MTU (максимальный размер пакета за одну передачу) меньше, а уведомления о превышении размера блокируются, постоянно пропадают только большие пакеты. (Команда инфраструктуры · Сетевая инфраструктура)
L6 Сетевая карта сервера
- Обслуживание облачного хоста и живая миграция: Во время обслуживания физического сервера (хоста) облачный провайдер переносит виртуальную машину на другой хост (живая миграция) или ненадолго её приостанавливает. На это время замирает весь сервер, а если пауза долгая, соединения рвутся. (Команда инфраструктуры · Серверная инфраструктура)
- Проблемы драйвера и прошивки NIC: Из-за ошибки драйвера или сбоя какой-то функции карта зависает и перезапускается, и на это время весь приём и отправка прекращаются. (Команда инфраструктуры · Серверная инфраструктура)
L7 ОС сервера (ядро)
- CPU steal (виртуальная машина): Пока физический сервер (гипервизор) временно отдаёт процессорное время виртуальной машины другим виртуальным машинам (CPU steal), игровой сервер стоит. (Команда инфраструктуры · Серверная инфраструктура)
- Остановки из-за освобождения и уплотнения памяти: Процесс останавливается, пока ОС уплотняет память (compaction), чтобы собрать большие страницы (huge pages), или освобождает память, чтобы пополнить запас свободной (reclaim). (Команда инфраструктуры · Серверная инфраструктура)
L8 Сокеты и протоколы
- HOL-блокировка в TCP: Чтобы сохранить порядок, TCP не передаёт игре пакеты, пришедшие позже, пока заново не получит один потерянный пакет. (Команда разработки · Разработка сервера)
- TCP RTO и экспоненциальный backoff: С каждой новой неудачной повторной передачей ожидание удваивается, и короткий обрыв связи превращается в долгую остановку. (Команда разработки · Разработка сервера)
- Блокирующая отправка из-за медленного клиента: Если у одного игрока с медленным подключением заполнился буфер отправки, а сервер отправляет данные блокирующим способом (вызов не возвращается, пока в буфере не освободится место), поток сервера ждёт этого одного игрока. (Команда разработки · Разработка сервера)
- Перекос распределения в SO_REUSEPORT: Когда несколько процессов принимают трафик на одном порту, ядро закрепляет каждое подключение за процессом по хешу адреса и больше его не меняет. Если один процесс зависает, ждут только игроки, закреплённые за ним. (Команда разработки · Разработка сервера)
- Ошибка WSAECONNRESET на UDP-сокете в Windows: Когда сервер на Windows отправляет UDP уже ушедшему клиенту, обратно приходит уведомление «порт недоступен» (ICMP). Из-за него следующий вызов приёма завершается ошибкой, и если код сервера считает её поломкой самого сокета, страдают все, кто работает через этот сокет. (Команда разработки · Разработка сервера)
L9 Процесс игрового сервера
- Конкуренция за блокировки: Если несколько потоков ждут одну блокировку, чтобы работать с одними и теми же данными, то сколько потоков ни добавляй, выполняется только один за раз. (Команда разработки · Разработка сервера)
- Дедлок: Если два потока ждут блокировки, захваченные друг другом, они встают навсегда. (Команда разработки · Разработка сервера)
- Синхронные вызовы в игровом потоке: Если посреди тика ждать ответа БД или записи в файл, на это время останавливается вся игра на сервере. (Команда разработки · Разработка сервера)
- Одновременное срабатывание таймеров: Если респавн всех монстров, окончание всех баффов и награды ровно в начале часа приходятся на один тик, этот тик становится в десятки раз тяжелее. (Команда разработки · Разработка сервера)
- Исчерпание пула потоков: Если все рабочие потоки заняты медленными задачами, новые запросы ждут неопределённо долго. (Команда разработки · Разработка сервера)
- Бесконечный цикл и неконтролируемая логика: Если из-за бага тик не заканчивается, сервер встаёт, и watchdog принудительно его перезапускает. (Команда разработки · Разработка сервера)
- Лавина спавна при входе в людное место: Когда игрок телепортируется в город, полный людей, сервер должен разом отправить внешность, экипировку и состояние сотен персонажей, которые стали видны. (Команда разработки · Разработка сервера)
L10 Память
- Полная пауза GC на сервере: Сервер на Java или C# останавливает все потоки на время сборки мусора (stop-the-world), и на это время замирает весь сервер. (Команда разработки · Разработка сервера)
- Паузы GC в скриптовом движке: Если на сервере, пусть даже написанном на C++, квесты, AI и умения выполняются скриптами (например, на Lua), то на время работы GC скриптового движка эта зона останавливается. (Команда разработки · Разработка сервера)
- Лавина аллокаций: Если во время события создаётся масса временных объектов, GC запускается намного чаще обычного. (Команда разработки · Разработка сервера)
- Утечка памяти: Неосвобождённая память понемногу накапливается, и через несколько дней это заканчивается трешингом GC, свопом или принудительным завершением процесса. (Команда разработки · Разработка сервера)
- Трешинг GC (мало свободного места в куче): Когда живые данные приближаются к пределу кучи, GC почти нечего освобождать, и сборки идут одна за другой без перерыва. (Команда разработки · Разработка сервера)
- Своп: Когда памяти не хватает и ОС выгружает её часть на диск, при каждом обращении к этой памяти приходится ждать диск, который медленнее больше чем в 1 000 раз. (Команда инфраструктуры · Серверная инфраструктура)
L11 Диск
- Синхронная запись логов: Если игровой поток на каждой строке лога ждёт, пока диск завершит запись, то при занятом диске останавливается и игра. (Команда разработки · Разработка сервера)
- Лимит IOPS и насыщение очереди: Если запросов больше, чем диск может обработать за секунду, очередь растёт и задержка резко увеличивается. (Команда инфраструктуры · Серверная инфраструктура)
- Ленивая загрузка на сервере: Если сервер читает данные данжа или карты с диска в момент первого запроса, на этот тик останавливаются все. (Команда разработки · Разработка сервера)
L12 База данных
- Переключение БД на резерв: Пока после отказа основной БД идёт переключение на резервную, запись невозможна, а последние данные, которые не успели реплицироваться, могут пропасть. (Команда инфраструктуры · Инфраструктура БД)
- Cache stampede: Когда кэш популярных данных истекает одновременно, тысячи запросов разом идут в БД. (Команда разработки · Разработка сервера)
- Медленные команды Redis: Redis обрабатывает команды по одной, поэтому одна медленная команда блокирует все запросы за ней. (Команда разработки · Разработка сервера)
L13 Архитектура и эксплуатация серверов
- Переход между зонами (передача на другой сервер): При входе в другую локацию или данж данные персонажа передаются на другой сервер, и на этом этапе возникают задержки и сбои. (Команда разработки · Разработка сервера)
- Каскадный отказ: Когда один сервис тормозит, вызывающие его серверы зависают в ожидании ответа, и останавливаются даже функции, которые с ним не связаны. (Команда разработки · Разработка сервера)
- Перегрузка логирования и мониторинга: При сбое логи растут лавиной, и серверы, которые отправляют логи синхронно, из-за этого тормозят ещё сильнее. (Команда разработки · Разработка сервера)
Архитектура синхронизации
- Ожидание самого медленного игрока в lockstep: В схеме, где все вместе рассчитывают один и тот же ход, при опоздании ввода одного игрока ждут все. (Команда разработки · Разработка сервера)
- Архитектура с хостом-игроком: Если сервером служит ПК одного из игроков, его подключение и производительность ПК определяют ощущения всех. (Команда разработки · Разработка сервера)
Проблемы только у части игроков
- Раздутые данные отдельного персонажа: У персонажа, у которого накопились тысячи предметов и писем или необычно много друзей, записей в чёрном списке и баффов, данных для загрузки при входе, сохранения и рассылки окружающим в разы больше, чем у других. Тормозит только этот персонаж, независимо от подключения. (Команда разработки · Разработка сервера)
Первопричины повторных передач TCP
- Потери на беспроводном участке: Wi-Fi и мобильная сеть несколько раз повторяют передачу на беспроводном участке, а если и это не помогает, выбрасывают пакет. Выброшенный пакет TCP отправит повторно только спустя заметное время. (Внешние стороны · Внешние стороны)
- Переполнение очереди в узком месте (потери от перегрузки): Когда заполняется очередь в самом узком месте (в роутере, на стыке провайдеров, на линии связи ЦОД), новые пакеты выбрасываются. (Команда инфраструктуры · Сетевая инфраструктура)
- Переполнение неглубоких буферов всплесками отправки: Когда сервер каждый тик разом выплёскивает обновления для тысяч игроков, маленький буфер коммутатора или мгновенный лимит облака переполняется меньше чем за 1 ms, и часть пакетов выбрасывается. (Команда разработки · Разработка сервера)
- Отбрасывание избытка полисером: Тарифы провайдеров, лимиты облачных инстансов и оборудование защиты от DDoS могут сразу отбрасывать пакеты сверх заданной скорости, не ставя их в очередь. (Команда инфраструктуры · Сетевая инфраструктура)
- Физические ошибки (неисправные кабели, оптические модули и разъёмы): Повреждённый кабель, запылённый оптический разъём или выработавший ресурс оптический модуль дают битовые ошибки, и оборудование молча выбрасывает испорченные пакеты. (Команда инфраструктуры · Сетевая инфраструктура)
- Несовпадение дуплекса: Если на одной стороне включено автосогласование, а на другой скорость и дуплекс заданы жёстко, одна сторона работает в полудуплексе и под нагрузкой каждый раз теряет пакеты из-за коллизий. (Команда инфраструктуры · Сетевая инфраструктура)
- Отбрасывание пакетов на принимающем сервере: Пакеты дошли до сервера, но выбрасываются: переполнен кольцевой буфер NIC (буфер, где ненадолго лежат пришедшие пакеты) или загружено до предела процессорное ядро, на котором ОС обрабатывает приём. (Команда инфраструктуры · Серверная инфраструктура)
- Отбрасывание пакетов файрволом или conntrack: Файрвол или conntrack в Linux (функция, которая записывает проходящие соединения в таблицу) выбрасывает пакеты, если таблица заполнена или состояние соединения кажется ему неверным. (Команда инфраструктуры · Сетевая инфраструктура)
- Перегрузка промежуточного оборудования (файрвол, IPS, защита от DDoS): Файрволы, системы предотвращения вторжений (IPS) и оборудование защиты от DDoS проверяют каждый проходящий пакет. Как только поток превышает их возможности, необработанные пакеты выбрасываются. (Команда инфраструктуры · Сетевая инфраструктура)
- Чёрная дыра MTU (большие пакеты теряются раз за разом): Если на промежуточном участке допустимый размер пакета уменьшился, а уведомление «слишком большой» (ICMP) блокируется, большие пакеты пропадают, сколько бы раз их ни отправляли повторно. (Команда инфраструктуры · Сетевая инфраструктура)
- Истечение записи NAT или балансировщика посреди соединения: Если промежуточное оборудование удаляет запись неактивного соединения (запись о том, куда пересылать это соединение), следующий отправленный пакет не доходит. Повторные передачи идут, пока соединение не оборвётся, или оборудование возвращает отказ в соединении (RST), и связь рвётся сразу. (Команда разработки · Разработка клиента)
- Смена маршрута и неисправный путь ECMP: Пакеты пропадают в течение нескольких секунд, пока меняется интернет-маршрут, или постоянно на соединениях, попавших на неисправный путь среди нескольких путей ECMP. (Команда инфраструктуры · Сетевая инфраструктура)
- Ложные повторные передачи из-за скачков задержки: Пакет цел и лишь ненадолго сильно задерживается. Если эта задержка дольше RTO, отправитель считает пакет потерянным и передаёт его повторно. (Внешние стороны · Внешние стороны)
- Неподходящая настройка RTO: Если слишком занизить минимальный RTO, от малейшей задержки возникают ложные повторные передачи, а значение по умолчанию (200 ms) для игры слишком велико, и каждая потеря даёт долгий фриз. (Команда инфраструктуры · Серверная инфраструктура)
- Медленное восстановление потерь в thin stream: Когда мелкие пакеты отправляются редко, как в играх, RTO наступает раньше, чем соберутся «3 следующих пакета». От тех же потерь поток стоит намного дольше, чем при больших передачах. (Команда разработки · Разработка сервера)
- Удаление опций TCP промежуточным оборудованием: Если некоторые файрволы или ускорители удаляют или меняют опции TCP, то при потере нескольких пакетов они восстанавливаются по одному за RTT или окно (сколько можно отправить за раз) становится маленьким, и передача замедляется. (Команда инфраструктуры · Сетевая инфраструктура)
- Нулевое окно (остановка, похожая на повторную передачу): Если программа-получатель не успевает вовремя читать сокет и буфер заполняется, отправитель останавливает передачу и шлёт только пробы нулевого окна. С линией связи это не связано. (Команда разработки · Разработка клиента)
Каталог симптомов с иллюстрациями