Если соединение какое-то время простаивало, TCP снова уменьшает окно перегрузки (объём, который можно отправить за раз), и внезапно понадобившийся большой объём данных уходит в несколько заходов.
Почему По простаивавшему соединению отправляется большой объём данных, например при входе в город → Следствие Окно перегрузки уменьшено, и передача растягивается на несколько RTT → На экране Сразу после входа окружающие персонажи и NPC появляются с опозданием на несколько RTT (тем заметнее, чем дальше сервер)
Основной ответственный Команда инфраструктуры · Серверная инфраструктура · Совместно Команда разработки · Разработка сервера
Команда разработки: задачи
Уменьшить объём данных при входе (сначала отправлять самое необходимое).
Команда инфраструктуры: задачи
Выключить tcp_slow_start_after_idle (Linux, настройка на весь сервер).
Цифры для ориентира
Если простой дольше RTO, окно перегрузки начинает уменьшаться и после долгого простоя опускается примерно до 14 KB (10 пакетов). Тогда 100 KB не уйдут за один раз и будут переданы за 3 RTT.
На графике
Высоко только у некоторых · время передачи сразу после входа (у игроков с большим RTT)
Где смотреть
Проверить значение sysctl net.ipv4.tcp_slow_start_after_idle и в момент входа в локацию после простоя посмотреть в ss -ti, не уменьшился ли cwnd (окно перегрузки) этого соединения
Подтверждает
Параметр равен 1 (по умолчанию), в момент входа после простоя cwnd падает примерно до 10, и передача растягивается на несколько RTT. Чем больше RTT у игрока, тем позже всё появляется, а при значении 0 эффект пропадает
Опровергает
Если cwnd остаётся большим, а объекты всё равно появляются поздно, дело в обработке входа на сервере («Лавина спавна при входе в людное место»)
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Источники
IP SysctlLinux kernel tcp_slow_start_after_idle по умолчанию включён: после простоя длиной в RTO окно перегрузки уменьшается (по схеме RFC 2861)
RFC 5681: TCP Congestion ControlIETF Если данные не отправлялись дольше RTO, окно перегрузки уменьшается до окна перезапуска min(IW, cwnd) или меньше и начинается медленный старт