Guía Completa para Benchmarking de APIs

DevOps

Cómo medir y comparar APIs: define SLOs, registra p95/p99, RPS y 5xx, ejecuta baseline/carga/estrés/soak y automatiza regresiones.

Si no mides tu API con una línea base fija, no sabes si una versión va mejor, peor o solo distinto. Yo resumiría todo en esto: hay que medir latencia p95/p99, RPS, errores 5xx, disponibilidad y uso de recursos; hacerlo en un entorno parecido a producción; y comparar siempre con la misma carga, los mismos datos y el mismo criterio.

Si quiero que el benchmark sirva de verdad, me centro en cuatro pasos: definir SLOs por endpoint y por flujo, elegir bien herramienta y observabilidad, ejecutar baseline, carga, estrés y soak, y automatizar alertas de regresión en CI/CD. Un ejemplo simple: si el checkout debe ir por debajo de 3 s en p95, cada endpoint del flujo necesita su propio límite, como login < 400 ms o pago < 900 ms.

Lo que no debo hacer: mirar solo la media, probar con datos irreales, usar entornos con ruido o cambiar la carga entre versiones. Ahí es donde un benchmark deja de servir.

Puntos clave de un vistazo:

  • Benchmarking fija una referencia; no es lo mismo que carga o estrés.

  • p95 y p99 importan más que la media.

  • CPU > 70–80 %, colas en BD y más 5xx suelen marcar saturación.

  • Warm-up de 30 a 120 s para no medir el arranque.

  • Soak de 4+ horas para ver fugas de memoria o conexiones.

  • Regresión: si el p95 sube, por ejemplo, más de un 20 % frente a la línea base, conviene pararlo y revisar.

Para verlo rápido, este es el mapa mental que yo usaría:

Bloque

Qué miro

Objetivos

SLOs por endpoint y por journey

Métricas

p50, p95, p99, RPS, 5xx, disponibilidad, CPU, BD, caché

Pruebas

Baseline, carga, estrés, soak

Herramientas

k6, Artillery, Gatling, JMeter o cliente propio

Entorno

Local, staging, rendimiento dedicado o shadow traffic

Control de cambios

Misma carga, mismo dataset, misma configuración

Con esa base, el resto del artículo baja a tierra cómo montar pruebas que sí permitan comparar resultados y detectar fallos antes del despliegue.

#AskRaghav | How To Decide Benchmark in Performance Testing

Métricas clave y objetivos para el benchmarking de APIs

Ahora toca medir qué mueve esa línea base. No basta con mirar un dato suelto. Hay que observar latencia, capacidad de procesamiento, errores e infraestructura como un todo.

Latencia, capacidad de procesamiento, tasa de error, disponibilidad y métricas de infraestructura

La latencia es la métrica que más percibe el usuario. Y aquí aparece un fallo muy común: fijarse solo en la media. Sobre el papel puede parecer que todo va bien, pero mientras tanto una parte de las peticiones puede estar sufriendo tiempos de respuesta inaceptables. Por eso conviene usar p50 para la mediana, p95 para el comportamiento habitual bajo más exigencia y p99 para los peores casos.

La latencia cuenta cómo se siente la experiencia. La capacidad de procesamiento, o throughput (RPS), muestra cuánto aguanta el sistema. Las dos van de la mano mediante la Ley de Little: concurrencia = throughput × latencia. Cuando el sistema se acerca a la saturación, suele pasar lo mismo una y otra vez: la latencia sube, la capacidad de procesamiento deja de crecer y la tasa de error - sobre todo los errores 5xx del servidor - empieza a aumentar. Ese es el patrón que interesa detectar antes de llegar a producción.

En infraestructura, las señales más claras de saturación suelen ser una CPU sostenida por encima del 70–80 %, presión en el pool de conexiones y un aumento de la latencia de base de datos.

Cómo definir benchmarks y SLOs por endpoint y flujo de usuario

Conviene empezar por el flujo crítico del usuario: login, búsqueda, carrito y pago. La clave está en medir siempre del mismo modo para poder comparar versiones sin mezclar criterios. Cada endpoint necesita su propio presupuesto de latencia, y el SLO del journey completo sale de sumar esas partes.

Por ejemplo, si el objetivo es que el checkout completo se mantenga por debajo de 3 segundos en el p95 durante las horas punta, los endpoints individuales pueden tener metas como estas:

  • login: p95 < 400 ms

  • actualización de carrito: p95 < 500 ms

  • confirmación de pago: p95 < 900 ms

La tabla siguiente resume las métricas principales, qué significa cada una, cómo medirla, el objetivo habitual y el error más común:

Métrica

Definición

Cómo medirla

Objetivo típico

Error habitual

Latencia p95/p99

Tiempo de respuesta por debajo del cual cae el 95 % / 99 % de las peticiones

Herramientas de carga con histogramas de percentiles

p95 < 500–800 ms

Usar solo la media y ocultar problemas de cola

Capacidad de procesamiento (RPS)

Peticiones procesadas con éxito por segundo

Métricas del servidor o de la herramienta de carga

Ajustado al pico real de tráfico con menos del 1 % de errores 5xx

Probar cargas irreales o ignorar patrones de tráfico reales

Tasa de error 5xx

Porcentaje de respuestas con error de servidor

Distribución de códigos HTTP en los logs

< 1 % bajo carga de pico

Mezclar errores 4xx y 5xx y perder visibilidad de fallos del servidor

Disponibilidad

Porcentaje de tiempo que la API responde correctamente

Monitorización continua en producción y en tests

≥ 99,9 % para endpoints críticos

Medir solo uptime de calendario, no corrección funcional

CPU / Pool de conexiones

Uso de recursos del servidor y presión sobre conexiones a BD

APM, métricas del sistema operativo y del servidor de BD

CPU < 70–80 %; latencia de BD estable; pool sin colas de espera

Testear en entornos no representativos de producción

Los SLOs que mejor funcionan no se quedan en una sola métrica. Mezclan varias en una condición clara. Por ejemplo, el endpoint de pago debe mantener p95 < 900 ms y tasa de error 5xx < 0,5 % bajo 2.000 RPS. Así, el benchmark no valida solo velocidad. Valida velocidad y fiabilidad a la vez.

Estos objetivos solo tienen sentido si se miden en un entorno reproducible y con datos suficientes para explicar cada variación.

Herramientas, observabilidad y entornos de prueba

Cuando ya tienes las métricas definidas, toca medirlas con carga controlada, buena observabilidad y un entorno que se parezca de verdad al que te importa. Si no puedes explicar por qué sale un resultado, ese benchmark vale poco. Necesitas una herramienta que genere carga y, al mismo tiempo, señales suficientes para saber de dónde viene cada cambio.

Herramientas para generar carga en la API

La elección depende del contexto del equipo, no de la herramienta de moda. k6 encaja bien en APIs REST y gRPC dentro de flujos de CI/CD con JavaScript o TypeScript. Artillery suele ir bien en microservicios y entornos cloud-native, sobre todo por su integración con OpenTelemetry. Gatling destaca en escenarios de alta concurrencia dentro del ecosistema JVM. Apache JMeter sigue siendo una opción muy sólida para protocolos heredados como JDBC, JMS, LDAP o SOAP, en especial si el equipo de calidad ya lo usa. Y los clientes HTTP personalizados dan el máximo control para pruebas locales muy concretas.

Herramienta

Mejor caso de uso

Punto fuerte

Limitación

Adecuación a CI

k6

APIs REST/gRPC, CI/CD moderno

Fácil de automatizar en CI/CD

Menor soporte para protocolos no HTTP

Excelente

Artillery

Microservicios, GraphQL, WebSocket

YAML/JS, integración con OpenTelemetry

Menos adecuada para cargas muy altas

Buena

Gatling

Alta concurrencia en entornos JVM

E/S asíncrona, informes detallados

Requiere Scala o experiencia JVM

Buena

Apache JMeter

Protocolos heredados y equipos de calidad

Soporta muchos protocolos e interfaz gráfica

Más pesado y menos eficiente para CI

Buena con configuración extra

Clientes HTTP personalizados

Experimentos locales muy específicos

Máxima flexibilidad

Sin informes ni escenarios reutilizables

Limitada

La herramienta mete la carga. La observabilidad te dice qué ha pasado de verdad.

Datos de observabilidad para interpretar los resultados

Durante la prueba, registra CPU, memoria, E/S de red y E/S de disco, uso del pool de conexiones, tasa de peticiones y caché. Súmale logs estructurados y trazas distribuidas con IDs de correlación. Cada señal tiene que servir para leer el benchmark con sentido: las trazas dejan ver si la latencia viene de la aplicación, de la base de datos o de una cola.

Hay un caso muy típico: la latencia de la API parece estable, pero la acumulación de mensajes no deja de crecer durante el test. Eso apunta a un cuello de botella en el procesamiento asíncrono. Y ese problema no siempre aparece en las métricas de latencia de la API.

Instrumenta el código con OpenTelemetry y exporta las trazas a Jaeger, Zipkin o cualquier plataforma compatible. También conviene revisar que las cabeceras de trazado se propaguen entre todos los servicios, incluidas las colas de mensajes. Si esa cadena se rompe, leer los datos se vuelve mucho más difícil.

Sin un entorno estable, ni siquiera una observabilidad buena te da resultados comparables.

Elegir el entorno de prueba adecuado

El entorno en el que ejecutas el benchmark marca la diferencia entre un dato útil y uno engañoso. Si tu API tiene usuarios en España, lanza la carga desde una región de la UE cercana. Si no, estarás metiendo latencia artificial y el test ya nace torcido.

Tipo de entorno

Ventaja

Limitación

Mejor momento para usarlo

Desarrollo local

Bajo coste, feedback inmediato

No refleja tráfico ni datos reales

Depuración inicial y comprobaciones rápidas

Staging compartido

Servicios integrados, configuración similar a producción

Ruido por uso compartido; capacidad limitada

Validación en QA y pruebas de integración

Entorno de rendimiento dedicado

Réplica de producción con datos e infraestructura equivalentes

Coste más alto; riesgo de desviación de configuración

Antes de lanzamientos mayores o cambios arquitectónicos

Shadow traffic en producción

Máximo realismo con tráfico real

Puede afectar a usuarios y servicios dependientes

Validación previa al despliegue de nuevas versiones

Usa datos, índices y configuración equivalentes a producción. Un dataset pequeño puede ocultar contención y bloqueos, y entonces el benchmark te cuenta una historia que luego no se parece a lo que pasa en producción.

Proceso paso a paso para hacer benchmarking de una API correctamente

Proceso de Benchmarking de APIs: 4 Tipos de Prueba Esenciales

Proceso de Benchmarking de APIs: 4 Tipos de Prueba Esenciales

Con el entorno listo y la observabilidad ya funcionando, toca ordenar las pruebas con cabeza. Si sigues una secuencia clara, los resultados salen comparables y también más fáciles de repetir.

Planifica escenarios, endpoints, payloads y datos de prueba

Empieza por los flujos que más importan. Para saber cuáles son de verdad, apóyate en logs de producción o en trazas de APM. Con esa base, monta un modelo de carga que se parezca al uso real: por ejemplo, un 60 % de peticiones GET ligeras, un 30 % de POST/PUT de peso medio y un 10 % de transacciones más pesadas, como pagos o exportaciones.

Los payloads deben parecerse a los del cliente de verdad. Eso incluye credenciales de autenticación, cabeceras de localización y estructuras JSON que la aplicación ya usa. En los datos, tira de información sintética o anonimizada, pero con formatos reales. Y hay un detalle que suele pasarse por alto: regenera el dataset en cada ejecución. Si no lo haces, acabas comparando pruebas sobre datos “gastados” y el resultado se tuerce.

Ese perfil de carga será tu punto de partida para las pruebas de baseline, carga, estrés y soak.

Ejecuta pruebas de baseline, carga, estrés y soak

No todas las pruebas responden a lo mismo. Cada una sirve para una pieza del puzle, y por eso conviene hacerlas en este orden:

Tipo

Objetivo

Duración orientativa

Señal clave

Baseline

Latencia sin contención; referencia de regresión

Ventana corta a carga baja, por ejemplo 30 minutos

p50/p95 estables, errores mínimos

Carga

Comportamiento bajo tráfico esperado

Rampa de 5–10 min + 30–120 min sostenidos

p95/p99 dentro del SLO, throughput estable

Estrés

Punto de saturación y límite del sistema

Pasos de 5 minutos hasta superar el umbral de error

La latencia se dispara y los errores aumentan

Soak

Degradación progresiva y fugas de memoria

4+ horas (8–72 h en sistemas críticos)

Crecimiento de memoria, GC, conexiones abiertas

Antes de registrar percentiles, descarta las primeras muestras. Usa una fase de calentamiento de entre 30 y 120 segundos. Ese margen deja que las cachés se estabilicen y que el JIT compile las rutas más frecuentes. Dicho de forma simple: si mides demasiado pronto, estás midiendo el arranque, no el comportamiento normal.

En las pruebas de estrés, sube la carga poco a poco. El punto de saturación suele verse cuando el p95 o el p99 deja de crecer de manera lineal y empieza a irse hacia arriba de golpe. Eso pasa muchas veces cuando la CPU supera el 80–90 % o cuando se agota el pool de conexiones a base de datos.

Con estos cuatro ensayos, ya puedes cruzar latencia, errores y métricas del sistema para ver dónde está el atasco.

Analiza cuellos de botella, compara versiones y detecta regresiones

Aquí la idea es pasar del síntoma a la causa. No basta con ver que sube la latencia; hay que mirar qué más estaba pasando en ese mismo momento. Cruza los percentiles con CPU, base de datos y caché. Si un pico de p99 coincide con la CPU al 100 %, lo más normal es que haya saturación de CPU o rutas de código poco finas. Si el pico llega a la vez que empeora el tiempo de respuesta de la base de datos, el foco está en las consultas. Y si cae la tasa de aciertos de caché, puede haber evicción o datos fríos.

Síntoma

Causa probable

Métricas a revisar

Posible remediación

p99 se dispara, p50 estable

Contención puntual o pausas de GC

GC logs, CPU spikes, lock waits

Revisar pausas de GC y sincronización

La latencia sube con la carga de forma lineal

Cuello de botella en CPU

CPU %, tiempo de proceso por petición

Optimizar rutas críticas

Los errores aumentan antes de saturar la CPU

Pool de conexiones agotado

Conexiones activas, timeouts

Revisar la gestión de conexiones

La memoria crece de forma sostenida en soak

Fuga de memoria o recursos no liberados

Heap, conexiones abiertas

Revisar el ciclo de vida de objetos y recursos

La latencia sube al mismo tiempo que cae la tasa de aciertos de caché

Evicción o datos fríos

Tasa de aciertos de caché, tiempo de respuesta

Ajustar la estrategia de caché

Al comparar versiones, mantén la misma carga, el mismo entorno y el mismo dataset. Si cambias una de esas piezas, la comparación pierde valor. Haz varias repeticiones y quédate con la mediana como referencia, no con el mejor resultado. Ese “mejor caso” suena bien en una diapositiva, pero sirve de poco para tomar decisiones.

Si el p95 sube de forma sostenida entre una versión y otra, ya tienes una señal de regresión que conviene revisar. Documenta cada ejecución con fecha, versión de la API, conjunto de datos y anomalías. Luego, cuando vuelvas a mirar resultados dentro de unas semanas, te alegrarás de haberlo dejado todo apuntado.

Buenas prácticas para el benchmarking continuo y el rendimiento a largo plazo de las APIs

Diseña APIs y entornos para benchmarks reproducibles

Después de revisar los resultados, toca dejar unas condiciones fijas para que cada benchmark pueda compararse con el anterior. Si cada ejecución cambia un poco, el benchmark pierde valor.

El primer paso está en el diseño de la propia API. Los endpoints deben ser stateless: cada petición tiene que ir completa y no depender de estado guardado en el servidor. También conviene usar operaciones idempotentes como PUT y DELETE, para que los reintentos del generador de carga no alteren los datos entre pruebas. Y hay otro punto que suele pasar desapercibido: define paginación y filtros consistentes para que cada ejecución someta al sistema a la misma carga de trabajo.

En el entorno pasa lo mismo. Usa contenedores con límites de recursos fijados y gestiona la infraestructura como código. Fija las versiones de la base de datos, la caché y el sistema operativo. Además, desactiva las tareas programadas durante las ventanas de prueba, porque un proceso en segundo plano puede estropear una comparación que, sobre el papel, parecía limpia.

Con el entorno ya estandarizado, el siguiente paso es automatizar las ejecuciones y guardar una línea base que se pueda comprobar.

Automatiza el benchmarking en CI/CD y documenta las líneas base

La forma más directa de hacerlo es meter las pruebas de rendimiento dentro del pipeline de CI/CD. Suele funcionar bien un esquema de dos capas.

En cada pull request, ejecuta una prueba de humo corta de entre 2 y 5 minutos, con umbrales simples: tasa de error < 1 % y latencia p95 < 500 ms. Si no se cumplen, el merge se bloquea.

Luego, por la noche o antes de cada release, lanza pruebas más completas - carga, estrés y soak - contra staging. Guarda los resultados en series temporales y revísalos en dashboards. Así no miras una foto suelta, sino la evolución del sistema con el paso del tiempo.

Para cada endpoint crítico, registra los valores de referencia: p50, p95, p99, tasa de error y throughput. Guárdalos junto a la versión de la API y la fecha dentro del repositorio. Si el p95 sube más de un 20 % frente a la línea base, el pipeline debe detectarlo de forma automática y tratarlo como un fallo.

De esta forma, el benchmark deja de ser algo puntual y se convierte en un control constante de regresiones.

Conclusión: Reglas clave para un benchmarking de APIs fiable

Un benchmark fiable define objetivos, mide percentiles, usa entornos realistas y automatiza la comparación.

  • Define el SLO antes de medir: sin un objetivo claro, el resultado no dice gran cosa.

  • Mide percentiles, no medias: p95 y p99 muestran mejor la experiencia real del usuario.

  • Automatiza y documenta la línea base: las regresiones se detectan al comparar versiones, no cuando ya ha saltado el problema.

FAQs

¿Cada cuánto conviene repetir el benchmark?

No hay una frecuencia fija. La periodicidad debe ir de la mano de cómo evoluciona tu proyecto. En Niom Solutions aconsejamos integrarlo dentro de la monitorización continua y repetirlo cada vez que haya cambios de peso en la arquitectura.

También merece la pena hacerlo después de actualizaciones críticas. Por ejemplo, tras cambios en el stack tecnológico, ajustes en las consultas a la base de datos o modificaciones en la configuración de los servidores. Así puedes comprobar, sin dar palos de ciego, que el rendimiento no se ha resentido.

¿Cuándo se considera saturada una API?

Una API se considera saturada cuando su arquitectura deja de poder procesar todo el volumen de solicitudes que recibe. La señal más común salta a la vista: sube la latencia o empiezan a aparecer fallos en las respuestas.

Este punto suele detectarse con pruebas de carga y de estrés. Estas pruebas enseñan dónde están los cuellos de botella del sistema cuando llega un pico de tráfico.

¿Qué hacer si el p95 empeora entre versiones?

Si el p95 empeora entre versiones, toca ir al origen del cuello de botella. Esta métrica muestra la latencia del 5 % de las solicitudes más lentas, así que suele sacar a la luz los problemas que no se ven en el promedio.

Separa el análisis por capas: comprueba si el fallo viene de la lógica de negocio, de la base de datos o de las propias consultas, y compáralo con el historial de ejecución. Cuando el p95 sube, muchas veces la causa está en consultas más pesadas en la nueva versión, bloqueos por concurrencia o una caché que ya no responde como debería.

Publicaciones de blog relacionadas