Как оценивать производительность автоматизированной системы: краткий ответ
Производительность автоматизированной системы оценивают по связке показателей: времени отклика, throughput, доступности, доли успешных операций, времени прохождения задач и стабильности. Метрики сравнивают с заранее заданными SLO или условиями SLA. Загрузка CPU, объем занятой памяти и число процессов помогают искать причину, но сами по себе не показывают, насколько быстро и успешно система выполняет полезную работу.
Начинайте с конкретного сценария и фиксируйте его границы: какое событие запускает обработку, где считается результат, сколько задач поступает, сколько завершается и сколько времени занимает каждый этап. Для автоматизированного конвейера полезно измерять очередь, WIP, время ожидания, Cycle Time, Lead Time, ошибки, повторные попытки и задержки внешних зависимостей.
Определите сценарий и границы измерения
Один и тот же сервис может выглядеть быстрым или медленным в зависимости от точки отсчета. Для HTTP API время отклика обычно считают от получения запроса до отправки ответа. Для фоновой задачи начало может находиться в момент публикации сообщения в брокере, а конец - после записи результата в базу данных.
Перед сбором метрик зафиксируйте:
- Объект измерения: HTTP-запрос, транзакция, пакет документов, CI/CD pipeline, сообщение в очереди или сквозной бизнес-процесс.
- Начало сценария: поступление события, создание задачи, постановка сообщения в очередь.
- Конец сценария: ответ клиенту, сохранение результата, передача данных следующему этапу.
- Единицу работы: запрос, файл, заказ, сообщение, задача или пакет записей.
- Временное окно: минута, час, смена, сутки или расчетный период SLA.
- Тип нагрузки: обычная, пиковая, фоновая, смешанная или аварийная.
- Исключения: отмененные задачи, некорректные входные данные, тестовый трафик и ручные операции.
Полное время операции часто складывается из ожидания в очереди, обработки приложением, обращений к базе данных, дискового и сетевого ввода-вывода, вызовов внешних API и финальной записи результата. Если измерять только работу обработчика, задержка в очереди останется незаметной.
Разделяйте результативные и диагностические метрики
Результативные метрики описывают то, что получает пользователь или следующий этап процесса. К ним относятся latency, число завершенных операций, доля успешных выполнений и доступность сервиса. Они отвечают на вопрос: какое качество результата получает потребитель.
Диагностические показатели описывают состояние компонентов: CPU, RAM, disk I/O, сетевую задержку, число соединений, длину очереди, состояние пулов и лимиты контейнеров. Они отвечают на вопрос: почему возникла задержка или ошибка.
Например, CPU может быть загружен на 35%, но p99 времени отклика нарушит цель из-за блокировки в базе данных. Обратная ситуация тоже возможна: CPU долго держится на 95%, но при небольшом числе запросов пользовательский результат остается стабильным. Вывод делают по совокупности метрик и по конкретному сценарию.
Ключевые метрики производительности: что измерять на практике
Набор метрик зависит от типа процесса, но базовая схема остается общей: задержка показывает скорость отдельной операции, throughput - объем завершенной работы, WIP - число активных задач, Lead Time - полный путь элемента, а доступность и успешность отражают качество результата.
Практические подходы к latency, throughput, error rate и перцентилям собраны в руководстве по измерению производительности автоматических систем. Ниже эти показатели связаны с SLA, очередями и диагностикой узких мест.
Время отклика автоматизированной системы: почему важны p95 и p99
Latency - время выполнения одной операции. В него может входить ожидание свободного воркера, обработка кода, запрос к базе данных и ожидание ответа внешнего сервиса.
Среднее значение удобно для общей оценки, но оно сглаживает редкие зависания. Если 99 запросов выполняются за 100 мс, а один запрос - за 10 секунд, среднее значение составит примерно 199 мс. Для одного пользователя этот запрос занял 10 секунд, и именно такие случаи часто формируют жалобы и таймауты.
- Медиана, p50: типичный результат для середины выборки.
- p95: значение, быстрее которого завершаются 95% операций.
- p99: значение, быстрее которого завершаются 99% операций.
- Максимум: самый долгий зафиксированный результат, чувствительный к единичным выбросам.
Для SLA чаще используют p95 или p99. Выбор зависит от критичности сценария, объема трафика и допустимого хвоста задержек. Перцентили считайте отдельно для успешных и ошибочных операций, endpoint, типа задачи, региона, версии приложения и внешней зависимости.
Throughput: сколько работы система действительно завершает
Throughput - число завершенных операций за выбранный период. В API это могут быть успешные транзакции в секунду, в очереди - обработанные сообщения в минуту, в пакетном конвейере - завершенные документы за час.
В расчет включают завершенные операции, а не количество входящих событий и не число запущенных процессов. Если в систему поступает 120 задач в минуту, а обработчик завершает 100, фактический throughput равен 100 задачам в минуту. Разница накапливается в очереди.
Фиксируйте throughput отдельно для обычной и пиковой нагрузки. Полезно хранить две версии показателя:
- общее число завершенных операций;
- число завершенных операций с успешным результатом.
Система может показывать высокий выпуск за счет большого количества ошибок и повторных запусков. Поэтому throughput связывают с error rate и долей успешной обработки.
Lead Time и Cycle Time: разница и область применения
Lead Time измеряют от появления запроса или задачи в системе до готового результата. Этот показатель отражает весь путь элемента, включая ожидание в очереди.
Cycle Time считают с момента начала активной обработки до завершения. Он показывает, сколько времени потребляет работа самого обработчика или этапа.
Если Lead Time заметно выше Cycle Time, основная задержка возникает до запуска обработки либо между этапами. Например, задача проводит 45 секунд в очереди и обрабатывается 5 секунд. Lead Time равен 50 секундам, Cycle Time - 5 секундам. Увеличение числа воркеров может сократить очередь, но сначала нужно проверить лимиты базы данных и внешних API.
Backlog и WIP описывают разные состояния. Backlog хранит задачи, ожидающие работы. Задача становится WIP после входа в активный процесс. Для оценки перегрузки анализируйте оба показателя отдельно, вместе со скоростью поступления и завершения.
WIP и закон Литтла: как увидеть перегрузку системы
WIP, Work in Progress, показывает среднее количество задач, находящихся в активной работе. Высокий WIP увеличивает конкуренцию за CPU, память, соединения, дисковые операции и внешние лимиты.
Связь между объемом работы, пропускной способностью и временем прохождения описывает закон Литтла:
L = λ × W
- L - среднее количество элементов в системе;
- λ - средняя пропускная способность;
- W - среднее время прохождения элемента.
Если система стабильно завершает 100 задач в минуту, а средний Lead Time равен 2 минутам, средний объем работы в системе составляет около 200 элементов. Рост WIP при неизменном throughput обычно увеличивает время прохождения. Такой сигнал указывает на перегрузку или ограничение одного из этапов.
WIP-лимит помогает удерживать число параллельных задач в диапазоне, который система может обработать без резкого роста очереди и latency. Лимит выбирают по измерениям, а не по удобному круглому числу.
Доступность и стабильность системы: не одно и то же
Availability показывает, доступен ли сервис для обращения. Успешность обработки показывает, завершает ли он полезную операцию. Стабильность описывает предсказуемость результата при изменении времени и нагрузки.
Endpoint может отвечать с кодом 200, пока фоновый процесс записывает ошибочный результат. Воркер может оставаться запущенным, хотя очередь растет и задачи завершаются после нескольких повторных попыток. Сервис может быть доступен весь месяц, но регулярно отвечать медленнее целевого значения.
Для контроля стабильности собирайте:
- доступность сервиса и отдельных зависимостей;
- долю ошибок и долю успешных бизнес-операций;
- p95, p99 и разброс времени выполнения;
- число повторных попыток и таймаутов;
- длину очереди и возраст самой старой задачи;
- количество инцидентов и длительность деградаций;
- скорость восстановления после сбоя.
Связь задержек, отказов, повторных попыток и резервирования полезно проверять при анализе производительности и отказоустойчивости вычислительных систем. Увеличение retries иногда повышает процент успешных ответов, но одновременно создает дополнительную нагрузку и растягивает Lead Time.
| Метрика | Определение | Единица | Расчет | Что помогает найти | Типичная ошибка |
|---|---|---|---|---|---|
| Latency | Время выполнения операции | мс, с, мин | конец операции - начало операции | Медленный endpoint, запрос или этап | Использовать только среднее |
| p95/p99 | Хвост распределения задержки | мс, с | перцентиль выборки | Редкие зависания и нестабильные зависимости | Смешивать разные сценарии |
| Throughput | Завершенные операции за период | операций/с, задач/мин | завершенные операции / время | Реальную пропускную способность | Считать входящие события |
| Lead Time | Полное время прохождения | с, мин, ч | результат - поступление | Очереди и задержки между этапами | Исключать ожидание |
| Cycle Time | Время активной обработки | с, мин | завершение - старт обработки | Медленный обработчик | Принимать его за полный путь |
| WIP | Задачи в активной работе | задачи, сообщения | среднее число активных элементов | Перегрузку и избыточный параллелизм | Смешивать с Backlog |
| Error rate | Доля неуспешных операций | % | ошибки / все операции × 100% | Сбои приложения и интеграций | Учитывать только HTTP-ошибки |
| Availability | Доля времени доступности | % | доступное время / расчетный период × 100% | Простои и недоступность | Считать доступным медленный сервис |
SLA, SLO и SLI: как связать требования и измерения
SLI - фактический индикатор качества, который измеряет система. SLO - целевое значение этого индикатора. SLA - договорный уровень сервиса с описанием обязательств, периода расчета и последствий нарушения.
Связь выглядит так: SLI отвечает на вопрос «что измеряем», SLO - «какой результат считаем приемлемым», SLA - «что обещано потребителю и как подтверждается нарушение». Фактическое значение SLI нужно хранить независимо от SLO. Цель не заменяет наблюдение.
SLA, SLO и SLI: краткая схема различий
| Термин | Смысл | Пример для API | Пример для очереди |
|---|---|---|---|
| SLI | Измеряемый показатель | p95 latency успешных запросов | Возраст самой старой задачи |
| SLO | Целевая граница | p95 не выше 500 мс | 95% задач завершаются за 2 минуты |
| SLA | Договорное обязательство | Доступность и скорость за месяц | Срок обработки и порядок уведомления |
Для API SLI может включать p95 latency, долю успешных запросов и доступность. Для фоновой обработки полезны Lead Time, throughput, возраст очереди и процент задач, завершенных без повторной попытки. Для интеграционного конвейера добавляют задержки внешнего API и долю операций с частичным результатом.
Как сформулировать измеримый SLO
Формулировка SLO должна содержать объект, сценарий, метрику, порог, перцентиль, временное окно и правила расчета. Удобный шаблон:
Для [сценария] показатель [метрика] должен быть [порог] за [период] при [условия расчета].
Примеры:
- Для успешных запросов к API p95 времени отклика не превышает 500 мс за каждый час.
- Не менее 99,5% запусков фоновой задачи завершаются успешно за календарный месяц.
- 95% сообщений проходят очередь и обработчик менее чем за 120 секунд при нагрузке до 100 сообщений в минуту.
- Доступность endpoint составляет не менее 99,9% за месяц, исключая согласованные технические окна.
Сравнивайте метрики при одинаковом временном окне, типе нагрузки, версии приложения и составе данных. p95 за пять минут нельзя напрямую сопоставлять с p99 за месяц. При росте нагрузки меняется распределение задержек и потребление ресурсов.
Почему SLA нельзя сводить только к uptime
Uptime показывает доступность точки входа. Он не подтверждает, что операция завершилась с корректным результатом. API может отвечать с HTTP 200, но возвращать пустой или устаревший набор данных. Воркер может принимать сообщения, но завершать их ошибкой после трех повторных попыток. Очередь может расти при полностью работающих процессах.
Составной контроль SLA для автоматизированного процесса обычно включает:
- доступность входной точки;
- p95 или p99 времени отклика;
- долю успешных операций;
- throughput при согласованной нагрузке;
- Lead Time и возраст очереди;
- время восстановления после деградации;
- долю задач, завершенных после retry.
Перевод процентного SLA в допустимое время простоя помогает оценить реальную границу требования. Например, доступность 99,9% оставляет около 8 часов 45 минут недоступности за год. Формулы для разных уровней uptime и схем соединения собраны в практической методике расчета uptime.
Error budget и реакция на нарушение целевых значений
Error budget - допустимый объем нарушений SLO за расчетный период. Если SLO успешности составляет 99,5%, бюджет ошибок равен 0,5% операций. Для доступности 99,9% бюджет недоступности равен 0,1% времени.
Бюджет помогает выбрать действие при деградации:
- при стабильном запасе команда может продолжать изменения и нагрузочные проверки;
- при быстром расходовании бюджета приоритет получают исправления надежности и задержек;
- после полного расходования бюджета рискованные изменения переносят до восстановления целевых показателей;
- если нарушения повторяются при штатной нагрузке, пересматривают архитектуру, лимиты или само SLO.
Единичный выброс не всегда требует остановки изменений. Устойчивый рост p99, очереди или ошибок требует корреляции с версиями, нагрузкой и зависимостями.
Контроль качества работы системы: как читать метрики в связке
Один график редко указывает точную причину деградации. Надежный вывод появляется, когда показатели рассматривают на общей временной шкале и связывают с этапами процесса.
Throughput растет, а Lead Time увеличивается
Такая картина возникает, когда система завершает больше задач, но входной поток растет еще быстрее. Причиной может быть увеличение WIP, переполнение очереди, работа на пределе мощности или резкий рост параллелизма.
Проверьте throughput каждого этапа. Если вход принимает 150 задач в минуту, первый обработчик завершает 140, а следующий этап способен принять 100, накопление появится перед вторым этапом. Общий throughput может временно расти, но Lead Time будет увеличиваться.
Следующий шаг: сравнить скорость входа и выпуска, длину очереди, время ожидания и Cycle Time каждого участка. Повышение числа воркеров имеет смысл только после проверки ограничений базы данных, брокера и внешнего API.
Среднее время отклика в норме, но p99 нарушает SLA
Среднее значение может оставаться стабильным, пока небольшая доля запросов попадает в редкие блокировки, холодный кэш, паузы сборщика мусора, медленные запросы к базе или нестабильное внешнее API.
Разделите p99 по endpoint, версии приложения, региону, типу операции, размеру ответа и зависимости. Сопоставьте выбросы с логами, trace ID и событиями GC. Если проблема касается одного запроса к базе, общий график API скроет ее.
Оценивать latency, p95 и p99 в связке с нагрузкой и ресурсами помогает руководство по оценке производительности системы.
Высокая доступность, но низкая успешность обработки
Сначала разделите техническую доступность и бизнес-успешность. Для первой проверяют ответы endpoint, соединение и готовность процесса. Для второй проверяют корректное завершение операции и наличие результата.
Ищите коды ошибок, частоту retries, частичные результаты, некорректные входные данные, ошибки авторизации и сбои интеграций. Отдельно считайте задачи, завершенные после повторной попытки: формально они успешны, но создают дополнительную задержку и нагрузку.
Низкая загрузка CPU, но система работает медленно
Свободный процессор не исключает ожидание диска, сети, блокировок или соединения. Процесс может большую часть времени находиться в ожидании ответа, поэтому CPU остается незагруженным.
| Наблюдение | Вероятная причина | Что проверить |
|---|---|---|
| CPU низкий, disk latency высокий | Медленное хранилище или очередь I/O | Latency чтения и записи, IOPS, очередь диска, состояние файловой системы |
| CPU низкий, много idle-соединений | Ожидание базы или внешнего сервиса | Время SQL-запросов, pool connections, таймауты и трассировки |
| CPU низкий, очередь растет | Лимит воркеров, брокера или внешнего API | WIP, число активных обработчиков, rate limit и throughput этапов |
| CPU скачет, p99 растет | GC-паузы, блокировки или конкуренция потоков | Профиль CPU, паузы GC, lock wait и распределение запросов |
| CPU высокий, throughput не растет | Насыщение вычислительного ресурса | Run queue, throttling, профиль горячих функций и лимиты контейнера |
Диагностика производительности системы: как найти узкое место
Начинайте с карты процесса: входное событие → очередь → обработчик → база данных или хранилище → внешняя интеграция → выдача результата. Для каждого этапа фиксируйте latency, throughput, WIP, ошибки и потребление ресурсов.
Узкое место - это участок, который ограничивает выпуск или увеличивает время прохождения при текущей нагрузке. Самый загруженный компонент не всегда ограничивает весь процесс. Например, CPU базы может быть загружен на 70%, но причиной задержки окажется исчерпанный пул соединений.
Узкие места в инфраструктуре
Проверка инфраструктуры должна охватывать ресурсы и их ограничения:
- CPU: средняя загрузка, run queue, steal time, throttling и частота процессора.
- Память: pressure, swap, page faults, лимиты контейнера и рост RSS.
- Хранилище: latency чтения и записи, IOPS, пропускная способность, очередь операций и свободное место.
- Сеть: RTT, потери пакетов, retransmits, пропускная способность и ошибки интерфейса.
- Контейнеры: CPU quota, memory limit, число рестартов и ограничения файловой системы.
- Операционная система: файловые дескрипторы, лимиты процессов, очереди сокетов и состояние дисков.
- Пулы: соединения к базе, потоки, воркеры и внутренние очереди.
Ресурс связывайте с конкретным этапом и результатом. Высокий disk I/O сам по себе не доказывает узкое место. Доказательством станет одновременный рост дисковой задержки, времени SQL-запросов, p99 и Lead Time на соответствующем участке.
Узкие места в приложении и обработчиках
Если инфраструктура имеет запас, проверяйте логику приложения. Частые причины:
- блокировки и длинные критические секции;
- синхронные вызовы внутри параллельного конвейера;
- последовательная обработка задач, которые можно выполнять независимо;
- неэффективные SQL-запросы и отсутствие нужных индексов;
- чрезмерные повторные попытки без различия временных и постоянных ошибок;
- утечки памяти и частые паузы сборщика мусора;
- неограниченный параллелизм, который перегружает зависимость;
- слишком маленькие или слишком большие пулы потоков и соединений.
Для проверки используйте профилирование CPU и памяти, slow query log, логи блокировок, распределенную трассировку и записи о каждом retry. Сопоставьте время функции с временем ожидания внешнего вызова. Если 80% Cycle Time занимает ожидание базы, изменение алгоритма сериализации ответа не даст заметного результата.
Узкие места в интеграциях и внешних зависимостях
Собственная система может работать стабильно, пока задержка появляется у соседнего сервиса. Частые причины:
- rate limit внешнего API;
- медленный DNS или повторное установление TCP-соединения;
- таймауты и зависшие retries;
- ограничение брокера сообщений;
- медленный запрос в удаленную базу данных;
- сетевые потери и retransmits;
- ограниченный пул исходящих соединений;
- неподходящий размер пакета или слишком большой ответ.
Разделяйте три интервала: время подготовки запроса, время ожидания зависимости и время обработки ответа. Внешний вызов с таймаутом 3 секунды и двумя повторными попытками способен занять почти 9 секунд, даже если основная логика приложения выполняется за 100 мс.
Как подтвердить, что найдено именно узкое место
Используйте короткий цикл проверки:
- Сформулируйте гипотезу: например, очередь растет из-за ограничения внешнего API.
- Выберите показатель подтверждения: время ответа API, число ответов 429, throughput и возраст сообщений.
- Сопоставьте временные ряды. Рост очереди должен совпадать с ухудшением зависимости или достижением ее лимита.
- Проверьте логи и трассировки с общим correlation ID.
- Измените один фактор: размер пула, лимит параллелизма, индекс, таймаут или формат запроса.
- Повторите тот же сценарий и сравните все целевые метрики с baseline.
Исправление подтверждено, если улучшился пользовательский показатель: снизился p95, уменьшился Lead Time, вырос успешный throughput или стабилизировалась очередь. Локальное падение CPU без улучшения результата узкое место не устраняет.
Мониторинг производительности IT-систем: какие данные собирать
Мониторинг должен повторять карту процесса и структуру SLO. Дашборд с десятками графиков без связи с пользовательским сценарием затрудняет поиск причины.
Black-box и white-box мониторинг
Black-box мониторинг проверяет систему снаружи. Синтетический сценарий отправляет запрос, проходит авторизацию, создает тестовую задачу и проверяет результат. Такой подход показывает доступность, реальное время отклика и успешность полного действия.
White-box мониторинг собирает внутренние показатели компонентов: latency функций, состояние очередей, число активных воркеров, запросы к базе, ошибки, память, CPU и сетевые задержки.
Внешняя проверка говорит, что пользовательский сценарий сломан, но не объясняет причину. Внутренние графики помогают найти причину, но могут пропустить ошибку в пользовательском пути. Для контроля SLA нужны оба слоя.
Временные метки, логи и распределенная трассировка
Передавайте correlation ID или trace ID через весь процесс. Записывайте время:
- поступления события;
- постановки сообщения в очередь;
- начала обработки;
- начала и конца запроса к базе;
- отправки запроса внешнему API;
- получения ответа или таймаута;
- записи финального результата.
По этим временным меткам Lead Time можно разложить на ожидание и работу. Пример записи:
accepted_at=12:00:00.120
queued_at=12:00:00.135
worker_started_at=12:00:18.400
dependency_started_at=12:00:18.510
dependency_finished_at=12:00:20.210
completed_at=12:00:20.350
В этом примере около 18 секунд ушло на ожидание воркера, 1,7 секунды занял внешний вызов, остальное потребила собственная обработка и запись результата.
Какие измерения нужны для автоматизированной воронки
Для каждого этапа собирайте одинаковый набор:
- число входящих элементов;
- число завершенных элементов;
- WIP и размер очереди;
- время ожидания;
- Cycle Time;
- ошибки по типам;
- повторные попытки;
- доля отмененных и просроченных задач.
Разрезы по типу операции, версии, окружению и региону помогают найти локальную деградацию. Метки должны оставаться контролируемыми. Не добавляйте в labels идентификатор пользователя, полный URL с параметрами или уникальный текст ошибки: высокая кардинальность перегружает систему метрик. Такие значения храните в логах и трассировках.
Для массовой автоматизированной воронки подойдет схема: отклик → первичная автоматизированная оценка → приглашение к следующему этапу. На каждой точке фиксируйте вход, выпуск, время ожидания и долю отсева. Если один этап задерживает поток, его throughput и очередь покажут проблему раньше общего отчета.
Дашборды и алерты, которые ведут к действию
Разделите дашборд на три уровня:
- SLA и SLO: доступность, успешность, p95/p99, error budget и Lead Time.
- Процесс: входной поток, throughput этапов, WIP, длина и возраст очереди, retries.
- Ресурсы: CPU, память, disk I/O, сеть, пулы соединений, лимиты контейнеров.
Алерт должен содержать владельца, порог, период подтверждения и первое действие. Например: «p99 API выше 1 секунды 10 минут, проверить endpoint платежной операции и задержку базы». Такой сигнал полезнее, чем сообщение «CPU выше 80%» без указания затронутого сервиса.
Для очереди добавляйте алерты на устойчивый рост длины, превышение возраста самой старой задачи и падение throughput. Единичный всплеск отделяйте от устойчивого нарушения с помощью окна подтверждения.
Пошаговый анализ производительности инфраструктуры и приложений
Одинаковый порядок действий нужен перед запуском новой версии, после изменения конфигурации и во время разбора деградации. Он снижает риск принять случайное улучшение за результат.
Шаг 1. Зафиксируйте baseline
Baseline - измеренный ориентир для конкретной версии, конфигурации и нагрузки. Запишите:
- версию приложения и зависимостей;
- конфигурацию CPU, памяти, диска и сети;
- размер базы и объем обрабатываемых данных;
- число параллельных операций и размер пулов;
- тип и интенсивность нагрузки;
- временное окно измерения;
- p50, p95, p99, throughput, WIP, Lead Time и error rate;
- доступность и основные ресурсные показатели.
Для первичного сбора показателей пригодится шпаргалка по оценке производительности сервера и сервиса. Тестовый стенд изолируйте от рабочей нагрузки. Для временного окружения можно использовать облачную инфраструктуру с VDS, базами данных и Kubernetes, если ее характеристики соответствуют требуемому сценарию.
Шаг 2. Проверьте нормальную и пиковую нагрузку
Сначала измерьте штатный режим. Затем постепенно увеличивайте число параллельных операций и фиксируйте момент, когда растет очередь, увеличивается Lead Time, падает успешность или появляются таймауты.
Проверяйте как минимум три режима:
- обычная нагрузка, при которой система работает большую часть времени;
- пиковый поток, связанный с реальными периодами активности;
- нагрузка выше расчетной, чтобы найти точку насыщения.
Сценарий должен содержать реалистичные размеры запросов, распределение операций и поведение зависимостей. Подходы к подготовке нагрузочного теста и контролю искажений разобраны в руководстве по нагрузочному тестированию автоматизированных систем.
Шаг 3. Разложите общий результат по этапам
Разделите полное время операции на ожидание в очереди, работу обработчика, обращения к хранилищу, сетевые вызовы и финализацию. Для каждого участка сравните throughput, WIP и задержку.
Пример разложения Lead Time:
- ожидание в очереди - 32 секунды;
- работа воркера - 4 секунды;
- запрос к базе - 1,2 секунды;
- внешний API - 2,5 секунды;
- запись и передача результата - 0,8 секунды.
При такой картине увеличение CPU воркера не решит главную проблему. Сначала нужно проверить очередь и ограничение этапа, который не успевает принимать новые задачи.
Шаг 4. Проверьте гипотезу изменением одного фактора
Меняйте один параметр за раз. Подходящие кандидаты: размер пула соединений, лимит параллелизма, индекс базы, конфигурация очереди, таймаут, формат запроса или число воркеров.
После изменения повторите тот же тест с теми же входными данными и нагрузкой. Сравнивайте p95, p99, throughput, WIP, Lead Time, error rate и потребление ресурсов. Если улучшился только один локальный показатель, а общий результат остался прежним, причина находится дальше по цепочке.
Шаг 5. Зафиксируйте результат и условия применимости
Документируйте исходную проблему, измерения до и после, измененный параметр и ограничения решения. Укажите версии ПО, окружение, размер данных, нагрузку и признаки регрессии.
Запись должна позволять повторить проверку через месяц. Фраза «стало быстрее» недостаточна. Нужна формулировка вроде: «При 80 задачах в минуту p95 Lead Time снизился с 42 до 18 секунд, error rate остался ниже 0,3%, очередь не росла в течение часа».
Практический пример: оценка автоматизированного конвейера
Возьмем универсальный процесс: событие поступает в очередь, воркер выполняет первичную обработку, затем обращается к внешнему API или базе данных и передает результат следующему этапу.
Какие показатели собрать для каждого этапа
| Этап | Основные показатели | Пример проверки |
|---|---|---|
| Вход | Число событий, принятые и отклоненные сообщения | Поступает 120 событий в минуту, принято 118 |
| Очередь | WIP, длина, возраст старой задачи, время ожидания | WIP вырос с 80 до 500, p95 ожидания достиг 40 секунд |
| Воркер | Cycle Time, throughput, ошибки, retries | Завершает 100 задач в минуту, p95 обработки 2,1 секунды |
| Внешняя зависимость | Latency, таймауты, коды ошибок, rate limit | p95 API равен 1,8 секунды, часть запросов получает 429 |
| Весь процесс | Lead Time, успешность, доступность, SLO | p95 Lead Time 44 секунды при цели 30 секунд |
Такой набор связывает состояние каждого участка с конечным результатом. Одного графика времени ответа API недостаточно: нужно знать, сколько задач ждало воркера и сколько операций завершилось успешно.
Как распознать накопление на конкретном участке
Предположим, входной поток составляет 120 событий в минуту, а воркер завершает 100. Очередь увеличивается примерно на 20 элементов в минуту. WIP растет, p95 времени ожидания увеличивается, throughput следующего этапа остается около 100 задач в минуту.
Если Cycle Time воркера стабилен, а Lead Time растет, проблема находится в ожидании, а не в скорости отдельной обработки. Проверьте число активных воркеров, лимит внешнего API, размер пула соединений и скорость подтверждения сообщений брокером.
Отдельно оцените retries. При двух повторных попытках одна исходная задача может создать три вызова к зависимости. Входной поток 120 задач превращается в существенно больший поток запросов, что ускоряет достижение rate limit.
Как проверить результат после исправления
После изменения сравните одинаковые окна до и после:
- p95 и p99 времени отклика;
- throughput всех этапов;
- WIP и длину очереди;
- Lead Time и Cycle Time;
- error rate и долю успешных операций;
- доступность и длительность таймаутов;
- число retries и нагрузку на внешнюю зависимость.
Допустим, команда ограничила лишние повторные вызовы для постоянных ошибок. После этого p95 внешнего API снизился с 1,8 до 1,2 секунды, throughput воркера вырос до 118 задач в минуту, а очередь перестала увеличиваться. Это полезный результат, если успешность не ухудшилась и узкое место не переместилось на базу данных или следующий этап.
Типичные ошибки при оценке производительности и итоговый чек-лист
Почему среднее значение, uptime и загрузка CPU вводят в заблуждение
Среднее время скрывает хвост задержек. Используйте медиану вместе с p95 и p99, особенно при пользовательских и интеграционных сценариях.
Uptime не учитывает медленные ответы, ошибки бизнес-операций и рост очереди. Связывайте доступность с успешностью, latency и Lead Time.
Загрузка CPU не показывает ожидание диска, базы, сети, блокировок и внешнего API. Проверяйте состояние ресурса вместе с задержкой соответствующего этапа.
Число запущенных процессов не равно throughput. Процесс может быть активен, но простаивать на таймауте или ждать свободного соединения.
Количество входящих событий не равно выпуску. Для производительности считайте завершенные операции и их успешность.
Backlog не равен WIP
Backlog содержит задачи, которые еще предстоит выполнить. WIP содержит элементы, уже вошедшие в активную обработку. Если объединить эти показатели, расчет закона Литтла и оценка перегрузки будут искажены.
Храните отдельно:
- скорость поступления задач;
- размер Backlog;
- число элементов в WIP;
- размер очереди каждого этапа;
- скорость завершения;
- средний и перцентильный Lead Time.
Чек-лист оценки производительности
- Определены начало и конец измеряемого сценария.
- Зафиксированы единица работы, временное окно и тип нагрузки.
- Выбран SLI и задан измеримый SLO.
- Собираются p95 и p99, а не только среднее время.
- Известны throughput, WIP, Backlog, Lead Time и Cycle Time.
- Ожидание в очереди отделено от активной обработки.
- Ошибки, таймауты, retries и успешность считаются отдельно.
- Доступность проверяется вместе с полезным результатом операции.
- Каждый этап и внешняя зависимость имеют собственные временные метки.
- Для логов и трассировок используется correlation ID или trace ID.
- CPU, память, диск, сеть, пулы и лимиты контейнеров связаны с этапами процесса.
- Есть baseline с версией ПО, конфигурацией и размером данных.
- Проверены обычная, пиковая и нагрузка выше расчетной.
- Узкое место подтверждено временными рядами, логами или трассировкой.
- После изменения проведен повторный замер по всем целевым метрикам.
- Зафиксированы условия, при которых результат сохраняется.
Такая схема переводит оценку производительности из набора разрозненных графиков в управляемый процесс. Сначала определите полезный результат и границы сценария, затем свяжите latency, throughput, WIP, Lead Time, доступность и успешность с SLO. После этого карта этапов, очередей, логов и трассировок покажет участок, который ограничивает выпуск или увеличивает время прохождения.