P50, P95 y P99: cómo interpretar percentiles de latencia sin que el promedio te engañe

Con 100,000 solicitudes, un P50 de 120 ms y un P99 de 1.8 segundos, el sistema puede ser rápido y lento a la vez. Un percentil solo significa algo junto a su ventana, volumen, población y método de medición.

Texto
100,000 solicitudes
P50 = 120 ms
P95 = 480 ms
P99 = 1.8 s

¿El sistema es rápido porque la mitad de las solicitudes termina en 120 milisegundos o es lento porque aproximadamente 1,000 solicitudes superan 1.8 segundos?

Las dos afirmaciones pueden ser ciertas.

Ese es el problema de interpretar la latencia con un único número. El promedio puede ocultar una cola severa. El P50 puede describir correctamente la experiencia central y, al mismo tiempo, ignorar miles de operaciones lentas. El P99 puede revelar un impacto material, pero también puede ser inestable, estar mal agregado o representar una población que mezcla operaciones incomparables.

La idea central de este artículo es simple:

Un percentil solo adquiere significado cuando se interpreta junto con su ventana, volumen, población y método de medición.

Al terminar, podrás leer P50, P95 y P99 sin confundirlos con disponibilidad, convertir la cola en impacto aproximado, decidir qué percentil observar y detectar mediciones que parecen precisas pero no son comparables.

La latencia es una distribución, no un número

Cada solicitud completada produce una observación:

Texto
84 ms
91 ms
105 ms
118 ms
...
2,400 ms

El conjunto de observaciones de una operación, población y ventana forma una distribución. Esa distribución puede concentrarse alrededor de un rango estrecho o presentar una cola larga con solicitudes mucho más lentas que la mayoría.

En sistemas distribuidos, las distribuciones de latencia suelen ser asimétricas. La mayoría de las operaciones puede completarse cerca de un valor central mientras una fracción menor acumula espera en colas, contención, pausas del runtime, I/O, reintentos, bloqueos o dependencias lentas. Por eso, la media aritmética rara vez describe por sí sola la forma completa de la distribución.

OpenTelemetry modela los histogramas como una población de mediciones comprimida en conteos, suma, límites de buckets y una ventana temporal. Prometheus utiliza el mismo principio para calcular cuantiles a partir de histogramas agregables.

Distribución y posiciones de P50, P95 y P99 Distribución conceptual de latencia con P50 en 120 milisegundos, P95 en 480 milisegundos, P99 en 1.8 segundos y una cola posterior cuyo máximo no se conoce. P50 · 120 ms P95 · 480 ms P99 · 1.8 s latencia → cola: máx. desconocido
Distribución conceptual de latencia. Cada percentil marca una posición acumulada, no el tiempo exacto de todas las solicitudes de ese segmento. El diagrama no representa distancias proporcionales: P50 (120 ms) queda cerca del centro, P95 (480 ms) delimita la cola frecuente y P99 (1.8 s) el extremo, con una cola posterior cuyo máximo no se conoce.

Un percentil resume una posición. Un histograma o mapa de calor muestra mejor la forma. Para operar un sistema conviene observar ambos: percentiles para seguir umbrales y distribución para entender qué cambió.

La explicación completa de colas, presupuestos y componentes que acumulan tiempo pertenece a la guía de latencia en sistemas distribuidos. Aquí el alcance es más específico: cómo leer la distribución sin atribuirle propiedades que no mide.

Qué significa realmente un percentil

El percentil Px es el valor por debajo o igual al cual se encuentra aproximadamente x % de las observaciones de la población y ventana medidas.

Si el dashboard muestra:

Texto
P95 = 480 ms

la interpretación operativa es:

No significa:

Disponibilidad y latencia son indicadores distintos. Una solicitud puede responder con éxito y hacerlo demasiado tarde. También puede fallar con rapidez. Google SRE separa explícitamente el SLI de disponibilidad —proporción de solicitudes exitosas— del SLI de latencia —proporción de solicitudes por debajo de un umbral—.

La palabra “aproximadamente” importa

En una población finita, el resultado exacto depende del estimador, la convención de ranking, la interpolación y, en plataformas de observabilidad, del esquema de buckets. Hyndman y Fan documentaron múltiples definiciones de cuantiles muestrales usadas por paquetes estadísticos.

En producción esto tiene dos consecuencias:

  1. Dos herramientas pueden reportar valores ligeramente distintos sobre la misma muestra.
  2. Un percentil calculado desde buckets es una estimación cuya precisión depende de sus límites.

La decisión correcta no es buscar una falsa exactitud decimal. Es verificar si las diferencias son materiales para el umbral operativo y si ambos datos fueron calculados con métodos comparables.

Cómo interpretar P50, P95, P99 y P99.9

P50: la experiencia central

P50 es la mediana. Divide las observaciones de forma que aproximadamente la mitad queda por debajo o igual al valor y la otra mitad por encima.

Responde a esta pregunta:

¿Qué tan rápida es la operación para una observación central de esta población?

Es menos sensible que el promedio a valores extremos. Si una solicitud tarda 30 segundos, la mediana puede no moverse. Eso es útil para describir la experiencia típica, pero insuficiente para evaluar la cola.

Señal observable: P50 sube de manera sostenida en todos los segmentos.

Posibles interpretaciones:

Riesgo de mala lectura: declarar saludable un servicio porque P50 permanece estable mientras P95 y P99 se degradan.

Validación: comparar P50 con throughput, saturación, errores y segmentación por operación. Si solo la cola cambia, la causa probablemente no afecta de forma uniforme a todas las solicitudes.

P95: la cola operativa frecuente

P95 deja aproximadamente 5 % de las observaciones por encima. En servicios con tráfico moderado o alto, ese 5 % puede representar un volumen significativo.

Texto
1,000,000 solicitudes por día
5 % por encima de P95
≈ 50,000 solicitudes

P95 responde a una pregunta distinta:

¿Hasta qué latencia llega la gran mayoría de las operaciones y qué ocurre con una fracción todavía frecuente de usuarios?

Suele ser útil en dashboards de operaciones interactivas porque es más sensible a degradaciones que P50 y menos volátil que percentiles más extremos. No es universalmente “el percentil correcto”. Su utilidad depende del volumen, la criticidad y la forma de la distribución.

P99: extremos que dejan de ser raros a escala

P99 deja aproximadamente 1 % de las observaciones por encima.

Texto
100,000 solicitudes
1 % por encima de P99
≈ 1,000 solicitudes

A bajo volumen, el P99 puede depender de muy pocas observaciones. A gran escala, ese mismo 1 % puede afectar a cientos de miles de operaciones.

P99 resulta especialmente útil cuando:

Su trade-off es claro: ofrece mayor sensibilidad a la cola, pero necesita más muestra y suele presentar más variación en ventanas cortas.

P99.9: precisión extrema con costo y volatilidad

P99.9 deja aproximadamente 0.1 % por encima. En diez millones de operaciones, ese segmento equivale a unas diez mil observaciones. En una ventana con mil solicitudes, representa nominalmente una sola observación.

Puede ser relevante en plataformas de enorme volumen o en operaciones donde una cola muy extrema tiene consecuencias materiales. También exige:

Subir de P99 a P99.9 no convierte automáticamente la medición en más útil. Solo desplaza la pregunta hacia una región más extrema de la distribución.

PercentilPregunta que ayuda a responderPrincipal riesgo de interpretación
P50¿Cómo se comporta la experiencia central?Ocultar la cola
P95¿Qué degradación afecta a una fracción frecuente?Usarlo sin volumen ni segmentación
P99¿Qué ocurre en una cola material a escala?Ruido por muestra insuficiente
P99.9¿Qué extremos persisten en muy alto volumen?Coste, volatilidad y falsa precisión

El ejemplo de 100,000 solicitudes

Retomemos la ventana inicial:

Texto
Volumen = 100,000 solicitudes
P50 = 120 ms
P95 = 480 ms
P99 = 1.8 s

Una lectura válida es:

Pero todavía faltan preguntas esenciales:

Los tres percentiles no permiten reconstruir la distribución completa. Dos sistemas pueden compartir P50, P95 y P99 y tener máximos, densidades intermedias y causas radicalmente diferentes.

Curva acumulada conceptual Curva acumulada conceptual que alcanza 50 por ciento en 120 milisegundos, 95 por ciento en 480 milisegundos, 99 por ciento en 1.8 segundos y termina en un máximo desconocido. 0% 50% 100% 50% · 120 ms 95% · 480 ms 99% · 1.8 s 100% · máx. desconocido tiempo →
Curva acumulada conceptual. Responde qué porcentaje de solicitudes terminó hasta cierto tiempo: 50 % en 120 ms, 95 % en 480 ms y 99 % en 1.8 s. El tramo final puede abarcar un rango muy amplio aunque represente pocas observaciones, y su máximo permanece desconocido.

Por qué el promedio puede engañar

Considera esta muestra:

Texto
99 solicitudes = 100 ms cada una
1 solicitud = 10,000 ms

El promedio es:

Texto
((99 × 100 ms) + 10,000 ms) / 100
= 19,900 ms / 100
= 199 ms

Un dashboard que solo muestra promedio = 199 ms pierde dos hechos importantes:

P50 sería 100 ms. El máximo sería 10,000 ms. El P99 dependería de la convención de cálculo y de la representación de la muestra.

El promedio no “miente” matemáticamente. Responde otra pregunta:

¿Cuál es el tiempo total acumulado dividido entre el número de observaciones?

El error es usar esa respuesta para inferir la forma de una distribución asimétrica.

Promedio aceptable, cola severa Noventa y nueve solicitudes de 100 milisegundos y una de 10 segundos producen un promedio de 199 milisegundos que oculta la solicitud extrema. 99 solicitudes 100 ms cada una 1 solicitud 10,000 ms Promedio 199 ms Conclusión incompleta “el sistema ronda 200 ms” Consecuencia omitida una operación tardó 10 s
El promedio combina toda la duración acumulada: no conserva información sobre cuántas observaciones fueron rápidas, lentas o extremas. La conclusión “el sistema ronda 200 ms” es cierta como media y, a la vez, oculta que una operación tardó 10 segundos.

Promedio, mediana, máximo e histograma cumplen funciones distintas

MedidaQué conservaQué puede ocultar
PromedioTiempo acumulado por observaciónForma y concentración de la cola
P50Centro de la distribuciónPeores segmentos
P95/P99Posición de la colaDensidad y máximos posteriores
MáximoPeor observación registradaFrecuencia y representatividad
HistogramaForma aproximada por rangosPrecisión dentro de cada bucket
HeatmapEvolución temporal de la distribuciónDetalle individual sin exemplars o trazas

La recomendación operativa no es reemplazar el promedio por un percentil. Es observar un conjunto mínimo que preserve centro, cola, volumen y distribución.

El volumen cambia el significado de la cola

El mismo “1 %” representa impactos radicalmente distintos según la cantidad de operaciones.

Volumen de la ventanaAproximadamente 1 %
1,00010 solicitudes
100,0001,000 solicitudes
10,000,000100,000 solicitudes

Un P99 de 1.8 segundos sin volumen no permite estimar cuántas operaciones estuvieron por encima. Tampoco permite saber cuántos usuarios únicos fueron afectados: un cliente puede generar múltiples solicitudes y aparecer repetidamente en la cola.

El mismo percentil, distinto impacto Un P99 de 1.8 segundos asociado a tres volúmenes distintos produce aproximadamente 10, 1,000 y 100,000 solicitudes por encima. P99 = 1.8 s 1,000 solicitudes ≈ 10 por encima 100,000 solicitudes ≈ 1,000 por encima 10,000,000 solicitudes ≈ 100,000 por encima
El valor del P99 puede ser idéntico, pero el número de operaciones que excede ese valor crece con el volumen: el mismo 1 % son 10, 1,000 o 100,000 solicitudes por encima según la ventana.

No confundas solicitudes con usuarios

Convertir percentiles en impacto de usuario requiere una dimensión adicional:

Una acción de usuario puede generar diez llamadas. Un P99 por solicitud no equivale automáticamente a 1 % de usuarios afectados.

Fan-out: cuando el P99 de un backend llega al camino crítico

Una solicitud frontal puede consultar múltiples particiones o dependencias en paralelo y esperar la respuesta más lenta. En ese diseño, la probabilidad de encontrar al menos una llamada lenta aumenta con el fan-out.

Supongamos, solo para ilustrar el efecto, que:

La probabilidad de que ninguna sea lenta es:

Texto
0.99^100 ≈ 36.6 %

La probabilidad de que al menos una sea lenta es:

Texto
1 - 0.99^100 ≈ 63.4 %

Una condición de cola que afecta a 1 % de las llamadas individuales puede aparecer en la mayoría de las operaciones agregadas con fan-out alto. La independencia rara vez es perfecta en sistemas reales, pero el cálculo muestra por qué la cola deja de ser rara cuando el camino crítico consulta muchos componentes. El trabajo de Dean y Barroso sobre The Tail at Scale describe cómo episodios poco frecuentes pueden dominar el rendimiento de servicios grandes.

Amplificación de cola por fan-out Una solicitud frontal se divide hacia cien backends y espera todas las respuestas, por lo que la dependencia más lenta determina la latencia total. Solicitud frontal Backend 1 Backend 2 Backend 100 Esperar todas La respuesta más lenta condiciona la latencia total
El fan-out no cambia la definición del P99 de cada dependencia. Cambia la probabilidad de que una observación de cola ingrese al camino crítico: con cien backends en paralelo, la respuesta más lenta condiciona la latencia total de la operación.

Esta sección no reemplaza el análisis completo de latencia de cola. Su función es explicar por qué un percentil extremo de una dependencia puede transformarse en experiencia frecuente del frontend.

La ventana de medición decide qué incidente puedes ver

Todo percentil pertenece a una ventana. Un valor sin ventana está incompleto.

VentanaVentajaRiesgo
1 minutoDetecta cambios rápidosAlta volatilidad con poco tráfico
5 minutosEquilibra reacción y muestraPuede suavizar picos muy breves
1 horaÚtil para tendencia operativaPuede ocultar un incidente corto
24 horasResume impacto diarioMezcla horarios y poblaciones distintas
30 díasÚtil para cumplimiento de SLONo sirve por sí sola para respuesta inmediata

El ejemplo que una ventana larga puede ocultar

Supongamos una hora con tráfico estable:

El P99 de toda la hora no tiene que mostrar 8 segundos. Dependerá del volumen de cada tramo y de la distribución conjunta. Si el incidente afectó menos de 1 % de todas las solicitudes de la hora, puede desaparecer del P99 horario aunque haya sido evidente durante cinco minutos.

La misma degradación bajo distintas ventanas Un incidente de cinco minutos se observa con claridad en ventanas cortas y puede diluirse en ventanas de una hora o un día. Incidente de 5 min P99 = 8 s Ventana de 1 min visible y ruidosa Ventana de 5 min visible y accionable Ventana de 1 hora posible dilución Ventana de 24 horas impacto agregado
No existe una ventana universal. La misma degradación de cinco minutos es visible en ventanas cortas y puede diluirse en las de una hora o un día. Se necesitan ventanas cortas para detección, medias para confirmación y largas para objetivos y tendencia.

Decisión operativa

Usa varias ventanas para preguntas distintas:

No compares un P99 de cinco minutos con otro calculado sobre una hora y los presentes como si describieran la misma población.

La población y la segmentación deciden qué estás midiendo

Un percentil global puede mezclar distribuciones incompatibles:

Ejemplo: un endpoint rápido oculta otro lento

Supongamos:

Texto
GET /catalogo
900,000 solicitudes
P99 = 180 ms

POST /pedido
100,000 solicitudes
P99 = 2.4 s

Si se mezclan ambas operaciones, el endpoint de alto volumen puede dominar la distribución global. El percentil agregado no responde bien a ninguna de estas preguntas:

Decisión

Segmenta por dimensiones que cambian la naturaleza de la operación, pero evita cardinalidad sin control. Una taxonomía inicial razonable puede incluir:

No uses IDs de usuario, request IDs o URLs sin normalizar como labels de métricas. Esos identificadores pertenecen a logs o trazas, no a series de alta cardinalidad.

OpenTelemetry permite asociar atributos a los puntos de histograma; esa capacidad mejora el filtrado, pero cada combinación de atributos puede generar una serie distinta y aumentar el costo.

Cliente y servidor no observan la misma latencia

La latencia medida en el servidor suele comenzar después de que la solicitud llega y termina cuando la respuesta es emitida. La latencia del cliente puede incluir además:

Google SRE señala que la latencia cliente suele ser más relevante para el usuario, aunque a veces solo está disponible la medición servidor.

Por eso, estos valores no son intercambiables:

Texto
P99 servidor = 400 ms
P99 cliente = 1.2 s

La diferencia no demuestra por sí sola que la red sea la causa. Puede incluir colas en capas intermedias, retry automático, handshake, streaming o instrumentación con límites distintos.

Decisión de medición

Define explícitamente:

Solo después compara cliente y servidor mediante métricas, logs y trazas.

Cómo se calculan los percentiles en una plataforma de métricas

La interfaz puede mostrar P99 = 742 ms, pero ese valor puede provenir de mecanismos distintos.

Eventos crudos

El sistema conserva cada observación y ordena o estima directamente sobre los datos.

Ventaja: máxima flexibilidad analítica.

Costo: volumen de almacenamiento, transferencia y consulta.

No suele ser la estrategia principal para telemetría de alto volumen durante retenciones largas.

Summary con cuantiles precalculados

El proceso instrumentado calcula cuantiles en una ventana y exporta valores como P50, P95 o P99.

Ventaja: el cliente puede controlar el algoritmo y la precisión del cuantil.

Limitación: los cuantiles precalculados no son generalmente agregables entre instancias. OpenTelemetry mantiene Summary como tipo legado y no lo recomienda para aplicaciones nuevas porque sus cuantiles no siempre pueden combinarse de forma significativa.

Histograma clásico

Cada observación incrementa buckets acumulativos definidos por límites:

Texto
≤ 0.1 s
≤ 0.3 s
≤ 0.5 s
≤ 1.0 s
≤ 2.0 s
+Inf

El backend calcula el percentil interpolando dentro del bucket que contiene la posición buscada.

Ventaja: los buckets compatibles pueden agregarse entre instancias y dimensiones.

Trade-off: la precisión depende de la ubicación de los límites. Un bucket demasiado ancho alrededor del SLO produce una estimación poco útil.

Histograma exponencial o nativo

Utiliza buckets con resolución relativa y puede cubrir un rango dinámico amplio de manera más eficiente. OpenTelemetry define ExponentialHistogram como estable y Prometheus recomienda histogramas nativos cuando están disponibles y la resolución satisface el requisito de precisión.

Un ejemplo de PromQL

Para un histograma clásico:

PromQL
histogram_quantile(
  0.99,
  sum by (le, route) (
    rate(http_server_request_duration_seconds_bucket[5m])
  )
)

Esta consulta:

  1. Calcula la tasa de incremento de los buckets durante cinco minutos.
  2. Agrega instancias conservando le y route.
  3. Estima el P99 por ruta.

Es un ejemplo conceptual. Los nombres, labels y filtros deben adaptarse a la instrumentación real. También debe definirse si se incluyen errores, cancelaciones y rutas de bajo volumen.

El error de buckets es parte del diseño

Prometheus documenta que histogram_quantile() estima dentro del bucket. Si el percentil cae en un rango de 200 a 300 ms, el valor real podría estar en cualquier punto de ese intervalo según la distribución interna. La interpolación puede producir una cifra precisa en apariencia, pero su resolución real sigue limitada por el bucket.

Por eso los límites deben concentrarse alrededor de decisiones importantes:

No existe un esquema universal. Un endpoint que normalmente tarda 5 ms necesita buckets diferentes de una operación batch de varios minutos.

Por qué no debes promediar percentiles

Considera dos instancias:

Texto
Instancia A
100,000 solicitudes
P99 = 200 ms

Instancia B
1,000 solicitudes
P99 = 2,000 ms

El promedio simple de ambos P99 sería:

Texto
(200 + 2,000) / 2 = 1,100 ms

Ese resultado trata ambas instancias como si tuvieran el mismo peso y no conserva ninguna de las distribuciones originales. No es el P99 global.

Prometheus califica como estadísticamente inválido promediar cuantiles precalculados y recomienda agregar histogramas antes de calcular el cuantil.

PromQL
# Incorrecto: promedio de P99 precalculados
avg(http_request_duration_seconds{quantile="0.99"})

# Correcto para histogramas clásicos compatibles
histogram_quantile(
  0.99,
  sum by (le) (
    rate(http_request_duration_seconds_bucket[5m])
  )
)

Para obtener un percentil global necesitas

También deben coincidir:

Cómo relacionar percentiles con SLO

Un SLO debe especificar indicador, objetivo, población y ventana. La frase siguiente parece completa, pero aún necesita definición operativa:

Texto
99 % de las solicitudes debe completar en menos de 800 ms durante 30 días.

Faltan, como mínimo:

SLO basado en eventos buenos

Una forma directamente agregable es clasificar cada solicitud:

Texto
Evento bueno: duración ≤ 800 ms
Evento malo: duración > 800 ms

El SLI es:

Texto
solicitudes_buenas / solicitudes_totales

El objetivo puede ser:

Texto
≥ 99 % durante 30 días

Google SRE recomienda para servicios request-driven definir la latencia como proporción de solicitudes más rápidas que un umbral, y muestra objetivos múltiples para capturar experiencia central y cola.

Ejemplo:

Texto
90 % de solicitudes < 300 ms
99 % de solicitudes < 800 ms

Esto evita que un único objetivo de cola permita una experiencia central mediocre o que un objetivo central ignore a la cola.

SLO expresado como percentil

La expresión:

Texto
P99 ≤ 800 ms durante la población completa de 30 días

puede ser aproximadamente equivalente a exigir que al menos 99 % de esas observaciones esté por debajo del umbral, siempre que la población, ventana, manejo de empates y método de cálculo sean los mismos.

Pero deja de ser equivalente cuando se cambia la agregación. Por ejemplo:

Texto
P99 de cada ventana de 5 minutos ≤ 800 ms

no es lo mismo que:

Texto
99 % de todas las solicitudes del mes ≤ 800 ms

El primer objetivo evalúa ventanas. El segundo evalúa eventos. Un minuto con bajo tráfico puede pesar igual que uno con alto tráfico si se cuentan ventanas, mientras que el SLO por eventos pondera cada solicitud.

SLO de latencia basado en eventos Clasificación de solicitudes como buenas si duran hasta 800 milisegundos o malas si superan el umbral, para calcular un SLI mensual de 99 por ciento. Solicitudes elegibles ¿Duración ≤ 800 ms? Evento bueno Evento malo SLI = buenos / total Objetivo: ≥ 99 % en 30 días No
Esta formulación convierte la latencia en un presupuesto de eventos malos y permite calcular el consumo del error budget. Cada solicitud se clasifica como buena (≤ 800 ms) o mala (> 800 ms) y el SLI mensual es la proporción de eventos buenos frente al total.

Decisión recomendada

Para SLO y error budget, usa una proporción de eventos buenos cuando puedas medirla de manera consistente. Mantén P50, P95, P99 e histogramas en dashboards para entender la forma y localizar degradaciones.

El percentil es una vista de distribución. El SLO es un contrato cuantitativo sobre experiencia aceptable.

Cómo alertar sin convertir el P99 en ruido

Alertar cada vez que un punto de P99 cruza un umbral produce falsos positivos en servicios de poco tráfico y fatiga en servicios variables.

Antes de paginar, evalúa:

Google SRE recomienda diseñar alertas sobre eventos significativos y consumo de error budget, evaluando precisión, recall, tiempo de detección y tiempo de reset.

Ejemplo defendible de alerta percentil

Texto
Condición A:
P99 > 800 ms durante 10 minutos

Condición B:
volumen > 10,000 solicitudes en la ventana

Condición C:
la degradación aparece en al menos dos evaluaciones consecutivas

No es una configuración universal. El volumen mínimo, la duración y el umbral deben derivarse de la carga, la criticidad y el tiempo de respuesta operativo.

Mejor aún: alerta por consumo del SLO

Si el SLO es 99 % ≤ 800 ms, cada solicitud por encima de 800 ms consume presupuesto. Una alerta de burn rate puede detectar si el presupuesto se está agotando demasiado rápido, en lugar de reaccionar a un P99 aislado.

Esto no elimina el dashboard de percentiles. Separa dos funciones:

Qué hacer con servicios de bajo tráfico

Con 50 solicitudes en cinco minutos, P99 está determinado por el extremo de una muestra pequeña. En ese contexto:

No existe una cifra mágica de muestra. Con N observaciones, el número esperado por encima de P99 es 0.01 × N:

NObservaciones esperadas en el 1 % superior
1001
1,00010
10,000100

Tener cien observaciones no vuelve estable al P99; solo ubica nominalmente una observación en la cola superior. La precisión depende de la distribución, el estimador y el nivel de confianza requerido.

Coordinated omission: la prueba que omite el daño

Una prueba de carga puede reportar percentiles excelentes mientras el sistema estuvo incapaz de aceptar el ritmo planeado.

Ocurre cuando el generador trabaja en ciclo cerrado:

  1. Envía una solicitud.
  2. Espera su respuesta.
  3. Solo entonces envía la siguiente.

Si el sistema se bloquea durante un segundo, el generador también deja de producir nuevas operaciones. Las solicitudes que deberían haber llegado durante la espera nunca existen en el dataset. La medición registra una respuesta lenta, pero omite la cola que habría acumulado un flujo externo independiente.

Ejemplo temporal

Objetivo de carga:

Texto
100 solicitudes por segundo
1 solicitud cada 10 ms

El sistema se detiene durante 1 segundo.

En un generador cerrado, podría ocurrir:

Texto
t = 0 ms     envía solicitud A
t = 1000 ms  recibe A
t = 1000 ms  envía solicitud B

Durante ese segundo no se registraron las aproximadamente 99 llegadas adicionales que el plan pretendía generar.

En un modelo abierto, las operaciones continúan programándose cada 10 ms. El resultado refleja acumulación, espera, rechazo o pérdida de capacidad.

Coordinated omission Generador de carga cerrado que espera una respuesta de un segundo antes de enviar la siguiente solicitud y omite las llegadas programadas durante la pausa. Generador cerrado Sistema Solicitud A · t = 0 Pausa de 1 segundo Respuesta A · t = 1000 ms Solicitud B · recién en t = 1000 ms Llegadas planeadas entre 10 y 990 ms no se midieron
El generador cerrado espera la respuesta de un segundo antes de enviar la siguiente solicitud. La prueba registra una respuesta lenta, pero no representa las cerca de 99 llegadas que un flujo externo independiente habría producido durante el bloqueo.

HdrHistogram incorpora mecanismos para corregir datos por coordinated omission añadiendo valores estimados según el intervalo esperado entre muestras. Esa corrección puede ser útil, pero no reemplaza diseñar una prueba que mantenga el patrón de llegada previsto.

Decisión para pruebas de carga

Cuando una prueba “mejora” P99 al saturarse mientras cae el throughput, sospecha del modelo de carga antes de celebrar el resultado.

Cómo diagnosticar una degradación de percentiles

Un percentil alto es un síntoma. No identifica la causa.

1. Confirma que el dato es comparable

Verifica:

Si la instrumentación cambió durante un despliegue, el salto puede ser telemetría y no comportamiento.

2. Determina qué parte de la distribución se movió

Cambio observadoHipótesis inicial
P50, P95 y P99 subenDegradación general o cambio de población
P50 estable, P95/P99 subenCola, contención o dependencia intermitente
Solo P99 subeEvento raro, muestra pequeña o extremo específico
Percentiles suben y throughput caeSaturación, backpressure o omisión en prueba
Latencia cliente sube, servidor estableRed, gateway, retry o capa intermedia

Estas son hipótesis, no causas. Sirven para decidir qué señal revisar después.

3. Segmenta antes de buscar una causa global

Corta la distribución por:

Una degradación global puede ser la mezcla de una sola ruta lenta con tráfico creciente.

4. Correlaciona con las cuatro señales

Revisa:

Google SRE considera que un aumento de P99 en ventanas cortas puede ser una señal temprana de saturación, pero debe analizarse con el resto del sistema.

5. Usa exemplars o trazas para pasar de métrica a petición

Un histograma muestra que existen solicitudes lentas. Una traza distribuida permite localizar en qué tramo se acumuló el tiempo.

El flujo operativo es:

Texto
P99 aumenta
→ identificar bucket y segmento
→ seleccionar exemplar o trace ID
→ inspeccionar spans
→ correlacionar logs y recursos
→ formular causa comprobable

La metodología completa se desarrolla en la pieza especializada de investigación estructurada de incidentes.

6. Valida la corrección sobre la distribución completa

Después del cambio, no compruebes solo que P99 bajó. Valida:

Una optimización puede reducir P99 descartando solicitudes, acortando un timeout o devolviendo fallback degradado. La latencia mejora, pero la calidad o disponibilidad empeora.

Errores frecuentes

Interpretar P99 sin volumen

Problema: no se sabe cuántas observaciones representa la cola.

Consecuencia: se minimiza o exagera el impacto.

Corrección: mostrar volumen total y conteo aproximado por encima del percentil.

Confundir P95 con disponibilidad

Problema: asumir que P95 implica 95 % de éxito.

Consecuencia: mezclar dos SLIs y ocultar respuestas rápidas fallidas o respuestas exitosas tardías.

Corrección: medir latencia y éxito por separado.

Mezclar endpoints

Problema: una ruta de alto volumen domina el percentil global.

Consecuencia: la operación crítica lenta queda oculta.

Corrección: segmentar por ruta normalizada o clase funcional.

Comparar ventanas distintas

Problema: contrastar P99 de cinco minutos con P99 diario.

Consecuencia: atribuir una diferencia a rendimiento cuando proviene de agregación.

Corrección: alinear ventana y población.

Promediar percentiles

Problema: calcular el promedio de P99 de instancias o regiones.

Consecuencia: obtener un número sin interpretación estadística válida.

Corrección: agregar histogramas o datos subyacentes antes del cuantil.

Usar muestras insuficientes

Problema: calcular P99 sobre pocas observaciones.

Consecuencia: alta volatilidad y alertas por un extremo aislado.

Corrección: mostrar N, ampliar ventana o usar conteo de eventos lentos.

Excluir errores y timeouts sin declararlo

Problema: medir solo solicitudes completadas con éxito.

Consecuencia: las peores operaciones desaparecen de la distribución.

Corrección: definir elegibilidad y representar timeouts como eventos malos o en una métrica complementaria.

Truncar la métrica en el timeout

Problema: registrar todas las operaciones canceladas como exactamente 1 segundo.

Consecuencia: crear un pico artificial y perder la duración real posterior.

Corrección: distinguir tiempo observado por el cliente, cancelación y trabajo residual del servidor.

Tratar percentiles cliente y servidor como equivalentes

Problema: comparar puntos de medición distintos.

Consecuencia: diagnosticar erróneamente red o aplicación.

Corrección: documentar el alcance de cada temporizador.

Comparar histogramas con buckets distintos

Problema: asumir que dos estimaciones tienen igual precisión.

Consecuencia: interpretar diferencias de instrumentación como cambios de rendimiento.

Corrección: revisar esquema, interpolación y resolución.

Ignorar coordinated omission

Problema: el generador deja de enviar durante respuestas lentas.

Consecuencia: percentiles artificialmente optimistas bajo saturación.

Corrección: usar un modelo de carga coherente con el patrón de llegada y validar throughput ofrecido.

Optimizar el percentil y empeorar el sistema

Problema: reducir P99 con timeouts demasiado agresivos, rechazo o fallback.

Consecuencia: mejora aparente de latencia con caída de éxito o calidad.

Corrección: validar conjuntamente latencia, disponibilidad, calidad y carga.

Los límites de espera y reintentos deben diseñarse como un sistema. La relación con el presupuesto temporal y la amplificación de carga se desarrolla en la pieza sobre timeouts correctamente configurados y las tormentas de reintentos.

El comportamiento del circuito ante dependencias lentas se desarrolla en fallos en cascada.

Checklist operativo

Antes de interpretar un percentil, responde:

Conclusión

P50, P95 y P99 no compiten entre sí. Cada uno observa una región distinta de la distribución.

P50 describe el centro. P95 muestra una cola frecuente. P99 revela extremos que pueden ser masivos a escala. Ninguno, por separado, define si el sistema está disponible, si cumple un SLO o si la experiencia es aceptable.

La lectura correcta exige cinco datos:

  1. Percentil: qué posición se está observando.
  2. Ventana: durante qué periodo.
  3. Volumen: cuántas observaciones lo sostienen.
  4. Población: qué operaciones, regiones y resultados se mezclaron.
  5. Método: cómo se capturó, agregó y estimó la distribución.

La acción concreta es revisar cualquier dashboard que hoy muestre P95 o P99 aislados. Añade volumen, ventana, segmentación, umbral de SLO y acceso al histograma o heatmap. Después valida que los percentiles se calculen sobre distribuciones agregables y que errores, timeouts y pruebas de carga no estén eliminando precisamente las observaciones que necesitas ver.

Un percentil sin contexto es un número. Un percentil conectado a una decisión operativa es una señal.

Preguntas frecuentes

¿P95 significa que 95 % de las solicitudes tardó exactamente ese valor?

No. Significa que aproximadamente 95 % terminó en ese valor o menos dentro de la población y ventana medidas. Las solicitudes pueden distribuirse en muchos valores inferiores.

¿Qué es mejor: P95 o P99?

Ninguno es universalmente mejor. P95 suele ser más estable y muestra una cola frecuente. P99 observa una región más extrema y requiere más volumen. La elección depende de criticidad, tráfico, fan-out, umbral de experiencia y costo de falsos positivos.

¿Se pueden promediar percentiles?

En general, no. El promedio de percentiles calculados sobre grupos separados no produce el percentil global. Se necesitan observaciones subyacentes o histogramas y sketches agregables compatibles.

¿Qué diferencia existe entre promedio y P50?

El promedio divide la suma total de duraciones entre el número de observaciones. P50 es la mediana: el valor que divide aproximadamente la muestra en dos mitades. Los extremos pueden mover el promedio sin alterar P50.

¿Qué es coordinated omission?

Es una subestimación de la latencia que ocurre cuando el generador de carga deja de producir nuevas operaciones mientras espera una respuesta lenta. Las llegadas que debieron ocurrir durante la espera no se registran.

¿Cuántas solicitudes necesito para calcular P99?

No existe una cifra universal. Con cien observaciones solo se espera una en el 1 % superior, lo que produce una estimación muy sensible. La muestra necesaria depende de la distribución, la precisión requerida, la ventana, el estimador y el uso operativo. Siempre muestra el volumen junto al percentil.

¿P99 por debajo de 800 ms equivale a un SLO de 99 % bajo 800 ms?

Puede ser aproximadamente equivalente si se calcula sobre exactamente la misma población y ventana con una definición compatible. No es equivalente si se promedian percentiles, se evalúan ventanas separadas o se excluyen eventos de manera distinta. Para error budgets suele ser más claro contar eventos buenos y malos contra el umbral.

¿Un P99 menor siempre representa una mejora?

No. Puede bajar porque se redujo trabajo, porque se rechazaron solicitudes, porque aumentaron timeouts o porque cambió la población. Debe validarse junto con éxito, calidad, throughput, saturación y composición del tráfico.

Fuentes técnicas

Jorel del Portal

Jorel del Portal

Ingeniero de sistemas especializado en arquitectura de software empresarial y plataformas de alta disponibilidad.