System Design Space

    Глава 153

    Обновлено: 15 февраля 2026 г. в 08:31

    Performance Engineering

    Прогресс части0/13

    Системный подход к производительности: latency optimization, profiling, capacity planning и performance budget в production.

    Контекст

    Observability & Monitoring Design

    Без метрик, логов и трассировки performance engineering превращается в догадки.

    Открыть главу

    Performance Engineering - это системная дисциплина, где производительность проектируется заранее и управляется на протяжении всего жизненного цикла системы. Главный фокус: оптимизация latency, профилирование узких мест и capacity planning под рост нагрузки без потери стабильности.

    Latency optimization

    Путь запроса и budget

    Разбейте end-to-end запрос на этапы (edge, API, DB, cache, external dependencies) и задайте latency budget для каждого сегмента.

    Снижение сетевых round-trips

    Batching, connection pooling, keep-alive, co-location сервисов и сокращение chatty interaction между микросервисами.

    Оптимизация data access

    Правильные индексы, query plan profiling, read-through cache, локальность данных и контроль N+1 паттернов.

    Queue и async boundaries

    Выносите некритичные операции в async pipeline, чтобы защищать p95/p99 пользовательских запросов.

    Tail latency control

    Hedged requests, timeout budget, adaptive retry и защита от retry storms при деградации.

    Concurrency и backpressure

    Ограничивайте параллелизм на критичных ресурсах (DB, thread pool, external API), чтобы не допускать collapse при пиках.

    Деградация по приоритетам

    Определяйте graceful degradation: сначала отключаются второстепенные функции, а критичный пользовательский путь сохраняет SLA.

    Related

    Event-Driven Architecture

    Асинхронные границы и очередь задач часто убирают latency с синхронного пути.

    Открыть главу

    Profiling: где именно теряется время

    CPU profiling

    Ищите hot paths и лишние аллокации в бизнес-коде и сериализации.

    Memory profiling

    Обнаруживайте утечки, fragmentation и pressure на GC/allocator.

    I/O profiling

    Отдельно измеряйте network wait, disk wait, lock contention и external API latency.

    Distributed tracing

    Связывайте профиль с трассами, чтобы видеть, где именно запрос теряет время в distributed call graph.

    Lock contention и thread states

    Разбирайте блокировки, очередь ожидания и состояние потоков: многие latency spikes появляются из-за contention, а не CPU.

    GC и runtime pauses

    Анализируйте stop-the-world паузы, pressure по памяти и churn короткоживущих объектов, особенно в high-QPS сервисах.

    SLO и performance budget по слоям

    Edge / API gateway

    20-40 ms

    Маршрутизация, auth-check, rate limiting без заметной задержки для клиента.

    • Кэш policy/keys и минимизация синхронных внешних вызовов.
    • Connection reuse + TLS session resumption.
    • Жёсткие timeout на downstream и fallback-ответы.

    Application service

    60-120 ms

    Основная бизнес-логика и orchestration соседних сервисов в рамках SLO.

    • Параллелизация независимых вызовов и запрет chatty patterns.
    • Идемпотентные retries только в пределах retry budget.
    • Ограничение fan-out и защита от n+1 запросов.

    Data access (DB/cache/search)

    40-120 ms

    Стабильные p95/p99 на данных при росте объёма и конкурентности.

    • Query plan regression checks перед релизом.
    • Read/write separation, локальный cache и hot key mitigation.
    • Контроль pool saturation, lock wait и slow queries.

    External dependencies

    зависит от SLA провайдера

    Ограничить blast radius внешней деградации на пользовательский путь.

    • Circuit breaker + fallback + bulkhead isolation.
    • Async queue для некритичных интеграций.
    • Отдельный SLO для external hops и контракт по timeout.

    Capacity planning

    • Определите ключевые workload units: requests/sec, events/sec, active users, data growth per day.
    • Стройте baseline по p50/p95/p99 latency, saturation и error rate под текущей нагрузкой.
    • Считайте headroom отдельно для average и peak: минимум 20-30% для критичных контуров.
    • Проверяйте масштабирование узких мест по одному: compute, storage IOPS, network egress, queue throughput.
    • Планируйте capacity вместе с release roadmap и сезонностью, а не только по прошлым графикам.
    • Разделяйте online-контур и batch/analytics-контур, чтобы фоновая нагрузка не съедала user-facing budget.
    • Учитывайте стоимость: capacity plan должен балансировать SLO, устойчивость и FinOps-ограничения.

    Матрица нагрузочного тестирования

    Steady-state baseline

    Ровная нагрузка 30-60 минут

    Проверить стабильность p95/p99 и saturation на типичном production-профиле.

    Критерии успеха

    • p95/p99 остаются в budget без роста error rate.
    • CPU/Memory/IO находятся ниже saturation-триггеров.
    • Нет роста queue lag и thread wait.

    Step-load growth

    Пошаговое увеличение нагрузки каждые 5-10 минут

    Найти порог деградации и увидеть первый bottleneck.

    Критерии успеха

    • Известна точка, где начинает расти tail latency.
    • Понятно, какой ресурс saturates первым (CPU, DB, network, lock).
    • Есть план, как сдвинуть bottleneck на следующий релиз.

    Spike / burst test

    Резкий всплеск в 2-5x от baseline

    Проверить поведение auto-scaling, queue buffering и rate limiting под всплеском.

    Критерии успеха

    • Сервис не уходит в cascading failure.
    • Ошибки остаются контролируемыми и recoverable.
    • Время возврата к норме прогнозируемо.

    Soak / endurance

    Длительный тест 6-24 часа

    Найти утечки памяти, деградацию кэша, накопление fragmentation и дрейф latency.

    Критерии успеха

    • Нет monotonic роста memory/FD/queue depth.
    • GC/allocator паузы не ухудшаются со временем.
    • p99 не дрейфует при стабильной входной нагрузке.

    Optimization playbook: от гипотезы до эффекта

    Шаги Optimization playbook

    6 шагов от baseline до устойчивого эффекта
    Измерение
    Диагностика
    Эксперимент
    Валидация
    Эксплуатация
    Нажмите «Запуск», чтобы пройти процесс оптимизации по шагам.

    Типичные антипаттерны

    Оптимизировать без baseline-метрик и без воспроизводимого нагрузочного сценария.

    Смотреть только на среднюю задержку и игнорировать p95/p99/p999.

    Пытаться лечить latency только железом, не устраняя архитектурные bottleneck-ы.

    Делать бесконечные retries без budget и backoff при частичной деградации.

    Планировать capacity без учёта data growth и фич, которые изменят профиль нагрузки.

    Смешивать оптимизации производительности и функциональные изменения в одном релизе без изоляции эффекта.

    Игнорировать влияние GC/allocator/lock contention и фокусироваться только на SQL/кэше.

    Практический чеклист

    • Для критичных user-journey определены p95/p99 SLO и latency budget по слоям.
    • Есть регулярный baseline-тест (steady-state) и стресс-сценарий (spike/step-load).
    • Профилирование (CPU/memory/IO/lock) выполняется до и после оптимизаций.
    • Контролируются saturation-метрики: pool utilization, queue depth, thread wait, GC pause.
    • Retry, timeout и circuit breaker согласованы между сервисами и не создают retry storms.
    • Performance regression checks включены в release process для ключевых API/queries.
    • Capacity план пересматривается вместе с roadmap и сезонными пиками нагрузки.
    • Команда фиксирует итоги оптимизаций в runbook/ADR: что помогло, где риски, как мониторить.

    Связанные главы

    References

    Производительность - это не разовый benchmark, а постоянный engineering feedback loop.