Что такое персентили, какой персентиль важен и когда
Что проверяют
Понимаете ли вы, почему среднее скрывает проблему, и умеете ли считать и читать распределение. Для питониста добавляется практика: чем посчитать по выборке, что делать на потоке данных и как не получить красивую, но бессмысленную цифру.
Как отвечать
Персентиль это значение, ниже которого лежит заданная доля наблюдений. Медиана делит выборку пополам, p95 и p99 описывают хвост. Среднее по времени ответа почти бесполезно: один тяжёлый запрос на тысячу лёгких его не сдвинет, а пользователь этот запрос запомнит.
Что брать и когда: медиану для типичного случая и для отслеживания регрессий, p95 и p99 для целей по качеству сервиса и для понимания худшего опыта, более глубокий хвост в крупных системах, где даже редкие случаи задевают много людей. Для скошенных распределений (время ответа, размер файла, доход) медиана и межквартильный размах честнее среднего и стандартного отклонения.
import numpy as np
p50, p95, p99 = np.percentile(latencies, [50, 95, 99])Полезно добавить: в стандартной библиотеке есть quantiles, способ интерполяции заметно влияет на результат при малой выборке, а на потоке данных точное значение не считают, а оценивают по гистограмме или по приближающим структурам вроде t-digest.
Где спотыкаются
Усредняют персентили: берут значение с каждого инстанса и считают среднее, или складывают поминутные значения за час. Персентиль не аддитивен, агрегировать можно только исходные наблюдения или гистограммы, иначе получается число, которое ничего не измеряет.
Считают глубокий хвост по крошечной выборке. Если наблюдений сотня, p99 это одно наблюдение, оно скачет от прогона к прогону, и на нём строят выводы о регрессии. Рядом с персентилем всегда нужно показывать число наблюдений.
Игнорируют скрытое ожидание: нагрузочный клиент, который отправляет следующий запрос только после ответа на предыдущий, не учитывает время, проведённое в очереди, и рисует хвост лучше реального. Тот же эффект даёт выбрасывание таймаутов из выборки, когда самые долгие запросы просто исчезают из расчёта.