awesome-everything EN
↑ Обратно к восхождению

Производительность

Hardware counters, профили холодного старта и безопасность профилей

Суть Флейм-граф называет функцию. HPC говорят почему: memory-stalled при IPC 0.5 или compute-bound при 3.0. Холодный старт и steady-state — разные профили, разные фиксы.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 16 min

JSON-парсер занимает 30% CPU сервиса на флейм-графе. Команда переходит на более быстрый парсер — экономит 10%. Инженер запускает perf с счётчиками cache-miss: IPC = 0.4, процент cache-miss = 12%. Парсер memory-stalled, а не compute-bound. Реструктуризация layout’а входных данных экономит 50%.

Hardware performance counters (HPC)

Флейм-граф называет функцию. Он не говорит, что именно CPU делает внутри неё. Hardware performance counters открывают цену на уровне кремния.

Ключевые счётчики:

  • cycles — потреблённые сырые такты CPU
  • instructions — завершённые инструкции. IPC = instructions / cycles.
  • cache-misses — количество промахов кэша L3 (каждый промах = ~100 нс задержки)
  • branch-misses — количество неверных предсказаний ветвлений (каждое = ~15 тактов штрафа)
  • page-faults — количество page fault’ов OS
  • dTLB-load-misses — количество промахов data TLB (Translation Lookaside Buffer)

Интерпретация IPC:

  • IPC < 1.0 — memory-bound. CPU заторможен в ожидании данных из кэша или RAM. Алгоритмические переписывания не помогут; рычаги — исправления layout’а данных (struct-of-arrays, cache-friendly обход, prefetching).
  • IPC 1.0–2.5 — смешанный. Исследуй конкретные промахи.
  • IPC > 2.5 — compute-bound. Алгоритм выполняет полезную работу; рычаги — векторизация или более умная математика.

Использование на Linux:

# Профилировать cycles, instructions, cache-misses, branch-misses вместе
perf record -e cycles,instructions,cache-references,cache-misses,branch-misses \
    -g ./myapp workload
perf report  # показывает разбивку счётчиков по функциям
СигналОтвет на вопросНаправление фикса
IPC < 1.0 + высокий cache-missMemory-stalled: CPU ждёт RAMLayout данных, prefetch, меньшие структуры
IPC > 2.5 + низкий cache-missCompute-bound: алгоритм — пределВекторизация, SIMD, более умный алгоритм
Высокий branch-missesПредсказатель ветвлений ошибается на нерегулярных данныхБезветвевой код, отсортированные входные данные, таблицы поиска

Профили холодного старта vs установившегося режима

Профиль первых 60 секунд после запуска процесса абсолютно не похож на профиль после часа трафика.

Фаза холодного старта:

  • JIT-рантаймы компилируют горячие пути кода (HotSpot, V8, .NET CLR) — компиляция проявляется как CPU-цена.
  • Кэши холодные: пулы соединений устанавливаются, лениво загружаемые модули загружаются, L3-кэш пуст.
  • Оптимизации: AOT-компиляция (GraalVM native-image, .NET ReadyToRun), нетерпеливая загрузка модулей, предварительное прогревание соединений.

Фаза установившегося режима:

  • JIT полностью оптимизирован; кэши тёплые.
  • Оптимизации: алгоритмические фиксы, изменения layout’а данных, снижение конкуренции за локи.

Путаница между ними — частая ошибка: команда оптимизирует hotspot установившегося режима и удивляется, что события scale-out автоскейлера всё ещё деградируют tail latency — путь холодного старта никогда не измерялся.

Production-grade профилирование захватывает оба: профиль холодного старта (первые 30-60 секунд после запуска) и профиль установившегося режима (после прогрева под репрезентативной нагрузкой). Поддерживай отдельные дашборды для обеих фаз.

Безопасность профилей

Профиль содержит имена функций — нередко включающие приватные внутренние API, недокументированные эндпоинты и пути сборки, раскрывающие среду деплоя. Memory-профили при плохой конфигурации могут включать аргументы аллокации (строковые содержимое, JSON-тела).

Реальные инциденты: pprof-эндпоинты случайно открыты через /debug/pprof на публичном порту, раскрывая пути исходников и имена feature-флагов. Профайлеры аллокаций, утекающие session-токены из строк запросов.

Production-дисциплина:

  • pprof-эндпоинты привязаны только к localhost или аутентифицированному admin-only пути.
  • eBPF-профайлеры запускаются с минимальными capabilities (CAP_PERFMON на Linux 5.8+, не CAP_SYS_ADMIN).
  • Бэкенды непрерывного профилирования защищены RBAC по командам.
  • Экспорт профилей требует согласования с менеджером.

Профили — операционные данные с последствиями для безопасности, а не «только для ops артефакты, которыми безопасно делиться».

Почему это работает

Linux 5.8 (2020) разделил возможность профилирования из CAP_SYS_ADMIN в отдельную CAP_PERFMON. Это было сделано специально, чтобы профилировочные инструменты могли работать без предоставления полного системного администрирования. В мультитенантных Kubernetes-кластерах eBPF-профайлеры должны запускаться только с CAP_PERFMON, в namespace-области, чтобы предотвратить межарендную видимость стековых фреймов.

Викторина

Флейм-граф показывает функцию десериализации JSON, потребляющую 35% CPU. Hardware counters показывают IPC = 0.4 и процент cache-miss = 11%. Какой фикс с наибольшей вероятностью поможет?

Викторина

Команда оптимизирует CPU-hotspot установившегося режима. После деплоя события scale-out всё ещё вызывают высокий tail latency на 60 секунд. Какое измерение они пропустили?

Вспомните перед уходом
  1. 01
    Объясни, почему hardware performance counters необходимы вместе с stack-sampling профайлерами, и разбери конкретный сценарий диагностики, где флейм-граф в одиночку вводил бы в заблуждение.
  2. 02
    Каковы production-ограничения безопасности при запуске профайлеров и в чём принцип минимальных привилегий?
Итог

Stack-sampling профайлеры называют горячую функцию; hardware performance counters называют, почему она горячая. IPC ниже 1.0 с высоким cache-miss идентифицирует memory-stalled код, где исправления layout’а данных (меньшие структуры, cache-friendly обход) превосходят алгоритмические переписывания. IPC выше 2.5 идентифицирует compute-bound код, где рычаги — векторизация или алгоритмические улучшения. Профили холодного старта захватывают фазу JIT-компиляции и прогрева кэша, доминирующую в первые 30-60 секунд после запуска процесса — критично для корректности автоскейлера при scale-out. Профили установившегося режима захватывают production-поведение после прогрева. Профили раскрывают имена функций и могут раскрывать полезные нагрузки аллокаций; привязывай pprof-эндпоинты к localhost, запускай eBPF-профайлеры с CAP_PERFMON (не CAP_SYS_ADMIN), защищай доступ к бэкенду RBAC.

Связанные уроки
встречается в159
Продолжить восхождение ↑Непрерывное профилирование в масштабе: затраты, CI-гейты, корреляция с трейсами и антипаттерны
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.