Выбор ответа Senior Производительность и профилирование обновлено

CPU throttling в контейнере

Вопрос

Под с limits.cpu: 1 показывает среднюю загрузку 40% одного ядра, но p99 задержки скачет до 300 мс. Какая вероятная причина?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Троттлинг CFS: квота периода выбирается, и процесс замирает. Лимит CPU в Kubernetes реализован квотой CFS на период (по умолчанию 100 мс).

Варианты ответа

  1. Kubernetes не даёт поду больше 40% ядра без явного requests
  2. Слишком маленький requests памяти, и под уходит в своп
  3. Троттлинг CFS: квота периода выбирается, и процесс замираетправильный ответ
  4. Средняя загрузка 40% исключает проблемы с CPU, искать надо в сети

Разбор

Лимит CPU в Kubernetes реализован квотой CFS на период (по умолчанию 100 мс). Многопоточное приложение может съесть квоту за первые 30 мс периода и простоять остальные 70: средняя загрузка низкая, а запросы застревают. Видно по container_cpu_cfs_throttled_periods_total. Лечится увеличением лимита, отказом от CPU-лимита для критичных сервисов или настройкой числа потоков рантайма (GOMAXPROCS и аналоги).

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.