| 9 min leestijd

p50 vs p95 vs p99: API-latentiepercentielen begrijpen

Je gemiddelde responstijd liegt tegen je. Deze gids legt uit wat latentiepercentielen echt meten, waarom de traagste 1% van de verzoeken juist je drukste gebruikers het hardst raakt, en op welk percentiel je je alerts moet instellen.

p50 vs p95 vs p99: API-latentiepercentielen begrijpen

Waarom gemiddelden liegen over latentie

Stel je een API voor die 99 verzoeken beantwoordt in 100 ms en één verzoek in 10 seconden. De gemiddelde responstijd is ongeveer 199 ms — een getal dat precies geen van de honderd verzoeken beschrijft. De 99 snelle waren twee keer zo snel als het gemiddelde suggereert; het trage was vijftig keer erger. Dit is geen gekunsteld voorbeeld: echte latentieverdelingen zijn sterk scheef, met een lange staart van trage verzoeken door garbage-collection-pauzes, koude caches, lock-contention en overbelaste afhankelijkheden.

Gemiddelden verbergen die staart per definitie — ze smeren de uitschieters uit over alle snelle verzoeken tot alles er prima uitziet. Een latentiegrafiek op basis van gemiddelden kan perfect vlak blijven terwijl een groeiend deel van je gebruikers naar timeouts staart. Daarom vervangt (of vult) elke serieuze monitoringpraktijk het gemiddelde aan met percentielen, die een veel eerlijkere vraag beantwoorden: "hoe traag is het voor de X% minst fortuinlijke verzoeken?"

Wat p50, p95 en p99 werkelijk betekenen

Een percentiel is een simpel idee: sorteer alle responstijden van snelst naar traagst en lees de waarde op een bepaalde positie af. p50 (de mediaan) is de middelste waarde — de helft van je verzoeken was sneller, de helft trager. Het beschrijft de typische ervaring en is veel robuuster dan het gemiddelde, omdat een handvol extreme uitschieters het niet kan verschuiven.

p95 is de waarde waaronder 95% van de verzoeken valt — anders gezegd: 1 op de 20 verzoeken is trager. Het vangt de ervaring van je pechvogels die niet zeldzaam zijn. p99 markeert de traagste 1% — 1 op de 100 verzoeken. Dat klinkt verwaarloosbaar tot je rekent: bij een miljoen verzoeken per dag beschrijft p99 de ervaring van 10.000 verzoeken, elke dag opnieuw.

Een gezonde lezing van het trio: p50 vertelt je hoe je API aanvoelt, p95 waar je gebruikers over klagen, en p99 wat je systemen voor je verbergen. De kloof ertussen telt net zo zwaar als de waarden: een p50 van 100 ms met een p99 van 150 ms is een strakke, voorspelbare dienst; een p50 van 100 ms met een p99 van 4 seconden is een tijdbom.

Waarom staartlatentie je beste klanten het hardst raakt

De contra-intuïtieve eigenschap van staartlatentie is dat ze zich niet gelijkmatig verdeelt — ze concentreert zich op je meest actieve gebruikers. Een gebruiker die één verzoek doet heeft 1% kans om je p99 te raken. Een gebruiker wiens pagina-load uitwaaiert naar 40 API-aanroepen heeft 33% kans dat er minstens één in de traagste 1% belandt. En omdat de pagina slechts zo snel is als de traagste aanroep, ervaren je zwaarste gebruikers — de dashboards, de integraties, de power-klanten — je p99-latentie routinematig, niet uitzonderlijk.

Dit fan-out-effect is waarom grote engineeringorganisaties geobsedeerd zijn door de staart. In microservice-architecturen stapelt het probleem zich op: als service A service B aanroept, die service C aanroept, blokkeert één trage sprong de hele keten, houdt een worker-thread gegijzeld en kan onder belasting uitgroeien tot een cascade van vertragingen in services die zelf perfect gezond waren. Staartlatentie is geen cosmetische metriek — het is de vroege indicator van de verzadigingsproblemen die later storingen worden.

Op welk percentiel moet je alerteren?

Alerteren op het gemiddelde is erger dan nutteloos — het schept vals vertrouwen. Maar alerteren op het verkeerde percentiel schept ruis. Een praktisch schema:

Alerteer op p95 of p99 voor gebruikersgerichte endpoints. Stel de drempel in op basis van je eigen baseline, niet op basis van folklore: meet een normale week en alerteer wanneer het percentiel duurzaam boven pakweg 2–3× zijn baseline uitkomt. Een korte p99-piek tijdens een deployment is normaal; een p99 die tien minuten verhoogd blijft is een echte degradatie. Volg p50 op drift, niet voor alerts. Een langzaam stijgende mediaan is de signatuur van groeiende datasets, ontbrekende indexen of sluipend groeiende payloads — bekijk hem wekelijks in plaats van erop te pagen. Volg de p50/p99-kloof. Een groeiende kloof bij een stabiele mediaan betekent dat de staart als eerste degradeert — het klassieke vroege signaal van een overbelaste afhankelijkheid of connection pool.

En meet waar het telt: percentielen berekend uit je serverlogs missen DNS-, TLS- en netwerktijd volledig. Externe synthetische checks vanuit meerdere regio's meten de latentie die je clients werkelijk ervaren — het getal waarop je gebruikers je beoordelen.

Veelvoorkomende percentielvalkuilen

Drie fouten duiken op in bijna elk latentiedashboard. Percentielen middelen: het gemiddelde van vijf p99-minuutwaarden is niet de p99 van het vijfminutenvenster — percentielen laten zich niet samenstellen. Bereken bij aggregatie over tijdvensters of regio's het percentiel over de samengevoegde data (of gebruik een mergebare sketch), nooit een gemiddelde van percentielen. Steekproefgrootte negeren: een p99 berekend uit 50 verzoeken is in wezen één ongelukkig verzoek vermomd als trend; geef endpoints met weinig verkeer ruimere vensters voordat je hun staart vertrouwt. Percentielen vergelijken over verschillende mixen: een p95 die "verbeterde" na een verkeersdaling weerspiegelt misschien alleen dat de zware queries wegvielen — segmenteer per endpoint en verzoektype voordat je juicht.

Niets hiervan vereist geavanceerde tooling — het vereist continu meten, van buitenaf, met drempels per monitor. Een latentiedrempel op een synthetische check is de simpelste eerlijke implementatie: elke check haalde je latentiebudget of niet, en een reeks mislukkingen is een degradatie waarvan je hoort terwijl het nog een prestatieprobleem is in plaats van een storing.

Veelgestelde vragen

Wat betekent p99-latentie?
p99 is de responstijd waaronder 99% van de verzoeken afrondt — oftewel: 1 op de 100 verzoeken is trager dan deze waarde. Bij een miljoen verzoeken per dag beschrijft je p99 de ervaring van 10.000 echte verzoeken per dag — daarom telt hij veel zwaarder dan zijn label van "1%" doet vermoeden.
Waarom is p99 belangrijker dan de gemiddelde responstijd?
Latentieverdelingen zijn scheef: enkele zeer trage verzoeken bewegen het gemiddelde nauwelijks maar domineren de echte gebruikerservaring, vooral wanneer één pagina-load tientallen API-aanroepen veroorzaakt en slechts zo snel is als de traagste. Het gemiddelde verbergt de staart; p99 meet hem direct.
Moet ik alerteren op p50, p95 of p99?
Alerteer op p95 of p99 voor gebruikersgerichte endpoints, met drempels afgeleid van je gemeten baseline en een minimale-duur-conditie om deploypieken weg te filteren. Gebruik p50 voor wekelijkse driftcontrole in plaats van alerts, en let op de kloof tussen p50 en p99 — een groeiende kloof is het vroegste teken van een degraderende afhankelijkheid.
Kan ik p99-waarden uit verschillende tijdvensters middelen?
Nee — percentielen laten zich niet samenstellen. Het gemiddelde van meerdere p99-minuutwaarden is niet de p99 van de gecombineerde periode en onderschat die meestal aanzienlijk. Aggregeer de onderliggende responstijden (of gebruik mergebare percentiel-sketches) en bereken het percentiel over de samengevoegde data.

Klaar om uw API's met vertrouwen te monitoren?

Begin binnen enkele minuten met het monitoren van uw API's. Gratis Hobby-plan, geen creditcard nodig.