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

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

Троттлинг CPU в контейнере (квота CFS) Container CPU throttling (CFS quota)

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

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

Если у контейнера задан лимит CPU, то, израсходовав квоту в пределах периода (обычно 100 ms), он принудительно останавливается до конца периода (троттлинг).

Почему В Kubernetes или похожей системе контейнеру игрового сервера задан лимит CPU (limit) → Следствие В момент пиковых расчётов тика квота кончается, и контейнер стоит десятки ms до следующего периода → На экране Средняя загрузка CPU низкая, но время тика периодически скачет: микрофризы, слоумо

Симптомы
Микрофризы, Слоумо
Факторы
Остановка, Джиттер
У кого
Весь сервер
Когда
При наплыве игроков, Изредка, случайно
Ответственные
Основной ответственный Команда инфраструктуры · Серверная инфраструктура · Совместно Команда разработки · Разработка сервера
Команда разработки: задачи
Подогнать число рабочих потоков под лимит CPU (чтобы рантайм не создавал потоки по числу всех ядер хоста).
Команда инфраструктуры: задачи
Задать лимит CPU с запасом или убрать его и выделить ядра, следить за числом троттлингов (nr_throttled).
Цифры для ориентира
Если на сервере с лимитом в 2 ядра одновременно работают 8 потоков, квота периода 100 ms расходуется за 25 ms, и следующие 75 ms сервер стоит.
На графике
Растёт вслед за онлайном и нагрузкой · число троттлингов (nr_throttled), время тика сервера
Где смотреть
Смотреть прирост nr_throttled и throttled_usec (в cgroup v1 nr_throttled и throttled_time) в cpu.stat cgroup контейнера вместе со временем тика сервера
Подтверждает
Средняя загрузка CPU ниже лимита, но nr_throttled и throttled_usec постоянно растут, и их рост совпадает со всплесками времени тика
Опровергает
Если nr_throttled не растёт, причина в другом. Если CPU недодают самой виртуальной машине, это «CPU steal (виртуальная машина)»
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)

Источники

  1. CFS Bandwidth Control Linux kernel
    Если квота на период израсходована, потоки стоят до следующего периода (троттлинг). Период по умолчанию 100 ms, статистика nr_throttled
  2. Control Group v2 Linux kernel
    cpu.max имеет формат «$MAX $PERIOD» (квота, период), значение по умолчанию «max 100000» (период 100 ms)
  3. Resource Management for Pods and Containers Kubernetes
    CPU limit контейнера: жёсткий лимит, который ядро обеспечивает троттлингом CPU

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

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

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

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