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

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

Архитектура с блокирующим вводом-выводом Blocking I/O model

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

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

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

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

Симптомы
Слоумо, Задержка ввода
Факторы
Остановка
У кого
Весь сервер
Когда
При наплыве игроков, Вечерний пик
Ответственные
Основной ответственный Команда разработки · Разработка сервера
Команда разработки: задачи
Перейти на асинхронный ввод-вывод на базе epoll, IOCP или io_uring.
На графике
Растёт вслед за онлайном и нагрузкой · время ответа, число потоков
Где смотреть
Посмотреть через pidstat -w -t число потоков игрового сервера и добровольные переключения контекста по потокам (cswch/s, сколько раз поток останавливался в ожидании ресурса) и сравнить с временем ответа в зависимости от онлайна
Подтверждает
С ростом онлайна время ответа круто растёт, потоков становится столько же, сколько соединений, и большинство из них почти не используют CPU, зато часто добровольно переключаются (ждут сокет)
Опровергает
Если потоки не ждут и постоянно загружают CPU, это перегрузка расчётами («Превышение бюджета тика»)
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)

Источники

  1. epoll(7) — Linux manual page Linux man-pages
    Механизм уведомлений о событиях ввода-вывода, который масштабируется на одновременное наблюдение за множеством fd
  2. I/O Completion Ports Microsoft
    Способ Windows обрабатывать множество асинхронных операций ввода-вывода заранее созданным пулом потоков
  3. pidstat(1) — Linux manual page sysstat
    cswch/s в выводе -w: добровольные переключения контекста, когда поток сам останавливается в ожидании ресурса. -t выводит данные по потокам

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

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

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

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