Ficha — 5.4 y 6.4 · Carga a la concurrencia objetivo (65 usuarios)
- ID de prueba: K6-CARGA-65 (criterios 5.4 y 6.4)
- Fecha y hora: 2026-10-10, 18:06:34 a 18:22:45 UTC (13:06 a 13:22 Bogotá)
- Ejecutado por: subagente
ejecutor-pruebas-trl(Claude Opus 5.5) desde el portátil de [dato real omitido] (máquina distinta del servidor), k6 2.2.0 - Entorno: producción tratada como staging.
https://www.proyectonara.com(Vercelnara-web, desplieguedpl_FVHfT9wmkA8oZBivBdABMLyUrtcU) →nara-apien Render plan1c-2g(1 CPU / 2 GB, Ohio, instancia…-nl5hq) → Atlasnara. - Versión evaluada:
nara-api92d7f73. A mitad de la bajada de carga Lucho desplegónara-apidcef48e(Renderdep-db583vek1f9s73e53sd0, 18:20:45–18:21:36Z;/api/healthya respondíadcef48ea las 18:22:11Z) ynara-webdpl_xNipoZa2zjPMm81K74kDN14p33Jn(creado 18:20:32Z). k6 no se detuvo porque el cambio no se vio en vivo. Por decisión de [dato real omitido] la carga no se repite: el veredicto usa solo el tramo previo al inicio del despliegue de Render (18:06:30–18:20:44Z), que contiene la meseta completa de 65 usuarios (18:15:34–18:20:34Z, 5 min). El tramo 18:20:45–18:22:45Z queda declarado como contaminado. - Datos usados: volumen real de producción (sin conteo del día: no hay lectura autorizada de la base). Las cuentas de prueba ven solo el territorio «Prueba» (10 pacientes;
TRL-QA-20261010-clinve 0). - Procedimiento: copia corregida
k6_carga_mezcla.js(desviación declarada; el originalpruebas/scripts_ajustados/k6_carga.jsfalla desde la 2.ª iteración, veroriginal_smoke/k6.log: 10 de 19 peticiones en 401). Mismos escalones (2 min a 26, 5 min en 26, 2 min a 65, 5 min en 65, 2 min a 0), rutas por rol, pausas y umbrales del original. Mezcla: 6 expertos, 7 clínicos (en lugar del administrador, sin cuenta de prueba), 6 observadores y 46 pacientes (prueba1–prueba5). Comando:k6 run --summary-export=resultado_carga.json --out csv=series_carga.csv.gz -e BASE_URL=https://www.proyectonara.com -e VUS_OBJETIVO=65 -e ETIQUETA=carga k6_carga_mezcla.js(claves solo en el entorno del proceso,_herramientas/k6_run.js). - Resultado: 5.4 Pasa (con la desviación del script) sobre
92d7f73. 6.4 Parcial (provisional): cumple los umbrales, pero no es la versión final congelada y las cuentas de prueba no recorren el volumen acordado.
Métricas
| Medida | Corrida completa (k6, mezcla versiones) | Tramo previo al despliegue (18:06:30–18:20:44Z) | Meseta 65 VUs previa (18:15:00–18:20:44Z) | Meseta 26 VUs (18:08–18:12:59Z) | Umbral |
|---|---|---|---|---|---|
| Peticiones | 16.045 | 14.503 | 8.863 | 3.365 | — |
| Errores | 0 (0 %) | 0 (0 %) | 0 | 0 | < 1 % |
| p50 | 365 ms | 378 ms | 527 ms | 324 ms | — |
| p95 | 1.647 ms | 1.695 ms | 1.874 ms | 1.219 ms | < 2.000 ms |
| p99 | 3.698 ms | 3.698 ms | 3.709 ms | 3.684 ms | — |
| Máximo | 9.254 ms | 9.254 ms | 5.995 ms | 3.864 ms | — |
| Código de salida de k6 | 0 | — | — | — | 0 |
p95 por tramos de 30 s en la meseta de 65 (analisis_30s.txt): 2.241, 1.540, 1.466, 1.585, 2.714, 2.062, 2.746, 1.511, 1.470, 1.457 y 1.470 ms (4 de 11 tramos ≥ 2 s). Holgura escasa: la meseta pasa por 126 ms.
Rutas que más pesan (meseta 65): /api/app-state p50 ≈ 1,2 s en todos los roles (p95 2,43 s en clínico y 2,45 s en experto); /api/people del observador p50 3.717 ms y p95 4.741 ms, y ya con 26 usuarios p50 3.703 ms (independiente de la carga; responde 389 bytes sin elementos).
Servidor (Render, ../5.5_capacidad/carga_*.json), tramo previo: CPU 0,005–0,010 en reposo y 0,109–0,162 (máx.) de 1 CPU en la meseta; memoria de 350 a 682 MB de 2 GB. Peticiones en Render: hasta 1.597/min en la meseta, todas 200.
Tramo contaminado (desviación declarada)
18:20:45–18:22:45Z (bajada de 65 a 0): 1.542 peticiones, 0 errores, p95 1.237 ms, máx. 4.059 ms. En ese tramo Render reemplazó la instancia (…-nl5hq termina en 18:22 con 684 MB; …-kf244 arranca en 18:22 con 366 MB): es un reinicio del servicio por el despliegue. No hubo errores ni cortes observables desde k6 ni desde la sonda de versión. Las cifras de ese tramo no se atribuyen a ninguna versión.
Evidencia
resultado_carga.json, resultado_carga_2026-10-10T18-22-45-190Z.json, k6_carga.log, series_carga.csv.gz, analisis_por_minuto.json, analisis_30s.txt, analisis_mesetas.txt, analisis_por_version.txt, grafica_carga.svg, k6_carga_mezcla.js, original_smoke/, ../5.5_capacidad/, ../version/vigilancia_version.csv.
Limitaciones
- Script corregido (cookie y mezcla de roles): desviación.
- Generador único (una IP). Las cuentas de prueba ven 10 pacientes (o 0): las listas trabajan con pocos elementos; el volumen acordado (≈ 454 personas) está en la base pero estas cuentas no lo recorren.
- Sin cuenta de administrador en la mezcla.
- Sin latencia del lado del servidor (
render-nara.js metricas latenciafalla) ni métricas de Atlas.
Script original sin noCookiesReset; /api/people del observador ≈ 3,7 s; /api/app-state ≈ 1,2 s; métrica de latencia de render-nara.js rota; despliegues durante la prueba.