Resumen Técnico: Resolución de Problemas en la Ejecución de Solicitudes Concurrentes en k6
Contexto
El propósito de este artículo es solucionar el problema que surge al enviar ‘n’ solicitudes HTTP concurrentes cada segundo durante una duración de ‘d’ segundos utilizando k6, específicamente cuando se intenta realizar un total de 12,000 solicitudes en un período de 10 segundos, pero se observan números de rendimiento inferiores.
Problema Identificado
En el código presentado, hay un comportamiento inesperado: al configurar RUNTIME_TOTAL_DURATION
en 10 segundos, solo se envían aproximadamente 6,300 solicitudes, en lugar de las 12,000 solicitudes esperadas. Por el contrario, cuando NUM_EVENTS
se establece en 1000, se envían 12,000 solicitudes tanto en 1 segundo como en 10 segundos.
Análisis del Código
El código configura 12 VUs y espera realizar 100 solicitudes por segundo por cada URL. Sin embargo, al examinar el bucle while
, podemos observar que podría no estar optimizando correctamente la ejecución de las solicitudes:
-
Bucle sin límites definidos: Si el proceso de envío de las solicitudes no finaliza de manera efectiva o se enfrenta a limitaciones de tiempo en el manejo de las respuestas, esto puede afectar el número total de solicitudes realmente enviadas.
-
Manejo de respuestas asíncronas: Al utilizar
http.asyncRequest()
, puede haber un desfase en la respuesta, que limita la cantidad de solicitudes que pueden enviarse dentro del período cronometrado. - Recursos del sistema: Dado que se está ejecutando en una máquina local con Windows, las limitaciones de hardware y software del sistema operativo pueden afectar el rendimiento y la capacidad de manejar múltiples solicitudes simultáneamente.
Soluciones Propuestas
-
Ajustar el enfoque de envío: Cambiar la lógica para que el envío de las solicitudes no dependa de la finalización de las iteraciones anteriores. Esto se puede lograr asegurándose de que se utilizan conceptos de ejecución no bloqueante o paralelismo más adecuados.
-
Optimización del bucle: Asegurarse de que el número de iteraciones y la ejecución de las solicitudes se manejen de manera que maximicen las solicitudes enviadas en el tiempo especificado. Por ejemplo, aumentando el número de VUs o ajustando los rangos del bucle
while
. -
Configuración del sistema: Si es posible, ejecutar la prueba en un entorno más robusto o en un sistema basado en la nube que pueda manejar la carga esperada sin las limitaciones del hardware local.
-
Verificación de configuración de k6: Asegurarse de que las opciones en la configuración de k6 (por ejemplo,
vus
,iterations
, ythresholds
) estén correctamente establecidas y evaluen adecuadamente el rendimiento de las solicitudes. - Aumentar la concurrencia en el código: Si la respuesta es importante, considerar dividir la lógica en unidades más pequeñas y permitir que las solicitudes se envíen en batch, manejando adecuadamente las respuestas a medida que se reciben.
Conclusiones
Identificar el origen de la desaceleración y optimizar tanto el código como el entorno de ejecución permitirá maximizar la cantidad de solicitudes HTTP enviadas dentro del marco de tiempo especificado. Aplicar estas recomendaciones debería ayudar a cumplir con el objetivo de enviar 12,000 solicitudes en 10 segundos de manera efectiva.