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

Анатомия игровых лагов › L7 ОС сервера (ядро)

Избыток потоков и переключение контекста Thread oversubscription, context switching

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

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

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

Почему Потоков сотни или тысячи (например, свой поток на каждое соединение) → Следствие Растут затраты на переключение контекста (смену выполняемого потока) и число промахов кэша → На экране CPU занят, но производительность низкая, тики неравномерные: микрофризы, слоумо

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

Источники

  1. Quantifying The Cost of Context Switch (ExpCS 2007) ACM
    Прямая стоимость переключения контекста около 3,8 µs, косвенная с учётом влияния на кэш от нескольких µs до 1 000 µs и больше (в условиях измерения)
  2. vmstat(8) — Linux manual page procps-ng
    Поля cs (число переключений контекста в секунду) и r (число выполняемых или ожидающих выполнения процессов)
  3. I/O Completion Ports Microsoft
    Множество асинхронных операций ввода-вывода обрабатывает заранее созданный пул потоков через IOCP, а число одновременно работающих потоков ограничивается по числу процессоров
  4. pidstat(1) — Linux manual page sysstat
    cswch/s в выводе -w: добровольные переключения контекста, когда поток сам останавливается в ожидании ресурса. nvcswch/s: принудительные переключения, когда поток израсходовал квант времени. -t выводит данные по потокам

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

Тот же слой: L7 ОС сервера (ядро)

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

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