Анатомия игровых лагов › Поиск по симптомам
Съеденные действия / роллбэк: причины (36) и ответственные
Иначе говорят: умение не прожалось, предмет вернулся назад, обмен сорвался
Открыть в каталоге симптомов с иллюстрациями →
Действие, которое точно было сделано, как будто не происходило, или его результат отменяется намного позже.
Умение нажато, но не сработало. Купленный предмет исчез, или после перезахода всё как несколько минут назад.
Запрос потерялся (потери, переполнение очереди), сервер решил иначе, чем показал экран игрока (разный момент проверки, отказ после опережающего фидбека), или сбой случился во время сохранения (блокировки или отказ БД, падение сервера).
Причины этого симптома
L1 Процесс игрового клиента
- Ошибка синхронизации часов: Если клиент неверно оценивает серверное время, сбиваются момент интерполяции и проверка кулдаунов. (Команда разработки · Разработка клиента)
L5 Сетевое оборудование ЦОД
- Лимиты соединений и портов облачного NAT-шлюза: Исходящие соединения серверов из частной подсети во внешний мир (авторизация на платформе, платежи, внешние API) проходят через NAT-шлюз, который подменяет адрес и порт. Если одновременных соединений к одной цели больше, чем позволяет лимит портов шлюза, новые соединения не устанавливаются. (Команда инфраструктуры · Сетевая инфраструктура)
- Микробёрсты на коммутаторе: Когда несколько серверов в один и тот же момент разом отправляют пакеты тысячам игроков, маленький буфер порта коммутатора, где сходится этот трафик, переполняется меньше чем за 1 ms. (Команда разработки · Разработка сервера)
L6 Сетевая карта сервера
- Слишком маленький кольцевой буфер: Если кольцевой буфер, где NIC ненадолго держит пакеты, маленький, при резком наплыве пакетов он переполняется, и пакеты отбрасываются. (Команда инфраструктуры · Серверная инфраструктура)
- Превышен лимит PPS в облаке: У каждого типа облачного сервера есть лимиты пакетов в секунду и пропускной способности, и всё сверх лимита молча отбрасывается. (Команда инфраструктуры · Серверная инфраструктура)
L7 ОС сервера (ядро)
- OOM killer: Когда память заканчивается, Linux выбирает процесс, который занимает больше всего памяти, и принудительно его завершает. Обычно это игровой сервер. (Команда разработки · Разработка сервера)
- Скачок системных часов (шаговая коррекция NTP): Если часы сервера разом переводятся на несколько секунд вперёд или назад, таймеры, завязанные на системные часы, срабатывают пачкой или замирают. (Команда разработки · Разработка сервера)
- Исчерпание эфемерных портов в межсерверных соединениях: Если игровой сервер часто открывает и закрывает короткие соединения с БД или другими серверами, закрытые соединения ещё какое-то время занимают порты, и новые соединения открыть не удаётся. (Команда разработки · Разработка сервера)
L8 Сокеты и протоколы
- Настройка повторных передач в надёжном UDP: Если собственные правила повторной передачи поверх UDP слишком осторожные, потери восстанавливаются поздно, а если слишком агрессивные, они ещё сильнее забивают линию. (Команда разработки · Разработка сервера)
L9 Процесс игрового сервера
- Затор в очереди сообщений: Если запросы поступают быстрее, чем обрабатываются, и копятся в очереди, запросы в её хвосте обрабатываются лишь через несколько секунд или выбрасываются. (Команда разработки · Разработка сервера)
- Падение сервера: Если процесс сервера падает из-за необработанной ошибки, у всех, кто был на этом сервере, одновременно обрывается соединение. (Команда разработки · Разработка сервера)
- Патч изменил характер трафика: Если новый контент, эффекты и синхронизируемые поля увеличивают размер и частоту пакетов, сервер, который работал нормально, после патча упирается в MTU, пропускную способность или лимиты по числу пакетов. (Команда разработки · Разработка сервера)
L11 Диск
- Диск заполнен: Когда логи и дампы заполняют диск, запись завершается ошибкой, и если к этому не подготовиться, сервер падает. (Команда инфраструктуры · Серверная инфраструктура)
L12 База данных
- Конкуренция за блокировку горячей строки: Когда все пытаются изменить одну и ту же строку (гильдейский склад, популярный лот на аукционе, общий счётчик сервера), блокировку получает только один запрос за раз. (Команда разработки · Разработка сервера)
- Дедлок в БД: Если две транзакции (операции БД, которые выполняются как единое целое) ждут строки, заблокированные друг другом, БД принудительно отменяет одну из них. (Команда разработки · Разработка сервера)
- Отставание репликации: Если запись идёт в основную БД, а чтение с реплики, то при отставании реплики только что записанные данные не видны. (Команда инфраструктуры · Инфраструктура БД)
- Тяжёлые пакетные задания: Если подсчёт рейтингов, массовую рассылку почты или чистку старых данных запускать во время работы сервиса, они занимают блокировки и диск. (Команда разработки · Разработка сервера)
- Переключение БД на резерв: Пока после отказа основной БД идёт переключение на резервную, запись невозможна, а последние данные, которые не успели реплицироваться, могут пропасть. (Команда инфраструктуры · Инфраструктура БД)
- Потеря прогресса из-за редких сохранений: Если ради снижения нагрузки сохранять прогресс раз в несколько минут, то при падении сервера в промежутке прогресс пропадает. (Команда разработки · Разработка сервера)
- Долго открытая транзакция: Если одна транзакция долго остаётся открытой, она продолжает держать блокировки, а БД не может очистить (purge) старые версии данных, и всё постепенно замедляется. (Команда разработки · Разработка сервера)
- Блокировка при изменении схемы (DDL) на работающем сервисе: Если во время работы сервиса добавить в таблицу столбец или индекс, из-за одной кратковременной блокировки могут встать все запросы к этой таблице. (Команда инфраструктуры · Инфраструктура БД)
L13 Архитектура и эксплуатация серверов
- Сбой вспомогательного сервера: Если отказывает сервер, который работает отдельно от игрового (чат, группы, аукцион), перестаёт работать только эта функция. (Команда разработки · Разработка сервера)
- Расхождение часов между серверами: Если часы на серверах немного расходятся, проверки кулдаунов, баффов и начала событий на разных серверах дают разный результат. (Команда инфраструктуры · Серверная инфраструктура)
- Зависимость от внешних сервисов: Если тормозит или останавливается внешний сервис (вход через платформу, оплата, подтверждение личности), всё застревает на этом этапе. (Внешние стороны · Внешние стороны)
- Ошибки матчмейкинга и выбора региона: Если игрока отправили на сервер в дальнем регионе вместо ближнего, у него одного пинг всегда высокий, даже если с подключением всё в порядке. (Команда разработки · Разработка сервера)
- Истёкший или неверно настроенный TLS-сертификат: Если у сервера авторизации, API или патчей истекает сертификат или пропадает промежуточный сертификат, с этого момента у новых подключений клиентов не устанавливается TLS-соединение. (Команда инфраструктуры · Сетевая инфраструктура)
Архитектура синхронизации
- Нет буферизации ввода умений: Если следующее умение можно нажать только после подтверждения сервера, что предыдущее закончилось, в каждую связку вклинивается путь туда и обратно. (Команда разработки · Разработка клиента)
- Короткое окно реакции, которое съедает пинг: Если на реакцию (уклонение, парирование, блок) отведено мало времени, пинг съедает это время, и появляются атаки, от которых невозможно уйти. (Команда разработки · Разработка сервера)
- Проверка попадания без компенсации задержки: Если сервер проверяет попадание только по «текущей позиции на сервере», результат расходится с тем, что игрок видел на своём экране. (Команда разработки · Разработка сервера)
- Чрезмерная компенсация задержки: Если отматывать время слишком далеко в пользу атакующего, в того, кто уже спрятался, всё равно попадают. (Команда разработки · Разработка сервера)
- Клиентский авторитет: Если каждый клиент сам определяет свои результаты, на экране игрока всё плавно, но результаты расходятся с экранами других, и игра уязвима для читов. (Команда разработки · Разработка сервера)
- Слишком строгая серверная проверка: Если сервер слишком строго проверяет скорость перемещения, кулдауны и дальность, он отклоняет даже нормальный ввод, пришедший пачкой из-за джиттера. (Команда разработки · Разработка сервера)
- Отказ сервера после опережающего фидбека: Если сервер потом не засчитывает удар или умение, которые экран игрока уже показал, результат, который игрок точно видел, отменяется. (Команда разработки · Разработка клиента)
- Низкая частота отправки снапшотов: Если сервер отправляет обновления позиций (снапшоты) всего несколько раз в секунду, буфер интерполяции приходится делать соответственно длинным, и другие персонажи видны в более далёком прошлом. (Команда разработки · Разработка сервера)
Проблемы только у части игроков
Каталог симптомов с иллюстрациями