Простаивающее ядро CPU ради экономии энергии переходит в глубокое состояние сна (C-state) и снижает частоту. Когда приходит пакет или срабатывает таймер, на пробуждение и подъём частоты уходит время, и к обработке даже маленьких пакетов добавляется задержка.
Почему Политика управления частотой в ОС (governor) или настройки питания в BIOS разрешают глубокие C-state и низкие частоты → Следствие Каждое пробуждение ядра из глубокого сна добавляет до сотен µs, а если частота зафиксирована на низком уровне, медленнее идёт сам расчёт тика → На экране Обычно это почти незаметно, но при большом числе межсерверных вызовов задержки складываются, и в часы затишья ответ, как ни странно, приходит позже: задержка ввода. Если частота зафиксирована на низком уровне, при наплыве игроков тики отстают: слоумо
Основной ответственный Команда инфраструктуры · Серверная инфраструктура
Команда инфраструктуры: задачи
Перевести настройки питания в BIOS в режим производительности, а governor в ОС в performance (scaling_governor в cpufreq). На серверах, чувствительных к задержке, ограничить глубокие C-state (профиль tuned latency-performance, /dev/cpu_dma_latency в PM QoS, параметр ядра intel_idle.max_cstate). После изменений сравнить RTT внутри ЦОД, джиттер времени тика и энергопотребление.
Цифры для ориентира
По таблице драйвера intel_idle в Linux 6.12 неглубокое состояние C1 у серверных CPU Intel требует для пробуждения 1–2 µs, а глубокое C6 от 133 µs (Skylake-SP) до 290 µs (Sapphire Rapids). Один раз это немного, но если запрос проходит через несколько серверов, задержки складываются. Чем дольше ожидаемый простой, тем более глубокое состояние выбирает ядро ОС, поэтому чаще это проявляется на ненагруженных серверах, куда пакеты приходят изредка. Универсальный governor powersave в cpufreq фиксирует самую низкую частоту из допустимого диапазона (одноимённый алгоритм intel_pstate регулирует частоту по нагрузке).
На графике
Высоко с самого начала · RTT внутри ЦОД, частота ядер
Где смотреть
Посмотреть через cpupower monitor долю времени в каждом C-state и фактическую частоту по ядрам, проверить для каждого state в /sys/devices/system/cpu/cpu0/cpuidle/ поля name, latency (время пробуждения в µs) и usage, а также scaling_governor в cpufreq и текущий профиль через tuned-adm active
Подтверждает
Простаивающие ядра подолгу находятся в самом глубоком C-state или их частота держится около минимальной, а после перехода на governor performance и неглубокие C-state RTT и джиттер мелких запросов снижаются
Опровергает
Если после изменений разница не больше десятков µs, этой причиной можно пренебречь. Если всплески измеряются в ms, это «CPU steal (виртуальная машина)» или другой слой
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
На bare-metal-серверах в ЦОД смотрят и настройки питания в BIOS (прошивке), и настройки ОС. В облаке менять C-state и частоту из ОС можно только на некоторых типах инстансов, а в AWS настройки по умолчанию ориентированы на максимальную производительность, так что обычно их можно не трогать. Профиль tuned latency-performance в дистрибутивах семейства Red Hat ставит governor performance и через PM QoS разрешает только неглубокие C-state. Отключение энергосбережения увеличивает энергопотребление, поэтому его применяют только на серверах, чувствительных к задержке.
Источники
CPU Idle Time ManagementLinux kernel У каждого состояния сна есть время выхода (exit latency) и минимальное время пребывания (target residency), а глубину выбирают по ожидаемому времени простоя. В sysfs для каждого state есть latency, usage и time. Глубокие состояния ограничивают через PM QoS (/dev/cpu_dma_latency) и intel_idle.max_cstate
drivers/idle/intel_idle.c (Linux v6.12)Linux kernel Время пробуждения серверных CPU Intel по C-state: Skylake-SP C1 2 µs, C1E 10 µs, C6 133 µs; Ice Lake C6 170 µs; Sapphire Rapids C1 1 µs, C6 290 µs
CPU Performance ScalingLinux kernel Через scaling_governor можно посмотреть и сменить governor. performance запрашивает самую высокую частоту из допустимого диапазона, powersave самую низкую
intel_pstate CPU Performance Scaling DriverLinux kernel Алгоритм powersave в intel_pstate, в отличие от универсального governor powersave, регулирует частоту по нагрузке (похоже на schedutil и ondemand)
Chapter 2. Getting started with TuneDRed Hat Профиль latency-performance отключает энергосбережение, ставит governor performance и через PM QoS разрешает только неглубокие C-state. Текущий профиль показывает tuned-adm active
Processor state control for Amazon EC2 Linux instancesAWS Управлять C-state и P-state из ОС можно только на некоторых типах инстансов, и их можно менять, чтобы снизить задержку. Настройки по умолчанию дают максимальную производительность и подходят для большинства задач. У Graviton частота фиксированная, и ОС ею не управляет