Переезд на bare-metal не отменяет талон на процессор. Разберём типовой отказ K3s: средняя загрузка узла невысока, а p99 API вылетает за SLO во время всплесков. Поверхностный диагноз — «виртуализация тормозит, нужна своя машина». Но свободный CPU узла ещё не означает, что контейнеру разрешено его использовать. На cgroup v2 проверяем конкретный контейнер: kubectl exec -n prod api-0 -- cat /sys/fs/cgroup/cpu.max и kubectl exec -n prod api-0 -- cat /sys/fs/cgroup/cpu.stat. Здесь prod и api-0 — пример namespace и pod. Значение cpu.max «100000 100000» задаёт квоту в одно ядро; несколько потоков могут потратить её раньше конца периода. Снимаем дельты nr_periods, nr_throttled и throttled_usec на интервале деградации. Доля периодов с throttling — не процент потерянной производительности. Причинность проверяем повтором нагрузки с увеличенным CPU limit и сравнением p99. Если после изменения квоты хвост задержек сжался при прежней нагрузке, покупка железа лечила бы неверный диагноз. Но снимать lim...

Переезд на bare-metal не отменяет талон на процессор. Разберём типовой отказ K3s: средняя загрузка узла невысока, а p99 API вылетает за SLO во время всплесков | Сетка — социальная сеть от hh.ru