Opyntel

P50, P90, P95 and P99 latency, explained

A latency percentile is the response time that a given share of requests beat. P50 is the median: half of requests are faster. P95 means 95 of every 100 requests are faster, and the slowest 5 are not. P99 latency means 99 in 100 are faster, so only the slowest 1 in 100 are slower. Alert on P95: it catches a slowdown that real users feel without paging you for a single slow request.

Latency percentiles: what each one tells you

PercentileMeaningUse it for
P50 (median)Half of requests are fasterThe typical experience; a slowdown that hits everyone
P909 in 10 requests are fasterAn early sign that the slow tail is growing
P9519 in 20 requests are fasterAlerting: users notice it, and it is stable enough not to flap
P9999 in 100 requests are fasterThe slow tail: timeouts, cold starts, lock waits, one bad dependency
MaxThe single slowest requestDebugging only; one outlier moves it

A worked example

Take 100 requests to one endpoint: 90 take 120 ms, 6 take 400 ms, 3 take 1,500 ms and 1 takes 4,000 ms. Sort them from fastest to slowest and read the value at each position.

MeasureValueHow to read it
Average217 msLooks healthy, and matches no real request
P50120 msThe 50th request: most users are fine
P90120 msThe 90th request: still fine
P95400 msThe 95th request: 1 in 20 users waits over 3 times longer
P991,500 msThe 99th request: 1 in 100 waits over a second
Max4,000 msOne request, perhaps a cold start

The average of 217 ms hides the problem: one user in ten waits at least 400 ms, and the slowest wait 1.5 to 4 seconds.

Why averages hide problems

An average mixes fast and slow requests into a number no user experienced. A handful of very slow requests among thousands barely moves it, and a burst of very fast ones, such as cache hits or health checks, can pull it down while real users wait. Percentiles describe the requests themselves, so a growing slow tail shows up as soon as it starts.

The tail also matters more than it looks. A page that makes 20 API calls hits at least one request slower than P99 about 18% of the time, because 1 − 0.9920 ≈ 0.18. For that page, nearly one visit in five waits on a P99-slow call.

Which percentile to alert on

  • P95 for alerts. Set a threshold your users would call slow, and require it to hold for several minutes.
  • P50 for regressions. If the median moves after a deploy, everyone got slower.
  • P99 for investigation, not paging. On a quiet service it is noisy: with 50 requests in a 5-minute window, P99 is simply the slowest request.
  • Latency with the error rate. A fast 500 is still a failure, so watch the share of 5xx errors next to P95.

Which percentiles each platform shows

PlatformPercentiles shownLatency alerts built inGuide
RailwayP50, P90, P95, P99 per serviceNo; monitors cover CPU, RAM, disk and egressRailway P95 latency alerts
RenderP50, P75, P90, P99 in the dashboard and P50, P95, P99 in the metrics stream, Pro workspace and upNo; notifications cover failures and diskRender latency alerts
VercelP75 for functions with Observability PlusNo threshold alert; anomaly alerts on 5xx spikesVercel latency percentiles
KoyebP50, P90, P99 and max, as a 5-minute estimateNoKoyeb latency alerts
Fly.ioA response-time histogram you query with PromQLNoFly.io latency percentiles
HerokuMedian, P95, P99 and max for web dynosYes, a P95 threshold on Professional and Fir dynos
DigitalOcean App PlatformP95 request durationYes, P95 duration alert policies

Every service’s P95 on one dashboard

Each platform shows percentiles one service at a time, and each picks different ones. Opyntel shows the latency of every public service in one table, across every platform you connect: P50, P95 and P99 wherever the platform publishes them. It alerts when latency or the error rate passes your threshold, by email, Slack or SMS depending on your plan, and again when the service recovers. Default rules cover every plan, and your own thresholds come with Pro.

FAQ

Latency percentile questions, answered

P95 versus P99, good targets and noisy tails.

It is never lower: P99 sits at or above P95 by definition.

It depends on the endpoint. For an API a page calls, many teams aim for a P95 under 300 to 500 ms; for a page rendered on the server, under 1 second.

At low traffic, a single slow request is the P99. Look at P95, or at a longer window.

The alerts your platform doesn’t send.

One dashboard for everything you run, with the alerts your platforms leave out. Read-only, nothing to install in your apps.

See how it works