한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Анатомия игровых лагов › L13 Архитектура и эксплуатация серверов

Трафик через шлюз или прокси Gateway / proxy hop

ID причины in-gateway · Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Серверная инфраструктура, Команда разработки · Разработка клиента

Открыть карточку в основной версии с иллюстрациями и экспериментами →

Если поставить между клиентом и игровым сервером промежуточный сервер, каждый проход через него добавляет время обработки, а сам он становится единой точкой отказа.

Почему Схема клиент ↔ шлюз ↔ игровой сервер → Следствие Промежуточный сервер добавляет обработку и ожидание, при его перегрузке страдают все → На экране Пинг растёт у всех, при отказе шлюза дисконнект у всех игроков, которые через него подключены

Симптомы
Задержка ввода, Дисконнект
Факторы
Задержка, Остановка
У кого
Весь сервер
Когда
При наплыве игроков, Всегда
Ответственные
Основной ответственный Команда разработки · Разработка сервера · Совместно Команда инфраструктуры · Серверная инфраструктура, Команда разработки · Разработка клиента
Команда разработки: задачи
Сервер: заложить возможность добавлять шлюзы и восстановление сессии, чтобы при падении шлюза персонаж продолжал игру после переподключения к другому шлюзу. Клиент: автоматически переподключаться при обрыве связи со шлюзом.
Команда инфраструктуры: задачи
Масштабировать шлюзы горизонтально (добавлять машины), мониторить CPU, число соединений и задержку обработки на каждом шлюзе.
Цифры для ориентира
Внутри одного ЦОД один проход обычно занимает меньше 1 ms. При перегрузке шлюза это время вырастает до десятков и сотен ms.
На графике
Растёт вслед за онлайном и нагрузкой · задержка обработки на шлюзе, CPU и число соединений шлюза
Где смотреть
Смотреть CPU и число соединений шлюза, Recv-Q его сокетов (ss, netstat) и разницу задержки до шлюза и после него. Для вызовов HTTP и gRPC через service mesh сравнить стандартную метрику Istio istio_request_duration_milliseconds на стороне отправителя (reporter=source) и получателя (reporter=destination)
Подтверждает
Время обработки на игровом сервере не меняется, растёт только задержка на участке шлюза, и в это же время CPU шлюза упирается в потолок или копится Recv-Q
Опровергает
Если маршрут в обход этого шлюза (прямое подключение, другой шлюз) тормозит так же, проблема в линии связи или на игровом сервере
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
С service mesh (Istio и т. п.) добавляется ещё одно звено: sidecar-прокси (Envoy), который работает рядом с каждым сервером. Запрос между сервисами проходит сначала через sidecar отправителя, потом через sidecar получателя, и чем больше функций добавлено в прокси (например, сбор логов и метрик), тем больше время обработки и ожидания.
Реальные инциденты
Riot Games 2020: Перегрузка edge-хоста на серверах League of Legends в Европе и Бразилии

Источники

  1. The Unique Architecture behind Amazon Games’ Seamless MMO New World AWS
    В New World клиент подключается к одному из 4 входных серверов (REP) с публичным адресом и через него обменивается данными со стоящими за ним серверами симуляции (хабами)
  2. Designs, Lessons and Advice from Building Large Distributed Systems Google
    Пленарный доклад Jeff Dean на LADIS 2009. Путь туда и обратно внутри одного ЦОД около 0,5 ms
  3. Site Reliability Engineering, Chapter 22: Addressing Cascading Failures Google
    При перегрузке очередь растёт, и ожидание становится в несколько раз дольше обработки (обработка 100 ms, очередь в 10 раз больше числа потоков: 1,1 с)
  4. Performance and Scalability Istio
    В режиме sidecar запрос проходит по очереди через sidecar-прокси отправителя и получателя. Чем больше функций, тем длиннее путь обработки внутри прокси, а сбор телеметрии увеличивает ожидание следующего запроса
  5. What is Envoy Envoy
    Envoy работает отдельным процессом рядом с каждым сервером приложений, и приложение обменивается данными через Envoy на localhost
  6. Istio Standard Metrics Istio
    istio_request_duration_milliseconds (распределение времени обработки запросов HTTP и gRPC), метка reporter различает прокси отправителя (source) и получателя (destination)
  7. netstat(8) — Linux manual page net-tools
    Recv-Q: число байтов в подключённом сокете, которые программа пользователя ещё не забрала

Смотрите также

Тот же слой: L13 Архитектура и эксплуатация серверов

Причины с тем же симптомом (Задержка ввода) на других слоях

Карточка в основной версии с иллюстрациями и экспериментами