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

Анатомия игровых лагов › L9 Процесс игрового сервера

Затраты на сериализацию и сжатие Serialization / compression cost

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

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

Превращение данных для отправки в байты и их сжатие тоже требуют CPU, и при большом числе игроков эти затраты резко растут.

Почему Для каждого обновления структура преобразуется в байты и сжимается → Следствие Затраты растут пропорционально квадрату числа игроков → На экране Отправка запаздывает: задержка ввода

Симптомы
Задержка ввода
Факторы
Остановка, Задержка
У кого
Одна локация или канал
Когда
При наплыве игроков
Ответственные
Основной ответственный Команда разработки · Разработка сервера
Команда разработки: задачи
Переиспользовать один собранный пакет для многих получателей, использовать лёгкий формат.
На графике
Растёт вслед за онлайном и нагрузкой · загрузка CPU сервера, CPU потока, собирающего пакеты
Где смотреть
Сравнить через perf top -p долю функций сериализации, сжатия и шифрования (включая функции библиотек вроде zlib, LZ4, OpenSSL) в процессорном времени игрового процесса при малом числе игроков и при наплыве
Подтверждает
Чем больше игроков, тем выше доля функций сериализации, сжатия и шифрования, и первым упирается в CPU поток, собирающий пакеты
Опровергает
Если доля этих функций мала, дело в расчёте видимости или игровой логике
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
Если соединение шифруется (TLS, DTLS и т. п.), CPU тратится ещё и на шифрование и расшифровку. Шифрование делается отдельно для каждого соединения, поэтому, даже если один собранный пакет переиспользуется для многих получателей, шифровать его приходится столько раз, сколько получателей. Симметричные шифры вроде AES-GCM настолько быстры, что одно ядро обрабатывает несколько GB в секунду, и обычно их доля невелика. Но скорость сильно зависит от размера единицы шифрования (записи), и когда, как в играх, много мелких пакетов, затраты на байт растут. При рукопожатии, которое выполняется один раз на подключение, сервер подписывает данные ключом сертификата и вычисляет обмен ключами (ECDHE). Одно ядро успевает в секунду от примерно 1 100 (RSA 2048) до 18 000 (ECDSA P-256) подписей и около 9 000 обменов ключами, поэтому при наплыве входов это заметная нагрузка.

Источники

  1. Introduction to Iris in Unreal Engine Epic Games
    Реплицируемое состояние хранится в одной квантованной копии, что сокращает дорогую работу, а её результат используют сразу несколько подключений
  2. VALORANT's 128-Tick Servers Riot Games
    Сравнивать реплицируемые переменные для каждого клиента каждый кадр и собирать изменившиеся значения медленно: память читается вразброс, и это сильно нагружает CPU сервера
  3. How "expensive" is crypto anyway? Cloudflare
    Замеры BoringSSL: AES-128-GCM около 3,7 GB в секунду (сильно зависит от размера записи). Одно ядро в секунду выполняет 1 120 подписей RSA 2048, 18 477 подписей ECDSA P-256 и 9 394 обмена P-256 ECDHE. На edge-серверах Cloudflare TLS-библиотека расходует около 1,8% CPU
  4. perf-top(1) — Linux manual page perf
    В реальном времени показывает долю CPU работающего процесса (-p) по функциям (символам)

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

Тот же слой: L9 Процесс игрового сервера

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

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