Восемь экземпляров сервиса показывают каждый свой p95 задержки. Можно ли получить общий p95 простым средним этих значений?
Нет. Среднее арифметическое p95 отдельных экземпляров не является общим p95, потому что перцентили нельзя корректно агрегировать таким способом. Общий p95 нужно рассчитывать по объединённым наблюдениям всех экземпляров либо приближённо восстанавливать из совместимых гистограмм или распределений.
Перцентили стали особенно важны с распространением распределённых сервисов, где среднее время ответа скрывает редкие, но значимые задержки. При сборе метрик каждый экземпляр, узел или регион часто формирует собственную агрегированную статистику, поэтому возникла необходимость правильно объединять такие данные.
Исходная проблема состоит в том, что среднее, сумма и количество наблюдений агрегируются напрямую, а положение перцентиля зависит от порядка всех отдельных значений. Потеря исходного распределения делает простое восстановление общего перцентиля невозможным.
Предположим, что семь экземпляров обработали почти все запросы быстро, а один экземпляр временно испытывал перегрузку. Его p95 может быть намного выше остальных, но вклад этого экземпляра в общий поток зависит от количества обработанных им запросов.
Если усреднить восемь p95, можно получить число, которое не соответствует задержке 95% всех запросов. Это приводит к ошибочным выводам о соблюдении SLA, неверному сравнению версий и пропуску проблем, затрагивающих значительную часть трафика.
Для расчёта общего p95 нужны индивидуальные наблюдения задержки с их частотами или структура, сохраняющая распределение: например, гистограммы с совместимыми границами корзин. Такие данные можно объединить, сложив количества наблюдений в соответствующих корзинах, а затем оценить положение 95-го перцентиля.
Даже взвешенное среднее локальных p95 обычно не решает задачу. Оно учитывает количество запросов, но не знает, как значения распределены ниже и выше локального перцентиля; два набора с одинаковым p95 могут иметь совершенно разные хвосты.
Если доступны только локальные p95 без исходных данных, общий p95 в общем случае определить нельзя. Можно использовать максимум локальных p95 как консервативный сигнал для контроля проблемного экземпляра, но это не общий p95 пользовательского трафика и не должно выдаваться за точную метрику.
При объединении гистограмм результат может быть приближённым: точность зависит от ширины и расположения корзин. Для анализа необходимо также проверить одинаковое определение измерения, единицы времени, окно агрегации и состав запросов; иначе корректное объединение чисел всё равно даст некорректный показатель.
Сервис работал на восьми экземплярах. Семь из них имели p95 около 180 миллисекунд, а один — 900 миллисекунд. При этом проблемный экземпляр обработал только 3% запросов.
Рассматривались три варианта. Простое среднее p95 было легко вычислить, но не имело корректной статистической интерпретации. Максимум p95 быстро показывал наличие проблемного экземпляра, но завышал задержку всего потока. Запрос сырых наблюдений давал точный результат, однако увеличивал объём хранения и передачи данных.
Команда выбрала агрегацию совместимых гистограмм с одинаковыми корзинами и отдельно сохранила разбивку по экземплярам. Это позволило получать общий p95 для SLA и одновременно находить источник хвоста. После устранения перегрузки одного экземпляра общий p95 снизился, хотя среднее локальных p95 почти не изменилось.
Вопрос: Достаточно ли взвесить p95 каждого экземпляра по числу обработанных запросов?
Ответ: Нет, взвешивание делает оценку более информативной, но не превращает её в точный общий p95. Перцентиль определяется конкретным порядком всех наблюдений, а локальные p95 не содержат информации о форме распределений внутри каждого экземпляра. Взвешенное среднее может использоваться только как эвристика, если это явно оговорено, но не как строгая метрика SLA.
Вопрос: Можно ли объединять гистограммы задержки, если у экземпляров разные границы корзин?
Ответ: Простым сложением — нельзя. Одинаковые диапазоны должны означать одно и то же, иначе значения будут сопоставляться с разной точностью и общий результат исказится. При разных границах можно выполнять преобразование или интерполяцию, но тогда результат становится приближённым; надёжнее заранее использовать единую схему корзин.
Вопрос: Почему общий p95 может быть ниже p95 одного из экземпляров?
Ответ: Общий p95 описывает 95-й процентиль объединённого потока, а локальный p95 — поток конкретного экземпляра. Если проблемный экземпляр обрабатывает небольшую долю запросов, его медленные значения могут оказаться выше общего 95-го порога и повлиять только на более высокий хвост, например p99. Поэтому локальный p95 нельзя напрямую трактовать как общий p95, хотя он остаётся полезным для поиска неоднородности и узких мест.