Перейти к содержанию

Глава 7: Анализ контейнеров

Обзор

Контейнеры используют cgroups для ограничения ресурсов. Самая коварная проблема — CPU throttling: контейнер молча приостанавливается при превышении квоты.

Функции

Функция Что делает
detectRuntime() Проверяет K8s service account, /.dockerenv, паттерны cgroup
detectCgroupVersion() cgroup.controllers (v2) или /cpu (v1)
extractContainerID() 64-симв hex ID из пути cgroup
collectCgroupV2Metrics() cpu.max, cpu.stat, memory.max/current
collectCgroupV1Metrics() cpu.cfs_quota_us, cpu.stat, memory.limit_in_bytes

CPU throttling — тихий убийца

┌─ Период = 100мс ──────────────────────────────────────────┐
│  Квота = 50мс            Зона throttling                   │
│  ┌─────────────────────┐ ┌────────────────────────────────┐│
│  │  Процесс работает   │ │  Процесс ЗАМОРОЖЕН.           ││
│  │  используя CPU      │ │  Код не выполняется. Ждёт.    ││
│  └─────────────────────┘ └────────────────────────────────┘│
│  0мс               50мс                              100мс│
└────────────────────────────────────────────────────────────┘

Важное отличие v1 от v2

v1 отдаёт throttled_time в наносекундах, v2 в микросекундах. melisai нормализует v1, деля на 1000.

Интерпретация throttling

nr_throttled Оценка
0 Нет throttling — квота достаточна
< 100 Редкие всплески
100-1000 Регулярный throttling — увеличьте лимит CPU
> 1000 Серьёзный throttling — приложение голодает

Далее: Глава 8 — Системный коллектор