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