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 | |
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
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.