Почему усреднение p99 по экземплярам искажает задержку, которую видит пользователь?

Почему усреднение p99 по экземплярам искажает задержку, которую видит пользователь?

Проходите собеседования с ИИ помощником Hintsage

Краткий ответ

p99 нельзя корректно получить усреднением p99 отдельных экземпляров: это разные порядковые статистики, рассчитанные на разных наборах запросов. Усреднение может скрыть перегруженный экземпляр или, наоборот, преувеличить его влияние; пользовательский p99 нужно считать по объединённому потоку запросов с учётом их фактического количества.

Исторический контекст

Средние значения долго использовали для компактного мониторинга распределённых систем, но они плохо описывают редкие медленные запросы. С ростом числа экземпляров и требований к пользовательской задержке стали применять перцентили, однако агрегация перцентилей между источниками оказалась отдельной статистической задачей.

Постановка проблемы

Предположим, один экземпляр обработал 99 000 запросов, а другой — 1 000. Если у них одинаково взять p99 и затем усреднить результаты, оба экземпляра получат одинаковый вес, хотя через них прошло разное количество трафика.

Кроме того, перегруженный экземпляр может иметь высокий p99, но обслуживать небольшую долю запросов. Простое усреднение не показывает, какой процент всех пользовательских запросов действительно превысил заданный порог, поэтому может привести к неверному решению о масштабировании или нарушению SLO.

Подробное решение

Перцентиль — это значение, ниже которого находится заданная доля наблюдений. p99 всего сервиса должен отвечать на вопрос: какая задержка не превышается у 99% всех запросов сервиса за выбранный период.

p99 каждого экземпляра отвечает на другой вопрос: какая задержка не превышается у 99% запросов именно этого экземпляра. Среднее таких значений не сохраняет исходный порядок всех запросов, поэтому не является глобальным p99.

Корректная агрегация требует объединить распределения задержек: например, использовать гистограммы или другие структуры, позволяющие приблизительно восстановить квантили по общему потоку. При этом важно учитывать одинаковые границы бакетов, период измерения и фактический объём трафика.

Если доступны только p99 отдельных экземпляров, точный глобальный p99 обычно восстановить нельзя. Взвешенное среднее может быть полезно как грубый диагностический показатель, но оно всё равно не равно глобальному перцентилю и не должно использоваться как его замена.

Ограничение гистограмм в том, что результат зависит от выбранных границ бакетов: слишком крупные интервалы снижают точность, особенно в области хвоста. Поэтому для SLO нужно заранее выбирать достаточное разрешение вокруг целевого порога задержки и проверять, что метод агрегации соответствует требованиям к точности.

Ситуация из практики

Восемь экземпляров сервиса имели p99 около 200 миллисекунд, а один — 2 секунды. Команда усреднила эти значения и решила, что общий p99 находится примерно на приемлемом уровне. После анализа объединённой гистограммы выяснилось, что проблемный экземпляр обслуживал значительную долю трафика из-за перекоса балансировки, поэтому пользовательский p99 действительно превышал SLO.

Рассматривались три варианта. Усреднение p99 было простым, но статистически некорректным. Взвешенное среднее учитывало объём трафика, однако всё ещё не давало настоящий перцентиль. Объединение гистограмм требовало согласовать формат метрик и границы бакетов, зато позволяло оценивать распределение задержек на уровне сервиса.

Выбрали объединённые гистограммы и отдельно добавили контроль дисбаланса трафика между экземплярами. Это позволило отличить проблему балансировки от общего дефицита ресурсов и не принимать решения о масштабировании по искажённой метрике.

Что кандидаты часто упускают

  1. Можно ли вычислить глобальный p99 из p99 экземпляров и количества запросов?

Нет, в общем случае нельзя. Для восстановления глобального перцентиля нужны хотя бы более подробные сведения о распределении задержек: сырые наблюдения, гистограммы или другой агрегируемый формат. Количество запросов позволяет правильно взвесить средние значения, но не сообщает, как именно распределены задержки внутри каждого экземпляра.

  1. Может ли высокий p99 одного экземпляра не влиять на p99 всего сервиса?

Да. Если экземпляр обработал очень малую долю запросов, его локальный хвост может почти не изменить глобальный p99. Однако это не означает, что проблему можно игнорировать: трафик может перераспределиться на этот экземпляр, а локальный p99 может указывать на неисправность, которая позднее расширит радиус деградации.

  1. Почему для SLO недостаточно смотреть только на p99?

p99 показывает одну точку распределения и не раскрывает форму хвоста. Два сервиса могут иметь одинаковый p99, но сильно различаться по p99,9, максимальной задержке и длительности деградации. Для контроля SLO нужно также проверять объём запросов, нарушивших целевой порог, корректность окна измерения и распределение задержек в критической области, а не только одно значение перцентиля.