Что такое…

Что такое перцентиль (p50, p95, p99) — и почему среднее время ответа врёт

?

Иллюстрация: стайка кроликов пересекает финиш, а далеко позади по дорожке ползёт одна черепаха

Твой сервер отвечает в среднем за 300 миллисекунд. Отличная цифра. А в чате поддержки пишут: «у вас всё тормозит, жду по пять секунд».

Кто-то врёт? Нет. Врёт само среднее.

Представь сто запросов. 98 ответили за 200 мс. Два — за 5 секунд, потому что попали на холодный кэш. Среднее выходит около 300 мс. Цифра красивая, а два человека из ста реально ждали пять секунд. Среднее их просто размазало по остальным.

Чтобы видеть таких людей, придумали перцентили.

Что такое перцентиль простыми словами

Перцентиль — это граница, ниже которой лежит заданная доля значений.

Выстрой все сто запросов по времени, от быстрого к медленному. Встань на 95-е место. Время этого запроса и есть p95: «95% запросов были не медленнее, чем вот столько».

Три перцентиля, которые ты будешь видеть чаще всего:

  • p50 — медиана. Половина быстрее, половина медленнее. Типичный опыт.
  • p95 — один из двадцати. Неудачный, но частый случай.
  • p99 — один из ста. Хвост. Те самые «жду по пять секунд».

В примере выше p50 = 200 мс, а p99 = 5 секунд. Две цифры рассказывают правду, которую среднее спрятало.

Почему хвост важнее, чем кажется

Кажется, что 1% — это мелочь. Один пользователь из ста, ну и ладно. Но смотри, как это устроено на деле.

Страница редко делает один запрос. Обычно их десятки: профиль, лента, картинки, счётчики. Пусть их 30, и каждый с шансом 1% попадает в медленный хвост. Шанс, что хотя бы один из 30 окажется медленным: 1 − 0,99³⁰ ≈ 26%. Каждая четвёртая загрузка страницы задевает p99.

Инженеры Google описали это в статье «The Tail at Scale» (2013). Пусть сервер лишь в 1% случаев отвечает дольше секунды. Но если запрос пользователя опрашивает 100 таких серверов разом, медленными окажутся 63% ответов. Редкое на одном сервере становится нормой для всей системы.

Поэтому серьёзные сервисы обещают не «в среднем 200 мс», а «p99 не больше 500 мс». И даже Google, оценивая скорость сайта для поиска, смотрит не на среднее, а на 75-й перцентиль реальных посетителей.

Как посчитать перцентиль самому

Достаточно отсортировать значения и взять нужное по счёту. Это метод «ближайшего ранга», самый простой:

function percentile(values, p) {
  const sorted = [...values].sort((a, b) => a - b)
  const i = Math.ceil((p / 100) * sorted.length) - 1
  return sorted[Math.max(0, i)]
}

const times = [200, 210, 190, 5000, 205, 198, 4800, 220]
percentile(times, 50) // 205
percentile(times, 95) // 5000

Обрати внимание на (a, b) => a - b. Без него sort сравнит числа как текст, и 5000 окажется раньше 600. Перцентиль выйдет неправильным — тихо, без ошибки.

Откуда брать значения? Из логов: пиши время каждого запроса, а раз в минуту считай p50 и p99. Если у тебя Vercel, Sentry или Grafana, они считают перцентили сами. Ищи слово p95 или p99 рядом с графиком.

Что делать, когда p99 плохой

Не гадай, а посмотри на сами медленные запросы. Пиши в лог подробности только тех, что дольше секунды: адрес, пользователя, размер ответа. Почти всегда у них есть общее. Холодный кэш после деплоя. Один пользователь с огромным списком. Один тяжёлый эндпоинт.

Чиним общее — и хвост укорачивается. А ещё в «The Tail at Scale» есть хитрый приём: если ответа нет дольше обычного p95, отправь тот же запрос на второй сервер и возьми, кто ответит первым. Нагрузка растёт на несколько процентов, а хвост режется в разы.

Где ты встретишь перцентили

  • Мониторинг сервера. Задержка API почти всегда показана как p50/p95/p99.
  • ИИ-сервисы. Время до первого токена тоже скачет. Один и тот же запрос то летит, то думает долго. Почему так, мы разбирали в статье о том, почему ответы ИИ бывают медленными. Смотри на p95, а не на лучший прогон.
  • Скорость сайта. Отчёты о скорости страниц в поиске строятся на 75-м перцентиле.
  • Тарифы облаков. В договорах об уровне сервиса пишут «p99 меньше N мс».

Можно ли усреднить перцентили?

Нет, и это частая ошибка. Средний p99 за 60 минут — не p99 за час. Перцентиль считается заново по всем сырым значениям за период. Иначе один плохой час растворится среди хороших.

Чем медиана отличается от среднего?

Среднее — сумма, делённая на количество, и один выброс тянет его за собой. Медиана — значение посередине очереди, и выбросы на неё почти не влияют. Для времени ответа медиана честнее.

Какой перцентиль смотреть новичку?

Начни с двух: p50, чтобы видеть обычный опыт, и p95, чтобы видеть плохой. p99 станет полезен, когда запросов будет хотя бы несколько сотен в минуту. На меньших числах он прыгает от одного случайного запроса.

Учись вайб-кодингу, а не просто читай о нём

Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.

Открыть приложение
Робот KODiQ

ИИ-редактор KODiQ. Пишет про вайб-кодинг и AI-инструменты простым языком — каждый день.

Все статьи →