Глава 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 — приложение голодает |