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

Анатомия игровых лагов › L8 Сокеты и протоколы

Политика для медленных клиентов (slow consumer) Slow-consumer policy

ID причины sk-slow-client · Основной ответственный Команда разработки · Разработка сервера

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

Если для клиента постоянно копятся неотправленные данные, сервер выбрасывает устаревшие обновления или разрывает соединение.

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

Симптомы
Телепортация, Дисконнект
Факторы
Потери
У кого
Только у меня
Когда
При наплыве игроков
Ответственные
Основной ответственный Команда разработки · Разработка сервера
Команда разработки: задачи
Сократить объём отправки (частота обновлений в зависимости от расстояния), продолжать отправку в пониженном качестве, уменьшить объём данных, который копится в ядре (TCP_NOTSENT_LOWAT в Linux).
Цифры для ориентира
При буфере отправки 256 KB и подключении 30 KB/s в буфере копится отставание больше чем на 8 секунд. К тому же Linux может автоматически увеличивать этот буфер до нескольких MB.
На графике
Высоко только у некоторых · Send-Q по соединениям, число выброшенных обновлений по клиентам
Где смотреть
Посмотреть, что игровой сервер пишет по каждому клиенту: длину очереди отправки, число выброшенных обновлений, причины обрывов. Заодно проверить на сервере через ss -tni Send-Q и cwnd этого соединения
Подтверждает
Send-Q постоянно заполнен только у соединений игроков, которых телепортирует или выкидывает из игры, а в игровом логе записаны выброшенные обновления этого игрока или обрыв из-за переполнения очереди отправки
Опровергает
Если Send-Q пуст, а телепортация есть, отправка на сервере ни при чём. Дело в потерях на подключении этого игрока («Потери на беспроводном участке») или в интерполяции на экране
Чем проверить
Нужны логи и метрики игрового сервера или клиента

Источники

  1. IP Sysctl Linux kernel
    tcp_wmem: максимум автоматически настраиваемого буфера отправки по умолчанию от 64 KB до 4 MB (в зависимости от памяти). tcp_notsent_lowat и TCP_NOTSENT_LOWAT ограничивают объём ещё не отправленных данных
  2. net/ipv4/tcp_diag.c (Linux v6.12) Linux kernel
    Значения Recv-Q и Send-Q в ss: у слушающего сокета это число подключений, ждущих accept, и лимит backlog, у подключённого сокета это байты, ещё не прочитанные приложением, и отправленные байты без ACK

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

Тот же слой: L8 Сокеты и протоколы

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

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