<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>loadtest.app</title><description>Herramientas de pruebas de carga analizadas y comparadas, y guías para lanzar y leer pruebas de carga.</description><link>https://loadtest.app/</link><language>es-ES</language><item><title>Ley de Amdahl: fórmula, ejemplos y límites</title><link>https://loadtest.app/es/amdahls-law/</link><guid isPermaLink="true">https://loadtest.app/es/amdahls-law/</guid><description>La ley de Amdahl explicada: fórmula, tabla de aceleración y ejemplos, más la ley de Gustafson, la USL y lo que significan para las pruebas de carga.</description><pubDate>Sun, 01 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, un servicio de pruebas de carga mencionado en este artículo.&lt;/p&gt;&lt;p&gt;La ley de Amdahl (Amdahl&amp;#39;s law) dice que la aceleración que se obtiene al ejecutar un trabajo en paralelo está limitada por la parte que no puede ejecutarse en paralelo. Si una fracción p del trabajo se reparte entre n procesadores, servidores o hilos, la aceleración es S = 1 / ((1 − p) + p/n), y por mucho que crezca n nunca supera 1 / (1 − p). Con un 95 % de trabajo paralelo, el techo es de 20 veces, incluso con mil máquinas.&lt;/p&gt;
&lt;p&gt;Las cifras de abajo son aritmética, sin ninguna prueba ejecutada detrás. Los artículos citados se comprobaron el 1 de noviembre de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Fracción paralela p&lt;/th&gt;
&lt;th&gt;n = 2&lt;/th&gt;
&lt;th&gt;n = 8&lt;/th&gt;
&lt;th&gt;n = 64&lt;/th&gt;
&lt;th&gt;n → ∞&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;0,50&lt;/td&gt;
&lt;td&gt;1,33&lt;/td&gt;
&lt;td&gt;1,78&lt;/td&gt;
&lt;td&gt;1,97&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,90&lt;/td&gt;
&lt;td&gt;1,82&lt;/td&gt;
&lt;td&gt;4,71&lt;/td&gt;
&lt;td&gt;8,77&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,95&lt;/td&gt;
&lt;td&gt;1,90&lt;/td&gt;
&lt;td&gt;5,93&lt;/td&gt;
&lt;td&gt;15,42&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,99&lt;/td&gt;
&lt;td&gt;1,98&lt;/td&gt;
&lt;td&gt;7,48&lt;/td&gt;
&lt;td&gt;39,26&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Qué dice la ley en palabras sencillas?&lt;/h2&gt;
&lt;p&gt;Un trabajo no puede terminar más rápido que su parte secuencial, así que los workers adicionales solo acortan el resto. Cuando la parte paralela ya es pequeña frente a la secuencial, añadir workers apenas cambia el tiempo total.&lt;/p&gt;
&lt;p&gt;Toma un trabajo de 10 segundos en el que 1 segundo es secuencial (un bloqueo, una escritura única) y 9 segundos se reparten por igual, es decir, p = 0,9. Ocho workers lo terminan en 1 + 9/8 = 2,125 segundos (4,71 veces más rápido); sesenta y cuatro necesitan unos 1,14 segundos. Nada lo baja de 1 segundo, así que 10 es el techo.&lt;/p&gt;
&lt;h2&gt;¿De dónde viene la ley?&lt;/h2&gt;
&lt;p&gt;Gene Amdahl presentó el argumento en 1967, en la AFIPS Spring Joint Computer Conference, en un artículo que defendía el enfoque de un solo procesador.&lt;/p&gt;
&lt;p&gt;No hemos leído el texto completo de &lt;a href=&quot;https://doi.org/10.1145/1465482.1465560&quot;&gt;Validity of the single processor approach to achieving large scale computing capabilities&lt;/a&gt;. Mark Hill y Michael Marty lo resumen en &lt;a href=&quot;https://research.cs.wisc.edu/multifacet/amdahl/&quot;&gt;Amdahl&amp;#39;s Law in the Multicore Era&lt;/a&gt; (IEEE Computer, 2008): una fracción paralelizable sin límite y sin coste de planificación, el resto totalmente secuencial, y la aceleración descrita sin presentar ninguna ecuación («without presenting an equation»).&lt;/p&gt;
&lt;h2&gt;¿Qué significa para las pruebas de carga y de capacidad?&lt;/h2&gt;
&lt;p&gt;El rendimiento deja de crecer al ritmo de los servidores, hilos o pods en cuanto un componente compartido atiende una parte de cada petición de una en una. Una prueba de carga lo muestra como una curva de rendimiento que se aplana mientras sigues añadiendo capacidad.&lt;/p&gt;
&lt;p&gt;El artículo de Neil Gunther de 2008, citado más abajo, escribe la misma ley como N / (1 + σ(N − 1)), con σ como fracción secuencial, y mide la escalabilidad como el rendimiento con N dividido entre el rendimiento con 1. En un sistema web, la parte secuencial es todo aquello por lo que cada petición tiene que pasar por turno: un bloqueo o una fila que actualiza cada petición, una única base de datos primaria que recibe todas las escrituras, un único consumidor de cola o una API de terceros con límite de peticiones.&lt;/p&gt;
&lt;h2&gt;¿Cómo encuentras la parte secuencial en una prueba de carga?&lt;/h2&gt;
&lt;p&gt;Ejecuta la misma prueba en varios niveles de carga y observa qué recurso se satura mientras el rendimiento se aplana. El componente que está en su límite cuando la capacidad extra deja de compensar es la parte secuencial, o la cola que tiene delante.&lt;/p&gt;
&lt;p&gt;Señales típicas: el rendimiento se estanca aunque la capa de aplicación tiene CPU libre, las esperas crecen en un único punto compartido (bloqueos, conexiones a la base de datos, profundidad de la cola), y el tiempo de respuesta sube al mismo ritmo que los usuarios, que es la &lt;a href=&quot;https://loadtest.app/es/littles-law-load-testing/&quot;&gt;ley de Little&lt;/a&gt; ante un techo. Una ejecución con carga constante no puede mostrarlo, así que sube la carga por escalones. El ajuste &lt;a href=&quot;https://loadfocus.com/docs/es-es/guides/load-testing/what-is-ramp-up-steps-in-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=amdahls-law&quot;&gt;Ramp Up Steps&lt;/a&gt; de LoadFocus añade usuarios virtuales en lotes iguales. El &lt;a href=&quot;https://loadfocus.com/docs/es-es/guides/load-testing/reading-the-capacity-panel?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=amdahls-law&quot;&gt;panel de capacidad&lt;/a&gt; de LoadFocus agrupa una ejecución terminada por usuarios virtuales activos y, en los planes de pago, muestra el p95, las peticiones por segundo y la tasa de error de cada escalón en las ejecuciones con un solo generador de carga. Solo indica un nivel de capacidad si la ejecución pasó por al menos tres escalones y el más alto fue al menos el doble del más bajo. No ajusta ningún modelo de escalabilidad, así que el ajuste de más abajo te toca a ti.&lt;/p&gt;
&lt;h2&gt;¿Qué es la ley de Gustafson?&lt;/h2&gt;
&lt;p&gt;Es el contrapunto: si el problema crece con la máquina, la parte secuencial sigue siendo pequeña y la aceleración crece casi de forma lineal. Amdahl fija el trabajo; Gustafson fija el tiempo de ejecución.&lt;/p&gt;
&lt;p&gt;La nota de John Gustafson de 1988, &lt;a href=&quot;https://doi.org/10.1145/42411.42415&quot;&gt;Reevaluating Amdahl&amp;#39;s law&lt;/a&gt;, informó aceleraciones de 1016 a 1021 en un hipercubo de 1024 procesadores en Sandia, para aplicaciones con una parte secuencial del 0,4 al 0,8 %, y defendió que los usuarios agrandan el problema hasta llenar el tiempo del que disponen. Con s&amp;#39; como la parte secuencial medida en la ejecución paralela, la aceleración escalada, una fórmula que la nota atribuye a E. Barsis en Sandia, es N + (1 − N)s&amp;#39;.&lt;/p&gt;
&lt;p&gt;Con s&amp;#39; = 0,05 y 64 procesadores eso da 60,85, frente a 15,42 según Amdahl, porque los dos valores del 5 % se miden en máquinas distintas. En un sistema web, Gustafson encaja cuando cada servidor añadido trabaja con su propia parte de los datos; Amdahl encaja cuando cada usuario adicional sigue tocando la misma fila compartida.&lt;/p&gt;
&lt;h2&gt;¿Qué añade la Universal Scalability Law?&lt;/h2&gt;
&lt;p&gt;Un segundo término de coherencia, el coste de mantener coherentes los datos compartidos entre workers, que crece con el número de pares de workers. Con él, el rendimiento puede llegar a un máximo y luego caer a medida que añades capacidad.&lt;/p&gt;
&lt;p&gt;El artículo de Gunther &lt;a href=&quot;https://arxiv.org/abs/0808.1431&quot;&gt;A General Theory of Computational Scalability Based on Rational Functions&lt;/a&gt; (arXiv, 2008) formula la Universal Scalability Law (USL) así:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;C(N) = N / (1 + σ(N - 1) + κN(N - 1))
peak at N* = sqrt((1 - σ) / κ)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;σ es la contención (serialización o colas) y κ la coherencia (copias incoherentes de los datos); con κ = 0 queda la fórmula de Amdahl. Entre los ejemplos de Gunther para el peor caso está la actualización de registros de bases de datos, y llama «retrograde», es decir, decreciente, al rendimiento más allá de N*. Con los valores de ejemplo σ = 0,05 y κ = 0,001, el máximo está cerca de 31 workers: el rendimiento relativo es 9,03 con 32 y 7,82 con 64, donde el término σ por sí solo predice 15,42.&lt;/p&gt;
&lt;h2&gt;¿Cómo ajustas la USL a una serie de pruebas de carga?&lt;/h2&gt;
&lt;p&gt;Mide el rendimiento en varios niveles de concurrencia, divide cada valor entre el rendimiento con un usuario y ajusta σ y κ por mínimos cuadrados.&lt;/p&gt;
&lt;p&gt;Reordenada, la fórmula queda N / C − 1 = σ(N − 1) + κN(N − 1), que es lineal en σ y κ. Los valores de abajo se generaron a partir de σ = 0,05 y κ = 0,001; pon en x tus propias peticiones por segundo de cada escalón:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import numpy as np

n = np.array([1, 2, 4, 8, 16, 32])          # virtual users
x = np.array([50, 95, 172, 284, 402, 452])  # req/s per level
c = x / x[0]                                # relative capacity
A = np.column_stack([n - 1, n * (n - 1)])
(s, k), *_ = np.linalg.lstsq(A, n / c - 1, rcond=None)
print(f&amp;quot;sigma={s:.3f} kappa={k:.4f}&amp;quot;)
print(f&amp;quot;peak near {np.sqrt((1 - s) / k):.0f} users&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El script imprime &lt;code&gt;sigma=0.050&lt;/code&gt;, &lt;code&gt;kappa=0.0010&lt;/code&gt; y un máximo cerca de 31 usuarios. Cambia solo la concurrencia entre escalones e incluye un escalón con un usuario, porque cada punto se divide entre él.&lt;/p&gt;
&lt;h2&gt;¿Dónde dejan de ser útiles estos modelos?&lt;/h2&gt;
&lt;p&gt;Resumen una curva de rendimiento en una o dos constantes, así que no pueden señalar el bloqueo culpable ni seguir a un sistema que cambia bajo carga. Úsalos para leer una curva medida y prolongarla un poco: un ajuste con escalones muy por debajo del codo dice poco del máximo.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Parámetros constantes. Una caché que se calienta, un autoscaler o un pool que llega a su límite cambian σ y κ en mitad de la prueba.&lt;/li&gt;
&lt;li&gt;Solo rendimiento. El p95 y el p99 pueden degradarse antes: revisa también la &lt;a href=&quot;https://loadtest.app/es/tail-latency/&quot;&gt;latencia de cola&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;El generador de carga. Si se satura primero, la curva plana es suya.&lt;/li&gt;
&lt;li&gt;Pruebas cerradas. Un número fijo de usuarios virtuales mide un &lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;sistema cerrado&lt;/a&gt;; los usuarios reales llegan a su propio ritmo.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Puedes explicar la ley de Amdahl de forma sencilla?&lt;/strong&gt;
Un trabajo nunca es más rápido que la parte que no se puede repartir. Si una décima parte del trabajo tiene que ejecutarse en serie, ningún número de workers adicionales lo hace más de diez veces más rápido, porque esa décima parte sigue tardando lo mismo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué es la ley de Gustafson?&lt;/strong&gt;
La ley de Gustafson dice que, cuando el problema crece con el número de procesadores, la aceleración crece casi de forma lineal, como N + (1 − N)s&amp;#39;, donde s&amp;#39; es la parte secuencial de la ejecución paralela. John Gustafson la publicó en 1988 (atribuyendo la fórmula a su colega de Sandia E. Barsis) como contrapunto a la suposición de Amdahl de un problema de tamaño fijo.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/littles-law-load-testing/&quot;&gt;Ley de Little en pruebas de carga: dimensionar y comprobar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/throughput-vs-latency/&quot;&gt;Rendimiento vs latencia: cómo se relacionan bajo carga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;Modelo de carga abierto vs cerrado: cuál usar y cuándo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/tail-latency/&quot;&gt;Latencia de cola: qué es y cómo medirla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/queueing-theory/&quot;&gt;Teoría de colas: qué es y por qué se dispara la latencia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Teoría de colas: qué es y por qué se dispara la latencia</title><link>https://loadtest.app/es/queueing-theory/</link><guid isPermaLink="true">https://loadtest.app/es/queueing-theory/</guid><description>Teoría de colas explicada: llegadas, servidores, notación de Kendall, por qué la latencia se dispara cerca del 100 % de uso y qué implica en tus pruebas.</description><pubDate>Sun, 01 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, un servicio de pruebas de carga mencionado en este artículo.&lt;/p&gt;&lt;p&gt;La teoría de colas (en inglés queueing theory) es la matemática de las esperas: a partir del ritmo al que llega el trabajo, de lo que tarda cada tarea y del número de servidores, predice cuánto esperan las tareas y cuánto crece la cola. Para el software, su resultado más útil es que el tiempo de respuesta crece despacio con carga moderada y luego de golpe cuando un servidor se acerca al 100 % de ocupación. En el modelo más sencillo, un servidor ocupado el 90 % del tiempo responde de media diez veces más lento que uno libre.&lt;/p&gt;
&lt;p&gt;Las cifras de abajo son aritmética a partir de fórmulas estándar, comprobadas con un script, sin ninguna prueba detrás. Las fuentes se comprobaron el 1 de noviembre de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Utilización ρ&lt;/th&gt;
&lt;th&gt;Tiempo en el sistema W ÷ tiempo de servicio S&lt;/th&gt;
&lt;th&gt;Si S = 20 ms&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;0,5&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;40 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,7&lt;/td&gt;
&lt;td&gt;3,3&lt;/td&gt;
&lt;td&gt;67 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,8&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;100 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,9&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;200 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,95&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;400 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0,99&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;2.000 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Son medias para la cola M/M/1: un servidor, llegadas de Poisson y tiempos de servicio exponenciales.&lt;/p&gt;
&lt;h2&gt;¿Qué es la teoría de colas?&lt;/h2&gt;
&lt;p&gt;Es la rama de la probabilidad que modela trabajo que llega, espera y se atiende. Una cola se describe por sus llegadas, sus tiempos de servicio, su número de servidores y su disciplina de cola, es decir, el orden en que se atienden las tareas en espera.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://web.mit.edu/urban_or_book/www/book/chapter4/4.2.html&quot;&gt;Urban Operations Research&lt;/a&gt;, de Larson y Odoni, un texto abierto del MIT, cita las ventanillas de banco, las cajas de supermercado y los peajes como casos clásicos. Un servidor web encaja en el mismo esquema: llegan peticiones, los hilos o núcleos las atienden y el resto espera en una cola.&lt;/p&gt;
&lt;h2&gt;¿De dónde viene la teoría de colas?&lt;/h2&gt;
&lt;p&gt;De la central telefónica, donde A. K. Erlang obtuvo los primeros resultados para la Compañía Telefónica de Copenhague.&lt;/p&gt;
&lt;p&gt;Según su &lt;a href=&quot;https://mathshistory.st-andrews.ac.uk/Biographies/Erlang/&quot;&gt;biografía en MacTutor&lt;/a&gt;, el artículo de Erlang de 1909 mostró que las llamadas hechas al azar siguen la distribución de Poisson, y su fórmula de 1917 para las pérdidas y el tiempo de espera pronto la usaron compañías telefónicas de muchos países. El artículo de David Kendall de 1953, &lt;a href=&quot;https://doi.org/10.1214/aoms/1177728975&quot;&gt;Stochastic Processes Occurring in the Theory of Queues and their Analysis by the Method of the Imbedded Markov Chain&lt;/a&gt;, introdujo la notación que aún se usa, como recoge el &lt;a href=&quot;https://arxiv.org/abs/0810.1091&quot;&gt;relato de su obra&lt;/a&gt; de Geoffrey Grimmett. La &lt;a href=&quot;https://doi.org/10.1287/opre.9.3.383&quot;&gt;demostración de L = λW&lt;/a&gt; de Little y los resultados de Kingman sobre tráfico intenso llegaron en 1961.&lt;/p&gt;
&lt;h2&gt;¿Qué significa la notación de Kendall, como M/M/1?&lt;/h2&gt;
&lt;p&gt;Nombra una cola en tres partes, A/S/c: la distribución de los intervalos entre llegadas, la de los tiempos de servicio y el número de servidores. M/M/1 significa llegadas aleatorias, tiempos de servicio exponenciales y un servidor.&lt;/p&gt;
&lt;p&gt;M viene de memoryless, sin memoria (llegadas de Poisson o tiempos exponenciales), D de determinista y G de general, es decir, cualquier distribución: M/D/1 es un servidor con tiempo de servicio constante.&lt;/p&gt;
&lt;h2&gt;¿Cómo crece el tiempo de respuesta con la utilización?&lt;/h2&gt;
&lt;p&gt;En una cola M/M/1, el tiempo medio en el sistema es W = 1/(μ − λ), que equivale a S/(1 − ρ). Cuando la utilización ρ se acerca a 1, W crece sin límite.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;lambda = arrival rate        mu = service rate (1 / S)
rho    = lambda / mu         (utilization, must stay below 1)
W      = 1 / (mu - lambda)   = S / (1 - rho)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Larson y Odoni lo deducen para una &lt;a href=&quot;https://web.mit.edu/urban_or_book/www/book/chapter4/4.6.1.html&quot;&gt;centralita con una sola operadora&lt;/a&gt; y muestran que con ρ ≥ 1 no hay estado estacionario: la cola no deja de crecer. La misma fuente muestra que el tiempo en el sistema sigue una distribución exponencial, así que cada percentil crece por el mismo factor 1/(1 − ρ), y el p95 ronda el triple de la media: 600 ms en la fila 0,9 de arriba.&lt;/p&gt;
&lt;h2&gt;¿Por qué la latencia hace un codo antes de que la CPU llegue al 100 %?&lt;/h2&gt;
&lt;p&gt;Porque una petición espera cada vez que encuentra el servidor ocupado, y eso ocurre más a menudo a medida que sube la utilización. Con los supuestos de M/M/1, el tiempo de respuesta ya se ha duplicado al 50 % de utilización.&lt;/p&gt;
&lt;p&gt;El recurso que se satura también puede ser un pool de conexiones, un bloqueo de la base de datos o un bucle de eventos de un solo hilo, y el más cargado marca la curva. Ese codo temprano explica por qué la utilización objetivo queda muy por debajo del 100 %. Calcula hacia atrás desde tu presupuesto de latencia: con S = 20 ms y una media objetivo de 100 ms, la tabla permite alrededor del 80 %, y un objetivo de 60 ms alrededor del 67 %, antes de que los picos se lleven su parte.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://loadfocus.com/docs/es-es/guides/load-testing/reading-the-capacity-panel?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=queueing-theory&quot;&gt;panel de capacidad&lt;/a&gt; de LoadFocus agrupa una prueba terminada por el número de usuarios virtuales activos e indica el último nivel que aguantó antes de que la tasa de errores superara el 1 % o el p95 pasara del doble del mejor nivel, siempre que ningún nivel superior se recuperara. Necesita una prueba con un solo generador de carga que suba por al menos tres escalones de carga, con el más alto al menos al doble del más bajo. Según la cuenta de arriba, si el nivel más ligero dejó el cuello de botella casi inactivo, la duplicación salta justo por encima del 50 % de utilización; si ya lo cargaba hasta ρ0, salta más tarde, por encima de (1 + ρ0)/2 con M/M/1.&lt;/p&gt;
&lt;h2&gt;¿Por qué la variabilidad importa tanto como la utilización?&lt;/h2&gt;
&lt;p&gt;Las colas nacen del azar: llegadas en ráfagas y tareas lentas de vez en cuando. Con tráfico intenso, el tiempo de espera crece con la variabilidad de ambas, multiplicada por un término ρ/(1 − ρ).&lt;/p&gt;
&lt;p&gt;El artículo de Kingman de 1961, &lt;a href=&quot;https://doi.org/10.1017/S0305004100036094&quot;&gt;The single server queue in heavy traffic&lt;/a&gt;, muestra que cuando la intensidad de tráfico de un servidor único se acerca a 1, la cola es larga y el tiempo de espera es aproximadamente exponencial. Apuntes de curso de la &lt;a href=&quot;https://www.win.tue.nl/~iadan/2V050/h10.pdf&quot;&gt;TU Eindhoven&lt;/a&gt; y del &lt;a href=&quot;https://serveng.technion.ac.il/files/Lectures/Lecture_GGQ&apos;s_FULL_Marked.pdf&quot;&gt;Technion&lt;/a&gt; dan una aproximación para su media (el Technion la llama aproximación de Allen-Cunneen; también se conoce ampliamente como fórmula de Kingman):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Wq ≈ rho / (1 - rho) × (ca² + cs²) / 2 × S
ca, cs = coefficient of variation (std dev / mean)
         of arrival gaps and of service times
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Wq es la espera antes de que empiece el servicio, y ca, cs son los coeficientes de variación. Los tiempos exponenciales tienen c² = 1, lo que da la espera de M/M/1 de 9S al 90 % de utilización. Un tiempo de servicio constante la reduce a la mitad, 4,5S; con cs² = 4, lo que puede producir una mezcla de aciertos de caché y llamadas lentas a la base de datos, sube a 22,5S. El tráfico sintético regular varía menos que el de producción, así que una prueba suele mostrar menos cola que los picos reales.&lt;/p&gt;
&lt;h2&gt;¿Cómo ayudan más servidores (M/M/c)?&lt;/h2&gt;
&lt;p&gt;Varios servidores que comparten una cola absorben las ráfagas aleatorias mucho mejor que los mismos servidores con una cola cada uno, así que cada servidor puede trabajar con más carga para la misma espera.&lt;/p&gt;
&lt;p&gt;Según las &lt;a href=&quot;https://web.mit.edu/urban_or_book/www/book/chapter4/4.6.2.html&quot;&gt;fórmulas M/M/m&lt;/a&gt; de Larson y Odoni, con cada servidor ocupado al 90 %, W es 10S con un servidor, 5,3S con dos que comparten cola y 3,0S con cuatro. Cuatro instancias detrás de un balanceador que elige una libre se comportan como el último caso; cuatro que reciben cada una un cuarto aleatorio del tráfico, como colas M/M/1 separadas a 10S.&lt;/p&gt;
&lt;h2&gt;¿Qué tiene que ver la ley de Little?&lt;/h2&gt;
&lt;p&gt;La ley de Little, L = λW, relaciona el número medio de peticiones en un sistema con su tasa de llegada y su tiempo dentro, sean cuales sean las distribuciones. La teoría de colas te da W, y la ley de Little lo convierte en L.&lt;/p&gt;
&lt;p&gt;En la fila 0,9, 45 peticiones por segundo con W = 200 ms suponen de media 9 peticiones dentro. Nuestro &lt;a href=&quot;https://loadtest.app/es/littles-law-load-testing/&quot;&gt;artículo sobre la ley de Little&lt;/a&gt; usa la misma ley para dimensionar y comprobar pruebas de carga.&lt;/p&gt;
&lt;h2&gt;¿Dónde dejan de valer estos modelos en las pruebas de carga?&lt;/h2&gt;
&lt;p&gt;Suponen un flujo abierto de llegadas independientes y un estado estacionario. Una prueba con un número fijo de usuarios virtuales es un sistema cerrado, donde las llegadas se frenan cuando se frenan las respuestas.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pruebas cerradas. Con N usuarios virtuales hay como mucho N peticiones en el sistema, así que el ritmo de peticiones cae donde una cola abierta crecería, y el &lt;a href=&quot;https://loadtest.app/es/think-time-in-load-testing/&quot;&gt;tiempo de reflexión&lt;/a&gt; lo baja aún más. Nuestro artículo sobre el &lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;modelo de carga abierto vs cerrado&lt;/a&gt; explica por qué eso oculta la saturación.&lt;/li&gt;
&lt;li&gt;LoadFocus ejecuta &lt;a href=&quot;https://loadfocus.com/es-es/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=queueing-theory&quot;&gt;scripts de k6&lt;/a&gt;, pero los escenarios arrival-rate se ejecutan allí con un número fijo de usuarios, como avisa su validador de scripts. Lee esas pruebas como cerradas: pasado el codo, espera un ritmo de peticiones plano y tiempos de respuesta en aumento.&lt;/li&gt;
&lt;li&gt;Estado estacionario. El calentamiento, las cachés y el autoescalado cambian la tasa de servicio durante la prueba, así que compara niveles mantenidos el tiempo suficiente para estabilizarse.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Se escribe queueing theory o queuing theory?&lt;/strong&gt;
Las dos grafías inglesas son correctas y nombran el mismo campo. El artículo de Kingman de 1961 escribe «queueing time», mientras que la demostración de Little del mismo año lleva «Queuing Formula» en el título.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿La teoría de colas necesita llegadas de Poisson?&lt;/strong&gt;
Solo para los resultados exactos de M/M/1. Las aproximaciones G/G/1 como la fórmula de Kingman usan la media y la variabilidad de los intervalos entre llegadas y de los tiempos de servicio, y la ley de Little no supone nada sobre las distribuciones.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/littles-law-load-testing/&quot;&gt;Ley de Little en pruebas de carga: dimensionar y comprobar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;Modelo de carga abierto vs cerrado: cuál usar y cuándo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/throughput-vs-latency/&quot;&gt;Rendimiento vs latencia: cómo se relacionan bajo carga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/tail-latency/&quot;&gt;Latencia de cola: qué es y cómo medirla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/think-time-in-load-testing/&quot;&gt;Tiempo de reflexión en pruebas de carga: cómo fijarlo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>SLO vs SLA: diferencia, SLI y presupuesto de error</title><link>https://loadtest.app/es/slo-vs-sla/</link><guid isPermaLink="true">https://loadtest.app/es/slo-vs-sla/</guid><description>SLO vs SLA explicado: quién fija qué, qué es un SLI, el presupuesto de error, cuánta inactividad permite el 99,9 % y cómo probar un SLO con carga.</description><pubDate>Sun, 01 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, un servicio de pruebas de carga mencionado en este artículo.&lt;/p&gt;&lt;p&gt;Un SLA (acuerdo de nivel de servicio) es un contrato con un cliente que dice qué pasa cuando un servicio no alcanza un nivel prometido, normalmente un crédito de servicio. Un SLO (objetivo de nivel de servicio) es la meta interna con la que un equipo gestiona el servicio; el libro de SRE aconseja fijarla más estricta que el SLA para que los problemas se resuelvan antes de incumplir el contrato. Un SLI (indicador de nivel de servicio) es la medida en la que se expresan ambos, por ejemplo la proporción de peticiones que tienen éxito.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;SLI&lt;/th&gt;
&lt;th&gt;SLO&lt;/th&gt;
&lt;th&gt;SLA&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Qué es&lt;/td&gt;
&lt;td&gt;Una medida&lt;/td&gt;
&lt;td&gt;Una meta para un SLI&lt;/td&gt;
&lt;td&gt;Un contrato basado en SLO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lo fija&lt;/td&gt;
&lt;td&gt;Ingeniería&lt;/td&gt;
&lt;td&gt;El product owner e ingeniería&lt;/td&gt;
&lt;td&gt;Los equipos de negocio y legal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Si se incumple&lt;/td&gt;
&lt;td&gt;Nada por sí solo&lt;/td&gt;
&lt;td&gt;Se gasta presupuesto de error&lt;/td&gt;
&lt;td&gt;Créditos de servicio o penalizaciones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ejemplo&lt;/td&gt;
&lt;td&gt;Llamadas de pago con éxito&lt;/td&gt;
&lt;td&gt;99,95 % en cuatro semanas&lt;/td&gt;
&lt;td&gt;99,9 % al mes, o un crédito&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Los ejemplos son ilustrativos; las fuentes son el libro y el workbook de SRE de Google y el SLA de cómputo de AWS, comprobados el 1 de noviembre de 2026.&lt;/p&gt;
&lt;h2&gt;¿Qué significan SLI, SLO y SLA?&lt;/h2&gt;
&lt;p&gt;Service level indicator, service level objective y service level agreement: indicador, objetivo y acuerdo de nivel de servicio. El indicador es lo que mides, el objetivo es el valor al que apuntas y el acuerdo es lo que prometes a otra persona, con consecuencias.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://sre.google/sre-book/service-level-objectives/&quot;&gt;capítulo «Service Level Objectives» del libro de SRE&lt;/a&gt; define un SLA como «un contrato explícito o implícito con tus usuarios que incluye consecuencias por cumplir (o incumplir) los SLO que contiene». La prueba del capítulo es una sola pregunta: ¿qué pasa si no se cumplen los SLO? Si no hay una consecuencia explícita, casi seguro que estás ante un SLO.&lt;/p&gt;
&lt;p&gt;El capítulo añade que la mayoría de la gente quiere decir SLO cuando dice SLA, y que una violación real de un SLA puede acabar en un pleito por incumplimiento de contrato. Así que, cuando una reunión se convierte en una discusión de SLA vs SLO, pregunta primero si hay una consecuencia, normalmente dinero, escrita en un contrato.&lt;/p&gt;
&lt;p&gt;El libro de SRE aconseja mantener un margen de seguridad: «un SLO interno más estricto que el SLO anunciado a los usuarios te da espacio para responder a problemas crónicos antes de que se vean desde fuera». Su capítulo «Embracing Risk» aplica la misma idea a un contrato: un objetivo externo del 99,9 % respaldado por uno interno más exigente.&lt;/p&gt;
&lt;h2&gt;¿Qué es un presupuesto de error?&lt;/h2&gt;
&lt;p&gt;Es el 100 % menos el SLO: la parte de las peticiones o del tiempo que puede fallar dentro de la ventana. Mientras quede presupuesto, el equipo sigue publicando cambios; cuando se agota, el trabajo de fiabilidad va primero.&lt;/p&gt;
&lt;p&gt;El capítulo &lt;a href=&quot;https://sre.google/workbook/implementing-slos/&quot;&gt;«Implementing SLOs» del workbook de SRE&lt;/a&gt; hace la cuenta: con un SLO del 99,9 %, un servicio que recibe 3 millones de peticiones en cuatro semanas puede fallar 3.000, así que una caída con 1.500 errores gasta la mitad del presupuesto. El capítulo &lt;a href=&quot;https://sre.google/sre-book/embracing-risk/&quot;&gt;«Embracing Risk»&lt;/a&gt; del libro explica para qué sirve: la gestión de producto fija el SLO, la monitorización mide la disponibilidad real y la diferencia es el margen de falta de fiabilidad que queda para el trimestre. Cuando ese presupuesto se agota, los despliegues se detienen o se ralentizan.&lt;/p&gt;
&lt;h2&gt;¿Cuánto tiempo de inactividad permite el 99,9 %?&lt;/h2&gt;
&lt;p&gt;Unos 43 minutos en una ventana de 30 días. Cada nueve adicional divide el margen entre diez, así que el 99,99 % deja poco más de 4 minutos.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SLO&lt;/th&gt;
&lt;th&gt;Presupuesto de error&lt;/th&gt;
&lt;th&gt;Inactividad en 30 días&lt;/th&gt;
&lt;th&gt;Fallos por millón&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;99 %&lt;/td&gt;
&lt;td&gt;1 %&lt;/td&gt;
&lt;td&gt;7 h 12 min&lt;/td&gt;
&lt;td&gt;10.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99,5 %&lt;/td&gt;
&lt;td&gt;0,5 %&lt;/td&gt;
&lt;td&gt;3 h 36 min&lt;/td&gt;
&lt;td&gt;5.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99,9 %&lt;/td&gt;
&lt;td&gt;0,1 %&lt;/td&gt;
&lt;td&gt;43 min 12 s&lt;/td&gt;
&lt;td&gt;1.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99,95 %&lt;/td&gt;
&lt;td&gt;0,05 %&lt;/td&gt;
&lt;td&gt;21 min 36 s&lt;/td&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99,99 %&lt;/td&gt;
&lt;td&gt;0,01 %&lt;/td&gt;
&lt;td&gt;4 min 19 s&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Multiplica los 43.200 minutos de una ventana de 30 días por el presupuesto de error. Ten en cuenta la advertencia del workbook: cada nueve adicional cuesta más mientras su valor para los usuarios tiende a cero.&lt;/p&gt;
&lt;h2&gt;¿Cómo es un SLA real?&lt;/h2&gt;
&lt;p&gt;Indica un porcentaje medido, un periodo de facturación, una escala de créditos y lo que no cuenta. El SLA de cómputo de AWS es un ejemplo público y breve.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://aws.amazon.com/compute/sla/&quot;&gt;Amazon Compute Service Level Agreement&lt;/a&gt; (actualizado el 25 de mayo de 2022; comprobado el 1 de noviembre de 2026) se compromete a un Monthly Uptime Percentage de al menos el 99,99 % por región para instancias EC2 repartidas en dos o más Availability Zones, y del 99,5 % para una sola instancia. La disponibilidad es el 100 % menos la parte de los minutos en que EC2 no estuvo disponible. Según el Region-Level SLA, por debajo del 99,99 % el crédito es el 10 % de la factura mensual de EC2 en la región, por debajo del 99,0 % es el 30 % y por debajo del 95,0 % es el 100 %; para una sola instancia, el tramo del 10 % empieza por debajo del 99,5 %. Los créditos se aplican a pagos futuros, hay que reclamarlos a través del soporte de AWS y son el recurso «único y exclusivo», salvo que el acuerdo con el cliente diga otra cosa.&lt;/p&gt;
&lt;p&gt;Comparado con la tabla de inactividad, el tramo del 10 % del Region-Level SLA abarca de unos 4 minutos a unas 7 horas de indisponibilidad en un mes de 30 días. Un SLA limita lo que debe el proveedor; evitar que las caídas perjudiquen a tus usuarios es tarea de tus propios objetivos.&lt;/p&gt;
&lt;h2&gt;¿Cómo eliges SLI de latencia y de disponibilidad?&lt;/h2&gt;
&lt;p&gt;Mide la latencia como percentil y la disponibilidad como eventos buenos divididos entre todos los eventos, lo más cerca posible del usuario. Las medias y las cifras tomadas solo en el servidor esconden las peticiones de las que se queja la gente.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Latencia.&lt;/strong&gt; El libro de SRE prefiere los percentiles a la media, porque una media puede quedarse plana mientras las peticiones más lentas se vuelven mucho más lentas. El workbook escribe los SLI de latencia como un cociente, por ejemplo las llamadas que terminan en menos de 100 ms divididas entre todas las llamadas. Así que «el 99 % de las llamadas de pago en menos de 400 ms» equivale a «p99 del pago por debajo de 400 ms» en la ventana, y pasa tal cual a una prueba. Nuestro artículo sobre la &lt;a href=&quot;https://loadtest.app/es/tail-latency/&quot;&gt;latencia de cola&lt;/a&gt; explica por qué el p99 importa en cuanto una página llama a varios servicios.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Disponibilidad.&lt;/strong&gt; La disponibilidad por tiempo cuenta los minutos en funcionamiento, como hace el SLA de AWS. La disponibilidad por peticiones cuenta las peticiones con éxito: «Embracing Risk» describe un servicio con 2,5 millones de peticiones al día y un objetivo diario del 99,99 %, que puede devolver 250 errores y aun así cumplirlo.&lt;/p&gt;
&lt;h2&gt;¿Dónde fallan los SLO?&lt;/h2&gt;
&lt;p&gt;Casi siempre por exceso de objetivos, por metas del 100 % y por indicadores medidos donde no están los usuarios. Cada uno deja una cifra sobre la que nadie actúa, o una que parece buena mientras los usuarios lo pasan mal.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Demasiados SLO.&lt;/strong&gt; El libro de SRE aconseja tener los menos posibles: si citar un SLO nunca sirve para ganar una discusión sobre prioridades, probablemente no merece la pena.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Metas del 100 %.&lt;/strong&gt; El workbook dice que el 100 % es la meta equivocada: los componentes fallan, los cambios son la principal causa de caídas y un SLO del 100 % solo deja tiempo para reaccionar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Medir solo en el servidor.&lt;/strong&gt; Las métricas del servidor no ven problemas que sí notan los usuarios, como un script lento en la página. El workbook propone medir en el balanceador de carga o en el cliente.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;¿Qué tienen que ver las pruebas de carga con los SLO?&lt;/h2&gt;
&lt;p&gt;Un SLO le da a una prueba de carga sus criterios de aprobación, y una prueba en el pico esperado muestra si el SLO de latencia aguanta antes de que llegue ese tráfico. La monitorización en producción solo te lo dice después.&lt;/p&gt;
&lt;p&gt;El libro de SRE señala que más peticiones por segundo (QPS) suelen traer latencias mayores y que es habitual que los servicios tengan un precipicio de rendimiento a partir de cierto umbral de carga. Una prueba de carga puede encontrar ese precipicio si se ejecuta en el pico esperado, con una mezcla realista de peticiones, y mide el mismo SLI que usa el SLO. Fija cada umbral de la prueba un poco más estricto que el SLO, como explica nuestra guía de &lt;a href=&quot;https://loadtest.app/es/load-test-pass-fail-criteria/&quot;&gt;criterios de aprobación en pruebas de carga&lt;/a&gt;. Una ejecución dura minutos, así que no puede medir la disponibilidad mensual.&lt;/p&gt;
&lt;p&gt;LoadFocus, que publica este sitio, evalúa las pruebas de carga con &lt;a href=&quot;https://loadfocus.com/docs/es-es/guides/load-testing/pass-fail-thresholds?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=slo-vs-sla&quot;&gt;umbrales de aprobación&lt;/a&gt; guardados en la prueba: Max P95 y Max P99 del tiempo de respuesta, una tasa de errores máxima y un rendimiento mínimo, para pruebas cloud, JMeter y k6. Su monitorización de API ofrece &lt;a href=&quot;https://loadfocus.com/docs/es-es/guides/api-monitoring/sla-slo-reports?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=slo-vs-sla&quot;&gt;informes de SLA y SLO&lt;/a&gt; que fijan un objetivo SLO por monitor y muestran la disponibilidad, el presupuesto de error consumido y un estado OK o Incumplido.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Qué significa SLO?&lt;/strong&gt;
Service level objective, u objetivo de nivel de servicio: un valor meta para un nivel de servicio medido, por ejemplo el 99,9 % de peticiones con éxito en cuatro semanas. Se fija internamente, entre producto e ingeniería, y por sí solo no conlleva ninguna penalización contractual.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Se puede tener un SLO sin un SLA?&lt;/strong&gt;
Sí. El libro de SRE pone como ejemplo la búsqueda de Google, un servicio importante sin SLA público que aun así se gestiona con SLI y SLO.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Debería un SLO ser alguna vez del 100 %?&lt;/strong&gt;
No. Un objetivo del 100 % no deja presupuesto de error, así que cualquier fallo lo incumple y ningún cambio es nunca seguro de publicar.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/load-test-pass-fail-criteria/&quot;&gt;Criterios de aprobación en pruebas de carga: cómo fijarlos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/tail-latency/&quot;&gt;Latencia de cola: qué es y cómo medirla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/apdex-score/&quot;&gt;Puntuación Apdex: qué es y cómo se calcula&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/throughput-vs-latency/&quot;&gt;Rendimiento vs latencia: cómo se relacionan bajo carga&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>TPC-H: qué mide el benchmark y cómo ejecutarlo</title><link>https://loadtest.app/es/tpc-h/</link><guid isPermaLink="true">https://loadtest.app/es/tpc-h/</guid><description>TPC-H explicado: 8 tablas, 22 consultas, factor de escala, QphH, pruebas de potencia y throughput, resultados auditados o informales y cuándo usar TPC-DS.</description><pubDate>Sun, 01 Nov 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, un servicio de pruebas de carga mencionado en este artículo.&lt;/p&gt;&lt;p&gt;TPC-H es el benchmark de soporte a la decisión del Transaction Processing Performance Council (TPC): 22 consultas de negocio y dos funciones de actualización se ejecutan sobre ocho tablas que el programa dbgen del TPC llena con un factor de escala elegido, donde el factor 1 equivale a aproximadamente 1 GB. Su métrica, QphH@Size, combina una prueba de potencia con un solo flujo y una prueba de throughput con varios flujos, y los resultados oficiales añaden un precio por kQphH@Size. Solo los resultados auditados publicados en tpc.org son oficiales; cualquier cifra tipo TPC-H publicada fuera de tpc.org cuenta como una carga derivada según las reglas de uso justo del TPC y no está permitido compararla con los resultados oficiales.&lt;/p&gt;
&lt;p&gt;No hemos ejecutado el benchmark para esta guía. Los datos proceden de tpc.org, de la especificación en su revisión 3.0.1, que tpc.org marca como actual, y de la documentación de cada herramienta, todo comprobado el 1 de noviembre de 2026. Las valoraciones son nuestras.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;TPC-H&lt;/th&gt;
&lt;th&gt;TPC-C&lt;/th&gt;
&lt;th&gt;TPC-DS&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Carga&lt;/td&gt;
&lt;td&gt;Soporte a la decisión: consultas ad hoc más actualizaciones de datos&lt;/td&gt;
&lt;td&gt;OLTP: los pedidos de un mayorista&lt;/td&gt;
&lt;td&gt;Soporte a la decisión: consultas más mantenimiento de datos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alcance&lt;/td&gt;
&lt;td&gt;8 tablas, 22 consultas, 2 funciones de actualización&lt;/td&gt;
&lt;td&gt;9 tipos de tablas, 5 tipos de transacciones&lt;/td&gt;
&lt;td&gt;Esquema en copo de nieve, 7 tablas de hechos, 99 consultas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Métrica principal&lt;/td&gt;
&lt;td&gt;QphH@Size y $/kQphH@Size&lt;/td&gt;
&lt;td&gt;tpmC&lt;/td&gt;
&lt;td&gt;QphDS@SF y $/kQphDS@SF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versión actual&lt;/td&gt;
&lt;td&gt;3.0.1&lt;/td&gt;
&lt;td&gt;5.11.0&lt;/td&gt;
&lt;td&gt;4.0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Qué mide TPC-H?&lt;/h2&gt;
&lt;p&gt;La rapidez con la que un sistema responde a consultas analíticas complejas sobre un gran volumen de datos mientras llegan ventas nuevas y se borran las antiguas. Una sola especificación define el esquema, las consultas, los datos y las reglas.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://www.tpc.org/tpch/&quot;&gt;página de TPC-H&lt;/a&gt; describe un conjunto de consultas ad hoc orientadas al negocio junto con modificaciones de datos simultáneas (comprobado el 1 de noviembre de 2026). La &lt;a href=&quot;https://www.tpc.org/TPC_Documents_Current_Versions/pdf/TPC-H_v3.0.1.pdf&quot;&gt;especificación&lt;/a&gt; define ocho tablas: PART, PARTSUPP, LINEITEM, ORDERS, CUSTOMER, SUPPLIER, NATION y REGION. Todas salvo las dos últimas crecen con el factor de escala; LINEITEM, la mayor, tiene unos 6.000.000 de filas por unidad. La función de actualización RF1 inserta filas nuevas en ORDERS y LINEITEM, y RF2 elimina ventas antiguas (comprobado el 1 de noviembre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo se calcula la puntuación de TPC-H?&lt;/h2&gt;
&lt;p&gt;Una ejecución es una prueba de potencia seguida de una prueba de throughput, y QphH@Size es la media geométrica de ambos resultados. La métrica de precio es el precio total del sistema dividido por QphH@Size, multiplicado por 1.000.&lt;/p&gt;
&lt;p&gt;En la prueba de potencia, un flujo de actualización ejecuta RF1, una única sesión de consultas ejecuta las 22 consultas una vez y luego el flujo de actualización ejecuta RF2. Power@Size es 3.600 por el factor de escala, dividido por la media geométrica de esos 24 tiempos. En la prueba de throughput, varios flujos de consultas corren junto a un flujo de actualización: al menos 2 con factor 1 y hasta 11 con factor 100.000. Throughput@Size son las consultas por hora de todos los flujos, multiplicadas por el factor de escala. Una prueba completa tiene dos ejecuciones, y el patrocinador informa de la que tiene el QphH más bajo (todo según la &lt;a href=&quot;https://www.tpc.org/TPC_Documents_Current_Versions/pdf/TPC-H_v3.0.1.pdf&quot;&gt;especificación&lt;/a&gt;, comprobado el 1 de noviembre de 2026).&lt;/p&gt;
&lt;p&gt;La media geométrica da a cada consulta el mismo peso, así que reducir a la mitad el tiempo de una sola consulta sube Power solo un 3 % aproximadamente. Un resultado oficial usa un factor de escala de una lista fija: 1, 10, 30, 100 y así hasta 100.000.&lt;/p&gt;
&lt;h2&gt;¿Quién publica resultados de TPC-H y cuáles cuentan?&lt;/h2&gt;
&lt;p&gt;Los fabricantes que patrocinan una prueba publican resultados auditados en tpc.org, y solo esos son oficiales. Cualquier otra ejecución es una carga derivada con sus propias reglas.&lt;/p&gt;
&lt;p&gt;La especificación exige una auditoría independiente a cargo de un auditor certificado por el TPC. La &lt;a href=&quot;https://www.tpc.org/TPC_Documents_Current_Versions/pdf/Fair_Use_Quick_Reference_v1.0.0.pdf&quot;&gt;referencia rápida de uso justo (fair use)&lt;/a&gt; del TPC solo permite el nombre del TPC junto a resultados oficiales publicados. Todo lo demás necesita el prefijo «Derived from», no puede usar la métrica del TPC, debe incluir un aviso de que no es comparable con los resultados publicados, debería describir su entorno y sus desviaciones y no puede compararse con resultados oficiales (comprobado el 1 de noviembre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo ejecutas TPC-H por tu cuenta?&lt;/h2&gt;
&lt;p&gt;Genera los datos y el texto de las consultas, carga las tablas y luego ejecuta la prueba de potencia seguida de la de throughput. Puedes usar las herramientas del TPC, un kit hecho para una base de datos concreta o un motor con generador integrado.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://www.tpc.org/tpc_documents_current_versions/current_specifications5.asp&quot;&gt;página de especificaciones actuales&lt;/a&gt; del TPC ofrece un paquete de herramientas gratuito: te registras, aceptas una licencia y recibes el enlace por correo. Según la especificación, DBGen debe producir los datos y QGen el texto de las consultas (comprobado el 1 de noviembre de 2026).&lt;/p&gt;
&lt;p&gt;Para PostgreSQL, la &lt;a href=&quot;https://wiki.postgresql.org/wiki/TPC-H&quot;&gt;página TPC-H de la wiki&lt;/a&gt; no da un procedimiento paso a paso y remite a &lt;a href=&quot;https://wiki.postgresql.org/wiki/DBT-3&quot;&gt;DBT-3&lt;/a&gt;, un kit completo que la página DBT-3 de la wiki describe como una implementación de la especificación conforme al uso justo. &lt;strong&gt;HammerDB&lt;/strong&gt; incluye TPROC-H, que su &lt;a href=&quot;https://www.hammerdb.com/docs/ch11s01.html&quot;&gt;documentación&lt;/a&gt; describe como una carga de código abierto derivada de TPC-H y no comparable con los resultados publicados. Funciona sobre PostgreSQL, MySQL, Oracle y otros motores, y la documentación recomienda comparar la &lt;a href=&quot;https://www.hammerdb.com/docs/ch11s02.html&quot;&gt;media geométrica de los tiempos de consulta&lt;/a&gt; en lugar de calcular un QphH (todo comprobado el 1 de noviembre de 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DuckDB&lt;/strong&gt; tiene una extensión &lt;code&gt;tpch&lt;/code&gt; que, según su &lt;a href=&quot;https://duckdb.org/docs/stable/core_extensions/tpch&quot;&gt;documentación&lt;/a&gt;, implementa el generador de datos y las consultas. Estas líneas generan el factor 1, ejecutan la consulta 4 y listan las 22 consultas:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CALL dbgen(sf = 1);
PRAGMA tpch(4);
FROM tpch_queries();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La misma página advierte de que los datos difieren un poco de la especificación, de que cada consulta se ejecuta con parámetros fijos y de que &lt;code&gt;dbgen&lt;/code&gt; no borra las tablas existentes. Para datos totalmente conformes remite a &lt;code&gt;tpchgen-cli&lt;/code&gt; (comprobado el 1 de noviembre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo lees con honestidad los resultados de TPC-H?&lt;/h2&gt;
&lt;p&gt;Compara resultados solo con el mismo factor de escala y la misma versión del benchmark, y lee cada métrica con su sufijo de tamaño. Un gráfico de tiempos de consultas sueltas no muestra ni la prueba de potencia ni la de throughput.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://www.tpc.org/tpch/results/tpch_results5.asp&quot;&gt;página de resultados&lt;/a&gt; agrupa los resultados por tamaño de base de datos y lleva tres notas: los resultados de las versiones 2 y 3 no son comparables, la relación precio/rendimiento en monedas distintas no debe compararse y las comparaciones entre tamaños de base de datos son engañosas (comprobado el 1 de noviembre de 2026). La especificación añade que los resultados con distinto número de flujos son comparables con el mismo tamaño de base de datos.&lt;/p&gt;
&lt;p&gt;En una ejecución informal, busca lo que piden las reglas de uso justo: hardware y memoria, cambios en el esquema o en el texto de las consultas y si se ejecutaron las funciones de actualización. Un artículo que mide las 22 consultas una vez, con la caché caliente y sin flujo de actualización, solo se aproxima a la parte de consultas de una prueba de potencia, aunque una ejecución así sigue siendo útil para controlar tus propias regresiones. Sobre el ritmo de consultas frente al tiempo de respuesta, consulta &lt;a href=&quot;https://loadtest.app/es/throughput-vs-latency/&quot;&gt;rendimiento vs latencia&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;¿Cuándo conviene usar algo distinto de TPC-H?&lt;/h2&gt;
&lt;p&gt;Cuando la carga es transaccional, cuando quieres un benchmark analítico más reciente o cuando la pregunta es qué notan los usuarios. El benchmark modela una carga analítica, sin transacciones cortas ni capa de aplicación.&lt;/p&gt;
&lt;p&gt;Elige &lt;strong&gt;TPC-DS&lt;/strong&gt; para una prueba de soporte a la decisión más amplia: su &lt;a href=&quot;https://www.tpc.org/TPC_Documents_Current_Versions/pdf/TPC-DS_v4.0.0.pdf&quot;&gt;especificación en la versión 4.0.0&lt;/a&gt; usa un esquema en copo de nieve con siete tablas de hechos y 99 consultas, y su &lt;a href=&quot;https://www.tpc.org/tpcds/&quot;&gt;página de presentación&lt;/a&gt; indica que los resultados de la versión 4 no son comparables con versiones anteriores. Elige &lt;strong&gt;TPC-C&lt;/strong&gt;, o el TPROC-C de HammerDB, para OLTP de entrada de pedidos: la &lt;a href=&quot;https://www.tpc.org/tpcc/&quot;&gt;página de TPC-C&lt;/a&gt; describe cinco tipos de transacciones medidos en tpmC (todo comprobado el 1 de noviembre de 2026). Para una comprobación rápida de una sola base de datos, &lt;a href=&quot;https://loadtest.app/es/pgbench/&quot;&gt;pgbench&lt;/a&gt; cubre PostgreSQL y &lt;a href=&quot;https://loadtest.app/es/sysbench/&quot;&gt;sysbench&lt;/a&gt; cubre MySQL.&lt;/p&gt;
&lt;p&gt;LoadFocus, que publica este sitio, no ejecuta TPC-H; sus pruebas se dirigen a endpoints web y de API. LoadFocus &lt;a href=&quot;https://loadfocus.com/es-es/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tpc-h&quot;&gt;ejecuta planes de prueba JMeter y scripts de k6&lt;/a&gt; desde 25 regiones en la nube, sin driver JDBC ni módulo SQL, así que no puede conectarse a la base de datos. Para este trabajo, elige una herramienta de benchmark de bases de datos como la extensión de DuckDB, DBT-3 o HammerDB en lugar de LoadFocus, y usa LoadFocus para la capa web o API que va delante de la base de datos.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Qué diferencia hay entre TPC-H y TPC-DS?&lt;/strong&gt;
Los dos son benchmarks de soporte a la decisión del TPC. TPC-H usa 8 tablas y 22 consultas e informa de QphH@Size, mientras que TPC-DS usa un esquema en copo de nieve con siete tablas de hechos y 99 consultas e informa de QphDS@SF.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué significa QphH@Size en TPC-H?&lt;/strong&gt;
Es la métrica compuesta de consultas por hora: la media geométrica de los resultados de la prueba de potencia y de la prueba de throughput con un tamaño de base de datos. El sufijo indica ese tamaño, por ejemplo QphH@1000GB, y los resultados con tamaños distintos no deben compararse.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede LoadFocus ejecutar TPC-H?&lt;/strong&gt;
No. LoadFocus ejecuta planes de prueba JMeter y scripts de k6 dirigidos a endpoints web y de API y no tiene conexión SQL, así que usa una herramienta de benchmark de bases de datos para TPC-H y LoadFocus para la capa de aplicación que va delante de la base de datos.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/pgbench/&quot;&gt;pgbench: benchmark y pruebas de carga de PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/sysbench/&quot;&gt;Cómo usar sysbench: benchmarks de CPU, disco y MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/ycsb/&quot;&gt;YCSB: cargas de trabajo A-F, ejecución y límites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/redis-benchmark/&quot;&gt;redis-benchmark: cómo usarlo y leer sus resultados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/throughput-vs-latency/&quot;&gt;Rendimiento vs latencia: cómo se relacionan bajo carga&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>pgbench: benchmark y pruebas de carga de PostgreSQL</title><link>https://loadtest.app/es/pgbench/</link><guid isPermaLink="true">https://loadtest.app/es/pgbench/</guid><description>pgbench explicado: inicializa con -s, ejecuta con -c, -j y -T, escribe tus propios scripts, limita el ritmo con -R y lee tps, latencia y fallos.</description><pubDate>Sat, 31 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, un servicio de pruebas de carga mencionado en este artículo.&lt;/p&gt;&lt;p&gt;pgbench es el programa de benchmark que viene con PostgreSQL: ejecuta la misma transacción SQL una y otra vez en varias sesiones de base de datos simultáneas e informa de las transacciones por segundo y la latencia. Creas sus tablas de prueba con &lt;code&gt;pgbench -i -s 50 mydb&lt;/code&gt; y luego lanzas algo como &lt;code&gt;pgbench -c 10 -j 2 -T 300 mydb&lt;/code&gt; para diez clientes en dos hilos durante cinco minutos. Mide solo la base de datos, así que no dice nada de lo que notan los usuarios a través de la aplicación que va delante.&lt;/p&gt;
&lt;p&gt;No hemos ejecutado pgbench para esta guía. Los datos salen de la página de pgbench en la documentación de PostgreSQL 18, la versión que postgresql.org marca como actual, comprobados el 31 de octubre de 2026, y las valoraciones son nuestras.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Opción&lt;/th&gt;
&lt;th&gt;Qué hace&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-i&lt;/code&gt; / &lt;code&gt;-s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Crear las tablas de prueba / factor de escala (100.000 cuentas por unidad)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-c&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Clientes, es decir, sesiones de base de datos simultáneas (1 por defecto)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-j&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hilos de trabajo dentro de pgbench (1 por defecto)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-T&lt;/code&gt; / &lt;code&gt;-t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Duración en segundos, o transacciones por cliente (10 por defecto)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-b&lt;/code&gt; / &lt;code&gt;-f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Un script integrado o un archivo tuyo, con un &lt;code&gt;@peso&lt;/code&gt; opcional&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-P&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Informe de progreso cada N segundos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-R&lt;/code&gt; / &lt;code&gt;-L&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ritmo objetivo en tps / límite de latencia en ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-r&lt;/code&gt; / &lt;code&gt;-l&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Latencias por sentencia / una línea de registro por transacción&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Qué mide pgbench?&lt;/h2&gt;
&lt;p&gt;Ejecuta un script de transacción una y otra vez en un número fijo de sesiones de base de datos e informa de la tasa media de transacciones y de la latencia. El script por defecto se basa de forma libre en el benchmark bancario TPC-B.&lt;/p&gt;
&lt;p&gt;Según la &lt;a href=&quot;https://www.postgresql.org/docs/current/pgbench.html&quot;&gt;documentación de pgbench&lt;/a&gt;, el escenario por defecto se inspira en TPC-B sin ser realmente TPC-B, y de ahí su nombre: la salida lo llama &lt;code&gt;TPC-B (sort of)&lt;/code&gt; (comprobado el 31 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo se prepara una base de datos para pgbench?&lt;/h2&gt;
&lt;p&gt;Ejecuta &lt;code&gt;pgbench -i&lt;/code&gt; contra una base de datos existente, con &lt;code&gt;-s&lt;/code&gt; para el factor de escala. El comando crea cuatro tablas y borra cualquier tabla existente con el mismo nombre, así que dale una base de datos propia.&lt;/p&gt;
&lt;p&gt;Con factor 1, &lt;code&gt;pgbench_branches&lt;/code&gt; tiene una fila, &lt;code&gt;pgbench_tellers&lt;/code&gt; 10, &lt;code&gt;pgbench_accounts&lt;/code&gt; 100.000 y &lt;code&gt;pgbench_history&lt;/code&gt; ninguna, y &lt;code&gt;-s&lt;/code&gt; multiplica esas filas: &lt;code&gt;-s 100&lt;/code&gt; da 10.000.000 de filas en &lt;code&gt;pgbench_accounts&lt;/code&gt;. La documentación no indica el tamaño en disco, así que mídelo después de inicializar (comprobado el 31 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Qué scripts integrados trae pgbench?&lt;/h2&gt;
&lt;p&gt;Tres: &lt;code&gt;tpcb-like&lt;/code&gt; (el predeterminado), &lt;code&gt;simple-update&lt;/code&gt; y &lt;code&gt;select-only&lt;/code&gt;. Eliges uno con &lt;code&gt;-b&lt;/code&gt; o con los atajos &lt;code&gt;-N&lt;/code&gt; y &lt;code&gt;-S&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;El predeterminado envía siete comandos por transacción: &lt;code&gt;BEGIN&lt;/code&gt;, un update y un select sobre una cuenta al azar, updates sobre &lt;code&gt;pgbench_tellers&lt;/code&gt; y &lt;code&gt;pgbench_branches&lt;/code&gt;, un insert en &lt;code&gt;pgbench_history&lt;/code&gt; y &lt;code&gt;END&lt;/code&gt;. &lt;code&gt;simple-update&lt;/code&gt; quita los dos updates sobre las tablas pequeñas, con lo que evita la contención en ellas y, según la documentación, aleja todavía más la prueba de TPC-B. &lt;code&gt;select-only&lt;/code&gt; solo envía el select.&lt;/p&gt;
&lt;h2&gt;¿Cómo se escribe un script propio de pgbench?&lt;/h2&gt;
&lt;p&gt;Pon tu SQL en un archivo, define variables con &lt;code&gt;\set&lt;/code&gt; y las funciones aleatorias, y pasa el archivo con &lt;code&gt;-f&lt;/code&gt;. Cada ejecución del archivo cuenta como una transacción.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;\set aid random(1, 100000 * :scale)
\set delta random(-5000, 5000)
BEGIN;
UPDATE pgbench_accounts SET abalance = abalance + :delta
  WHERE aid = :aid;
SELECT abalance FROM pgbench_accounts WHERE aid = :aid;
END;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Un peso después de &lt;code&gt;@&lt;/code&gt; fija la frecuencia con la que se elige cada script: &lt;code&gt;-f update.sql@9 -b select-only@1&lt;/code&gt; elige el archivo unas nueve de cada diez veces. La documentación también recoge &lt;code&gt;random_exponential&lt;/code&gt;, &lt;code&gt;random_gaussian&lt;/code&gt; y &lt;code&gt;random_zipfian&lt;/code&gt;, con las que puedes concentrar el acceso en unas pocas filas. &lt;code&gt;\sleep&lt;/code&gt; añade una pausa, la versión de base de datos del &lt;a href=&quot;https://loadtest.app/es/think-time-in-load-testing/&quot;&gt;tiempo de reflexión&lt;/a&gt;. Si solo ejecutas tus propios archivos, pasa el factor de escala de la base de datos con &lt;code&gt;-s&lt;/code&gt;; si no, &lt;code&gt;:scale&lt;/code&gt; se queda en 1 y el script de arriba solo toca las primeras 100.000 cuentas. Con tus propias tablas, omite &lt;code&gt;-i&lt;/code&gt; y añade &lt;code&gt;-n&lt;/code&gt; para que pgbench no haga VACUUM de las tablas estándar (comprobado el 31 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Qué opciones convierten pgbench en una prueba de carga?&lt;/h2&gt;
&lt;p&gt;La concurrencia sale de &lt;code&gt;-c&lt;/code&gt; y &lt;code&gt;-j&lt;/code&gt;, la duración de &lt;code&gt;-T&lt;/code&gt; y la forma de la carga de &lt;code&gt;-R&lt;/code&gt;. Sin &lt;code&gt;-R&lt;/code&gt;, cada cliente lanza su siguiente transacción en cuanto termina la anterior.&lt;/p&gt;
&lt;p&gt;Ese comportamiento por defecto es un modelo de carga cerrado, como explica nuestro artículo sobre el &lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;modelo de carga abierto vs cerrado&lt;/a&gt;. Con &lt;code&gt;-R&lt;/code&gt;, pgbench lanza las transacciones según un calendario con distribución de Poisson que avanza desde el arranque del cliente, pase lo que pase con las transacciones anteriores. La latencia que muestra cuenta entonces desde cada inicio previsto e incluye el retraso sobre el calendario (schedule lag), cuya media y máximo aparecen por separado: es la corrección que describe nuestro artículo sobre &lt;a href=&quot;https://loadtest.app/es/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt;. El número de clientes no cambia, así que si el retraso no deja de crecer, el sistema no aguanta ese ritmo con los clientes e hilos elegidos: baja &lt;code&gt;-R&lt;/code&gt; o añade clientes.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--latency-limit&lt;/code&gt; (&lt;code&gt;-L&lt;/code&gt;) cuenta como tardías las transacciones que superan un límite en milisegundos; con &lt;code&gt;-R&lt;/code&gt;, pgbench además se salta las transacciones que ya van demasiado retrasadas y las cuenta como omitidas. &lt;code&gt;-M prepared&lt;/code&gt; usa sentencias preparadas, más rápidas que los otros modos según la documentación (comprobado el 31 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo se lee la salida de pgbench?&lt;/h2&gt;
&lt;p&gt;El resumen muestra la configuración, las transacciones procesadas y fallidas, la latencia media, el tiempo de conexión inicial y los tps. Esta forma sale de la documentación, sin las cifras:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;transaction type: &amp;lt;builtin: TPC-B (sort of)&amp;gt;
number of transactions actually processed: ...
number of failed transactions: ... (...%)
latency average = ... ms
latency stddev = ... ms   (only with -P, -R or -L)
initial connection time = ... ms
tps = ... (without initial connection time)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Las transacciones fallidas son errores de serialización o deadlocks, que &lt;code&gt;--max-tries&lt;/code&gt; puede reintentar. Los demás errores SQL abortan el cliente afectado y dejan un código de salida 2. El resumen no trae percentiles: para la &lt;a href=&quot;https://loadtest.app/es/tail-latency/&quot;&gt;latencia de cola&lt;/a&gt;, registra cada transacción con &lt;code&gt;-l&lt;/code&gt;, que guarda su duración en microsegundos, y calcula tú el p95 o el p99.&lt;/p&gt;
&lt;p&gt;Sin &lt;code&gt;-P&lt;/code&gt;, &lt;code&gt;-R&lt;/code&gt; ni &lt;code&gt;-L&lt;/code&gt;, la latencia media del resumen no se mide: pgbench la deduce a partir de la duración y del número de clientes, es decir, la &lt;a href=&quot;https://loadtest.app/es/littles-law-load-testing/&quot;&gt;ley de Little&lt;/a&gt; aplicada al revés, con los fallos incluidos. Añade &lt;code&gt;-P&lt;/code&gt; cuando importe la latencia.&lt;/p&gt;
&lt;h2&gt;¿Cómo se consiguen cifras de pgbench fiables?&lt;/h2&gt;
&lt;p&gt;Haz que cada ejecución dure varios minutos, repítela, mantén el factor de escala al menos igual al número de clientes y vigila el VACUUM. Si el propio pgbench se convierte en el cuello de botella, llévalo a otra máquina.&lt;/p&gt;
&lt;p&gt;La primera pauta de la sección «Good Practices» de la documentación advierte que no te fíes de ninguna prueba que dure solo unos segundos, y añade que unas cifras reproducibles pueden requerir horas (comprobado el 31 de octubre de 2026). Con el script por defecto, un factor de escala menor que el número de clientes mide sobre todo la contención de los updates, porque &lt;code&gt;pgbench_branches&lt;/code&gt; solo tiene &lt;code&gt;-s&lt;/code&gt; filas y cada transacción modifica una. Las filas muertas y el autovacuum cambian los resultados de una ejecución a otra. Con muchas sesiones, pgbench puede saturar su propia máquina: ejecútalo en una máquina aparte con baja latencia de red, o reparte varias instancias entre varias máquinas.&lt;/p&gt;
&lt;h2&gt;¿Cuándo no es pgbench la herramienta adecuada?&lt;/h2&gt;
&lt;p&gt;Cuando la pregunta trata de los usuarios, de otra base de datos o de una mezcla OLTP estándar. pgbench mide PostgreSQL a solas, sin tu pool de conexiones, tu ORM, tu caché ni tu capa HTTP.&lt;/p&gt;
&lt;p&gt;Para ver lo que notan los usuarios, pon carga en la capa HTTP o API que va delante. LoadFocus, que publica este sitio, no ejecuta pgbench ni puede conectarse directamente a PostgreSQL: &lt;a href=&quot;https://loadfocus.com/es-es/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=pgbench&quot;&gt;ejecuta planes de prueba JMeter y scripts de k6&lt;/a&gt; desde 25 regiones en la nube contra endpoints web y de API.&lt;/p&gt;
&lt;p&gt;Elige &lt;strong&gt;sysbench&lt;/strong&gt; para MySQL: su &lt;a href=&quot;https://github.com/akopytov/sysbench&quot;&gt;repositorio&lt;/a&gt; describe una herramienta de benchmark programable y multihilo con pruebas de base de datos de tipo OLTP. Elige &lt;strong&gt;HammerDB&lt;/strong&gt; para una mezcla al estilo de TPC-C: su &lt;a href=&quot;https://www.hammerdb.com/docs/ch03.html&quot;&gt;documentación&lt;/a&gt; describe TPROC-C, una carga derivada de TPC-C, que ejecuta sobre &lt;a href=&quot;https://www.hammerdb.com/&quot;&gt;PostgreSQL y otros motores&lt;/a&gt;. Elige &lt;strong&gt;JMeter&lt;/strong&gt; con su &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html&quot;&gt;sampler JDBC Request&lt;/a&gt; para mezclar SQL y HTTP en un mismo plan de prueba en tus propias máquinas (todo comprobado el 31 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Para qué sirve la opción -s de pgbench?&lt;/strong&gt;
Fija el factor de escala al inicializar. Cada unidad añade 100.000 filas a pgbench_accounts, así que -s 100 crea 10.000.000 de filas. Con el script por defecto, mantenlo al menos igual a tu número de clientes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué diferencia hay entre -c y -j en pgbench?&lt;/strong&gt;
La opción -c fija el número de clientes simulados, cada uno una sesión de base de datos simultánea. La opción -j fija cuántos hilos de trabajo de pgbench se reparten esos clientes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede LoadFocus ejecutar pgbench?&lt;/strong&gt;
No. LoadFocus ejecuta planes de prueba JMeter y scripts de k6 y no tiene conexión directa con PostgreSQL, así que con él pones carga en la capa web o API que va delante de la base de datos.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/coordinated-omission/&quot;&gt;Coordinated omission: qué es y cómo evitarla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;Modelo de carga abierto vs cerrado: cuál usar y cuándo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/tail-latency/&quot;&gt;Latencia de cola: qué es y cómo medirla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/littles-law-load-testing/&quot;&gt;Ley de Little en pruebas de carga: dimensionar y comprobar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/sysbench/&quot;&gt;Cómo usar sysbench: benchmarks de CPU, disco y MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/ycsb/&quot;&gt;YCSB: cargas de trabajo A-F, ejecución y límites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/redis-benchmark/&quot;&gt;redis-benchmark: cómo usarlo y leer sus resultados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/tpc-h/&quot;&gt;TPC-H: qué mide el benchmark y cómo ejecutarlo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>redis-benchmark: cómo usarlo y leer sus resultados</title><link>https://loadtest.app/es/redis-benchmark/</link><guid isPermaLink="true">https://loadtest.app/es/redis-benchmark/</guid><description>Cómo usar redis-benchmark: opciones clave, leer el rendimiento y la latencia, qué cambian el pipelining y los clientes y por qué tu app ve otras cifras.</description><pubDate>Sat, 31 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, un servicio de pruebas de carga mencionado en este artículo.&lt;/p&gt;&lt;p&gt;redis-benchmark es la utilidad de benchmark que viene con Redis: abre un número de conexiones de cliente (50 por defecto), envía un número fijo de comandos (100.000 por defecto) e informa, para cada prueba, de las peticiones por segundo y la latencia. Lanza &lt;code&gt;redis-benchmark -q -n 100000&lt;/code&gt; contra un servidor en marcha, limítalo con &lt;code&gt;-t&lt;/code&gt; a los comandos que te interesan y lee el resultado como la velocidad de una sola instancia de Redis con comandos sintéticos. Tu aplicación añade su propio camino de red, su biblioteca cliente y su mezcla de comandos, así que espera otras cifras.&lt;/p&gt;
&lt;p&gt;Lo ejecutamos el 31 de octubre de 2026 en un portátil Apple M1 Max, con servidor y cliente Redis 7.2.6 en la misma máquina por loopback y sin persistencia. Cada fila es una ejecución de 100.000 peticiones, con las peticiones por segundo redondeadas al millar; el p50 aparece tal como lo imprimió la herramienta.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ejecución&lt;/th&gt;
&lt;th&gt;Qué cambia&lt;/th&gt;
&lt;th&gt;Peticiones por segundo&lt;/th&gt;
&lt;th&gt;p50 (ms)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t set,get&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Nada: 50 clientes, valores de 3 bytes&lt;/td&gt;
&lt;td&gt;SET 113.000, GET 118.000&lt;/td&gt;
&lt;td&gt;0,367; 0,351&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t set,get -P 16&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;16 comandos por ida y vuelta&lt;/td&gt;
&lt;td&gt;SET 1.010.000, GET 1.190.000&lt;/td&gt;
&lt;td&gt;0,711; 0,583&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t set,get -c 200&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;200 clientes&lt;/td&gt;
&lt;td&gt;SET 117.000, GET 123.000&lt;/td&gt;
&lt;td&gt;1,135; 1,071&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t set -d 1024&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Valores de 1.024 bytes&lt;/td&gt;
&lt;td&gt;SET 114.000&lt;/td&gt;
&lt;td&gt;0,367&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-t set -r 100000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Claves aleatorias entre 100.000&lt;/td&gt;
&lt;td&gt;SET 116.000&lt;/td&gt;
&lt;td&gt;0,359&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;script load &amp;quot;...&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Un comando propio&lt;/td&gt;
&lt;td&gt;106.000&lt;/td&gt;
&lt;td&gt;0,415&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Cómo se ejecuta redis-benchmark?&lt;/h2&gt;
&lt;p&gt;Apunta la herramienta a un servidor en marcha con &lt;code&gt;-h&lt;/code&gt; y &lt;code&gt;-p&lt;/code&gt;; sin opciones, ejecuta su batería de pruebas por defecto contra 127.0.0.1:6379. Añade &lt;code&gt;-t&lt;/code&gt; para elegir pruebas y &lt;code&gt;-q&lt;/code&gt; para ver una línea por prueba.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;redis-benchmark -h 10.0.0.12 -p 6379 -c 50 -n 100000 \
  -t set,get -q
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La &lt;a href=&quot;https://redis.io/docs/latest/operate/oss_and_stack/management/optimization/benchmarks/&quot;&gt;página oficial de benchmark de Redis&lt;/a&gt; y la salida de &lt;code&gt;--help&lt;/code&gt; de la versión 7.2.6 recogen, entre otras, estas opciones (comprobado el 31 de octubre de 2026):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-c&lt;/code&gt; conexiones en paralelo (50 por defecto) y &lt;code&gt;-n&lt;/code&gt; peticiones en total (100.000 por defecto).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-d&lt;/code&gt; tamaño de los valores de SET y GET en bytes (3 por defecto).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-P&lt;/code&gt; comandos por pipeline (1 por defecto, sin pipelining).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-t&lt;/code&gt; una lista de pruebas separadas por comas; &lt;code&gt;-q&lt;/code&gt; salida resumida; &lt;code&gt;--csv&lt;/code&gt; salida en CSV.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-r&lt;/code&gt; claves aleatorias dentro de un espacio de claves de ese tamaño. Sin esta opción, todos los comandos usan la misma clave.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-k 1&lt;/code&gt; mantiene las conexiones abiertas (por defecto) y &lt;code&gt;-k 0&lt;/code&gt; vuelve a conectar.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--threads&lt;/code&gt; activa el modo multihilo y &lt;code&gt;--cluster&lt;/code&gt; el modo clúster, en el que &lt;code&gt;-c&lt;/code&gt; debe ser al menos igual al número de nodos.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;¿Cómo se lee la salida de redis-benchmark?&lt;/h2&gt;
&lt;p&gt;Con &lt;code&gt;-q&lt;/code&gt; obtienes una línea por prueba: peticiones por segundo y latencia mediana. Sin &lt;code&gt;-q&lt;/code&gt;, cada prueba imprime su configuración, una distribución de la latencia por percentiles y un resumen con la media, el mínimo, p50, p95, p99 y el máximo.&lt;/p&gt;
&lt;p&gt;La cabecera también muestra los ajustes &lt;code&gt;save&lt;/code&gt; y &lt;code&gt;appendonly&lt;/code&gt; del servidor, que te dicen si la persistencia formaba parte de la prueba. Nuestra ejecución completa de GET dio 119.617 peticiones por segundo, una media de 0,352 ms, un p95 de 0,559 ms, un p99 de 0,623 ms y un máximo de 0,759 ms. Una petición que llama muchas veces a Redis tiene más probabilidades de dar con una llamada lenta, así que mira también el p99; nuestro artículo sobre la &lt;a href=&quot;https://loadtest.app/es/tail-latency/&quot;&gt;latencia de cola&lt;/a&gt; explica por qué.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--csv&lt;/code&gt; imprime el resumen como una fila por prueba. Repite las ejecuciones antes de fiarte de una diferencia pequeña: dos ejecuciones de la misma prueba SET nos dieron unas 113.000 y 125.000 peticiones por segundo.&lt;/p&gt;
&lt;h2&gt;¿Por qué el pipelining cambia tanto las cifras?&lt;/h2&gt;
&lt;p&gt;Sin &lt;code&gt;-P&lt;/code&gt;, cada cliente espera una respuesta antes de enviar su siguiente comando, así que cada comando cuesta un viaje de ida y vuelta completo. Con &lt;code&gt;-P 16&lt;/code&gt;, cada cliente envía 16 de golpe, y en nuestra ejecución SET pasó de unas 113.000 a 1.010.000 peticiones por segundo y GET de 118.000 a 1.190.000.&lt;/p&gt;
&lt;p&gt;La página oficial considera realista el pipelining, porque muchas aplicaciones Redis lo usan, y aconseja un tamaño de pipeline cercano a la media que tu aplicación puede usar de verdad. Nuestra latencia mediana subió a la vez, a 0,711 y 0,583 ms.&lt;/p&gt;
&lt;h2&gt;¿Qué pasa si añades más clientes?&lt;/h2&gt;
&lt;p&gt;Cuando el cuello de botella ya está saturado, más clientes solo añaden espera. En un solo portátil puede ser el servidor o el cliente de benchmark, que usa un único hilo.&lt;/p&gt;
&lt;p&gt;Al pasar de 50 a 200 clientes, el rendimiento se mantuvo casi plano (unas 117.000 peticiones SET y 123.000 GET por segundo) mientras la latencia mediana casi se triplicó, hasta 1,135 y 1,071 ms. Es la &lt;a href=&quot;https://loadtest.app/es/littles-law-load-testing/&quot;&gt;ley de Little&lt;/a&gt; en acción. Cada cliente tiene como mucho un comando en curso, así que &lt;code&gt;-c&lt;/code&gt; fija cuántos hay en el sistema, y si el rendimiento no puede crecer, tiene que crecer el tiempo que cada uno pasa ahí. En nuestra ejecución completa de GET, 50 clientes ÷ 119.617 peticiones por segundo dan 0,42 ms por vuelta de cliente, algo por encima de la media medida de 0,352 ms. Con 200 clientes, la misma cuenta da 1,63 ms.&lt;/p&gt;
&lt;p&gt;Por eso la herramienta también sigue un modelo de carga cerrado: cuando Redis se atasca, los clientes esperan, y los comandos que tu aplicación habría enviado mientras tanto nunca aparecen. Ni la página oficial ni &lt;code&gt;--help&lt;/code&gt; ofrecen una opción de ritmo de peticiones fijo, así que lee sus percentiles teniendo presente la &lt;a href=&quot;https://loadtest.app/es/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;¿Cómo mides tu propio comando o un script Lua?&lt;/h2&gt;
&lt;p&gt;Escribe el comando después de las opciones. La herramienta ejecuta entonces solo ese comando e ignora &lt;code&gt;-t&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;redis-benchmark -n 100000 -q \
  script load &amp;quot;redis.call(&amp;#39;set&amp;#39;,&amp;#39;foo&amp;#39;,&amp;#39;bar&amp;#39;)&amp;quot;
redis-benchmark -r 10000 -n 10000 \
  eval &amp;#39;return redis.call(&amp;quot;ping&amp;quot;)&amp;#39; 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La primera línea es el ejemplo de la página oficial; en nuestro portátil corrió a unas 106.000 peticiones por segundo. &lt;code&gt;SCRIPT LOAD&lt;/code&gt; solo carga el script, así que usa &lt;code&gt;eval&lt;/code&gt;, como en la segunda línea, sacada de &lt;code&gt;--help&lt;/code&gt;, para medir su ejecución. Con &lt;code&gt;-r&lt;/code&gt;, la ayuda indica que &lt;code&gt;__rand_int__&lt;/code&gt; dentro de un argumento se sustituye por un número aleatorio de 12 cifras en ese rango, y en modo clúster la clave debe contener un &lt;code&gt;{tag}&lt;/code&gt; para llegar al nodo correcto.&lt;/p&gt;
&lt;h2&gt;¿Por qué tu aplicación ve otras cifras?&lt;/h2&gt;
&lt;p&gt;Tu aplicación mide todo su camino hasta Redis: red, biblioteca cliente, serialización y su propia mezcla de comandos. La página oficial enumera trampas que conviene revisar antes de comparar.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un bucle de comandos síncronos mide sobre todo la red y la biblioteca cliente.&lt;/li&gt;
&lt;li&gt;Con cliente y servidor en la misma máquina, la CPU limita el benchmark. Los sockets de dominio Unix pueden dar alrededor de un 50 % más de rendimiento que el loopback TCP, por ejemplo en Linux.&lt;/li&gt;
&lt;li&gt;Cadenas de 4 KB a 100.000 peticiones por segundo necesitan unos 3,2 Gbit/s, más de lo que soporta un enlace de 1 Gbit/s.&lt;/li&gt;
&lt;li&gt;Para comparar Redis con una base de datos transaccional, activa AOF y elige una política de fsync adecuada.&lt;/li&gt;
&lt;li&gt;Los portátiles varían la frecuencia de la CPU, lo que perjudica la repetibilidad.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;INFO&lt;/code&gt; a intervalos regulares probablemente no molesta durante una ejecución, mientras que &lt;code&gt;MONITOR&lt;/code&gt; ralentiza Redis de forma notable.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;¿Muestran estas cifras de portátil la capacidad real de Redis?&lt;/h2&gt;
&lt;p&gt;No. Muestran un portátil hablando consigo mismo, sin red, con valores de 3 bytes en casi todas las ejecuciones, sin persistencia y con una ejecución por fila.&lt;/p&gt;
&lt;p&gt;La tabla enseña cómo mueve cada opción las cifras. La capacidad depende de tu servidor, tu red, el tamaño de tus valores y tu configuración de persistencia.&lt;/p&gt;
&lt;h2&gt;¿Cuándo no es redis-benchmark la herramienta adecuada?&lt;/h2&gt;
&lt;p&gt;Cuando quieres saber qué notan los usuarios. Envía comandos sintéticos solo a Redis, mientras que el tiempo de respuesta de una página incluye también el código de la aplicación y sus otras llamadas.&lt;/p&gt;
&lt;p&gt;Para eso, pon carga sobre la aplicación o la API que usa Redis y vigila Redis durante la prueba. LoadFocus, que publica este sitio, trabaja en esa capa: &lt;a href=&quot;https://loadfocus.com/es-es/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=redis-benchmark&quot;&gt;ejecuta planes de prueba JMeter y scripts de k6&lt;/a&gt; desde 25 regiones en la nube contra tu aplicación web o tu API. No ejecuta redis-benchmark.&lt;/p&gt;
&lt;p&gt;Si necesitas más control sobre el tráfico de Redis, el repositorio de &lt;a href=&quot;https://github.com/redis/memtier_benchmark&quot;&gt;memtier_benchmark&lt;/a&gt; menciona clientes multihilo, una proporción de lecturas y escrituras, patrones de claves aleatorios o secuenciales, Redis Cluster y TLS (comprobado el 31 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Está redis-benchmark diseñado para que Redis parezca rápido?&lt;/strong&gt;
No. La página oficial de Redis lo llama un error de concepto habitual: por defecto, la herramienta mantiene como mucho una consulta pendiente por conexión, sin pipelining, y un cliente que usa pipelining puede generar más rendimiento.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cómo se llena una base de datos Redis con redis-benchmark?&lt;/strong&gt;
Ejecuta solo la prueba SET con claves aleatorias, como muestra la ayuda de la herramienta: &lt;code&gt;-t set -n 1000000 -r 100000000&lt;/code&gt; llena alrededor de un millón de claves. Las claves aleatorias pueden repetirse, así que el total final queda algo por debajo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede LoadFocus ejecutar redis-benchmark?&lt;/strong&gt;
No. LoadFocus no ejecuta redis-benchmark. Sus planes de prueba JMeter y sus scripts de k6 se dirigen a la aplicación web o la API que está delante de Redis.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/littles-law-load-testing/&quot;&gt;Ley de Little en pruebas de carga: dimensionar y comprobar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/tail-latency/&quot;&gt;Latencia de cola: qué es y cómo medirla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/coordinated-omission/&quot;&gt;Coordinated omission: qué es y cómo evitarla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;Modelo de carga abierto vs cerrado: cuál usar y cuándo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/http-benchmarking-tools/&quot;&gt;Herramientas de benchmark HTTP: wrk, hey, oha, ab y más&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/pgbench/&quot;&gt;pgbench: benchmark y pruebas de carga de PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/sysbench/&quot;&gt;Cómo usar sysbench: benchmarks de CPU, disco y MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/ycsb/&quot;&gt;YCSB: cargas de trabajo A-F, ejecución y límites&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Cómo usar sysbench: benchmarks de CPU, disco y MySQL</title><link>https://loadtest.app/es/sysbench/</link><guid isPermaLink="true">https://loadtest.app/es/sysbench/</guid><description>Cómo funciona sysbench: pruebas de CPU, memoria y E/S de archivos, scripts OLTP para MySQL y PostgreSQL, opciones clave, cómo leer la salida y sus límites.</description><pubDate>Sat, 31 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, un servicio de pruebas de carga mencionado en este artículo.&lt;/p&gt;&lt;p&gt;sysbench es una herramienta de benchmark open source y multihilo, construida sobre LuaJIT, que incluye pruebas de CPU, memoria, E/S de archivos, hilos y mutex, además de scripts OLTP para MySQL y PostgreSQL. Las pruebas que necesitan datos siguen el mismo ciclo: &lt;code&gt;prepare&lt;/code&gt; crea los archivos o tablas de prueba, &lt;code&gt;run&lt;/code&gt; ejecuta el benchmark durante un tiempo o un número de eventos fijo, y &lt;code&gt;cleanup&lt;/code&gt; borra los datos; las pruebas de CPU y memoria solo necesitan &lt;code&gt;run&lt;/code&gt;. Mide una sola máquina o un solo servidor de base de datos, así que no puede decirte cómo se comporta tu aplicación con tráfico real de usuarios.&lt;/p&gt;
&lt;p&gt;No hemos ejecutado sysbench para esta guía. Los datos salen de su README y de su código fuente en la rama master de GitHub, comprobados el 31 de octubre de 2026, y los consejos son nuestros.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tema&lt;/th&gt;
&lt;th&gt;sysbench&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licencia&lt;/td&gt;
&lt;td&gt;GPLv2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escrito en&lt;/td&gt;
&lt;td&gt;C, con LuaJIT para los scripts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Última versión&lt;/td&gt;
&lt;td&gt;1.0.20 (24 de abril de 2020)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Último commit&lt;/td&gt;
&lt;td&gt;9 de marzo de 2025&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pruebas integradas&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cpu&lt;/code&gt;, &lt;code&gt;memory&lt;/code&gt;, &lt;code&gt;fileio&lt;/code&gt;, &lt;code&gt;threads&lt;/code&gt;, &lt;code&gt;mutex&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scripts de base de datos&lt;/td&gt;
&lt;td&gt;Ocho scripts &lt;code&gt;oltp_*&lt;/code&gt;, &lt;code&gt;bulk_insert&lt;/code&gt;, dos &lt;code&gt;select_random_*&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Drivers de base de datos&lt;/td&gt;
&lt;td&gt;MySQL (por defecto), PostgreSQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plataformas&lt;/td&gt;
&lt;td&gt;Linux, macOS; Windows mediante WSL&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿sysbench sigue teniendo mantenimiento?&lt;/h2&gt;
&lt;p&gt;Muy poco. La última versión, la 1.0.20, salió en abril de 2020; desde entonces la rama master ha recibido commits ocasionales, ninguno publicado en una versión, el último en marzo de 2025.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://github.com/akopytov/sysbench/releases/tag/1.0.20&quot;&gt;versión 1.0.20&lt;/a&gt; tiene fecha del 24 de abril de 2020. El &lt;a href=&quot;https://github.com/akopytov/sysbench/commits/master&quot;&gt;historial de commits&lt;/a&gt; muestra cambios como una distribución uniforme por defecto para &lt;code&gt;--rand-type&lt;/code&gt; (2020), un LuaJIT de upstream (2023) y soporte para las bibliotecas cliente de MariaDB (2023), y después cuatro commits de compilación el 9 de marzo de 2025 (comprobado el 31 de octubre de 2026). Los repositorios de paquetes del README se actualizan con cada versión, así que esos cambios requieren compilar desde el código fuente.&lt;/p&gt;
&lt;h2&gt;¿Cómo funciona una ejecución de sysbench?&lt;/h2&gt;
&lt;p&gt;Indicas una prueba y un comando: &lt;code&gt;sysbench [options] [testname] [command]&lt;/code&gt;. La prueba es una integrada, un script Lua incluido o tu propio script, y el comando suele ser &lt;code&gt;prepare&lt;/code&gt;, &lt;code&gt;run&lt;/code&gt;, &lt;code&gt;cleanup&lt;/code&gt; o &lt;code&gt;help&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Según el &lt;a href=&quot;https://github.com/akopytov/sysbench&quot;&gt;README&lt;/a&gt;, &lt;code&gt;prepare&lt;/code&gt; crea los archivos para &lt;code&gt;fileio&lt;/code&gt; o llena la base de datos para los scripts OLTP, &lt;code&gt;cleanup&lt;/code&gt; borra esos datos y &lt;code&gt;sysbench &amp;lt;testname&amp;gt; help&lt;/code&gt; muestra las opciones de una prueba. Una prueba de disco:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;sysbench fileio --file-total-size=8G prepare
sysbench fileio --file-total-size=8G \
  --file-test-mode=rndrw --time=300 run
sysbench fileio --file-total-size=8G cleanup
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/tests/fileio/sb_fileio.c&quot;&gt;código de fileio&lt;/a&gt; enumera los modos &lt;code&gt;seqwr&lt;/code&gt;, &lt;code&gt;seqrewr&lt;/code&gt;, &lt;code&gt;seqrd&lt;/code&gt;, &lt;code&gt;rndrd&lt;/code&gt;, &lt;code&gt;rndwr&lt;/code&gt; y &lt;code&gt;rndrw&lt;/code&gt;, con 2 GB de archivos por defecto. Los archivos que caben en memoria pueden servirse desde la caché de páginas, así que usa un tamaño mayor que la RAM si lo que quieres medir es el disco.&lt;/p&gt;
&lt;h2&gt;¿Cómo medir la CPU y la memoria con sysbench?&lt;/h2&gt;
&lt;p&gt;Con &lt;code&gt;sysbench cpu run&lt;/code&gt; y &lt;code&gt;sysbench memory run&lt;/code&gt;. La prueba de CPU informa de eventos por segundo, donde un evento comprueba si cada número hasta un límite es primo, y la de memoria informa de operaciones y MiB transferidos por segundo.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;sysbench cpu --cpu-max-prime=20000 \
  --threads=4 --time=60 run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/tests/cpu/sb_cpu.c&quot;&gt;prueba de CPU&lt;/a&gt; fija &lt;code&gt;--cpu-max-prime&lt;/code&gt; en 10000 por defecto, y la &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/tests/memory/sb_memory.c&quot;&gt;prueba de memoria&lt;/a&gt; admite un tamaño de bloque, un tamaño total, operaciones de lectura o escritura y acceso secuencial o aleatorio (comprobado el 31 de octubre de 2026). Compara solo ejecuciones con la misma configuración.&lt;/p&gt;
&lt;h2&gt;¿Cómo se prueba MySQL o PostgreSQL con sysbench?&lt;/h2&gt;
&lt;p&gt;Elige uno de los scripts OLTP incluidos, llena las tablas con &lt;code&gt;prepare&lt;/code&gt;, lanza transacciones desde varios hilos con &lt;code&gt;run&lt;/code&gt; y luego borra las tablas con &lt;code&gt;cleanup&lt;/code&gt;. MySQL es el driver por defecto; PostgreSQL necesita &lt;code&gt;--db-driver=pgsql&lt;/code&gt; y una compilación con soporte para PostgreSQL.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;sysbench oltp_read_write --mysql-host=10.0.0.5 \
  --mysql-user=sbtest --mysql-password=secret \
  --tables=10 --table-size=1000000 prepare
sysbench oltp_read_write --mysql-host=10.0.0.5 \
  --mysql-user=sbtest --mysql-password=secret \
  --tables=10 --table-size=1000000 \
  --threads=16 --time=300 --report-interval=10 run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/lua/oltp_common.lua&quot;&gt;script OLTP común&lt;/a&gt; crea una tabla de 10.000 filas si no pasas &lt;code&gt;--tables&lt;/code&gt; y &lt;code&gt;--table-size&lt;/code&gt;. En &lt;code&gt;oltp_read_write&lt;/code&gt;, cada transacción ejecuta 10 consultas por clave, cuatro consultas por rango, dos actualizaciones y un borrado seguido de una inserción, entre &lt;code&gt;BEGIN&lt;/code&gt; y &lt;code&gt;COMMIT&lt;/code&gt; (comprobado el 31 de octubre de 2026). Usa más datos que el buffer pool del servidor si quieres lecturas de disco en el resultado.&lt;/p&gt;
&lt;h2&gt;¿Qué opciones de sysbench importan más?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;--threads&lt;/code&gt; y &lt;code&gt;--time&lt;/code&gt; fijan el tamaño y la duración de una ejecución, &lt;code&gt;--rate&lt;/code&gt; fija una tasa objetivo de eventos, y &lt;code&gt;--report-interval&lt;/code&gt;, &lt;code&gt;--percentile&lt;/code&gt; y &lt;code&gt;--histogram&lt;/code&gt; deciden lo que ves.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--threads&lt;/code&gt;: hilos de trabajo, 1 por defecto.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--time&lt;/code&gt;: segundos, 10 por defecto, 0 para no poner límite. &lt;code&gt;--events&lt;/code&gt; limita el número de eventos, y los dos límites se aplican, así que combínalo con &lt;code&gt;--time=0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--warmup-time&lt;/code&gt;: ejecuta primero sin estadísticas, para que las cachés frías no distorsionen el resultado. Solo en master: la versión 1.0.20 no la tiene.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--rate&lt;/code&gt;: eventos medios por segundo entre todos los hilos; 0, el valor por defecto, significa lo más rápido posible.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--report-interval&lt;/code&gt;: cifras por intervalo cada N segundos, para ver los parones.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--percentile&lt;/code&gt;: el percentil de latencia que se muestra, 95 por defecto.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--histogram&lt;/code&gt;: un histograma de latencias al final, definido en &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/sb_logger.c&quot;&gt;sb_logger.c&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;¿sysbench usa un modelo de carga cerrado o abierto?&lt;/h2&gt;
&lt;p&gt;Cerrado por defecto: un número fijo de hilos lanza cada uno el siguiente evento en cuanto termina el anterior, así que un servidor lento recibe menos eventos. Con &lt;code&gt;--rate&lt;/code&gt;, los eventos llegan según su propio calendario, lo que se acerca más a un modelo de carga abierto.&lt;/p&gt;
&lt;p&gt;Nuestro artículo sobre el &lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;modelo de carga abierto vs cerrado&lt;/a&gt; explica por qué eso cambia lo que mide un benchmark. En el modo por defecto, un parón también retrasa los eventos que habrían empezado durante ese tiempo, y esos retrasos nunca aparecen en las latencias: es la &lt;a href=&quot;https://loadtest.app/es/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt;. El &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/sysbench.c&quot;&gt;archivo fuente principal&lt;/a&gt; muestra que &lt;code&gt;--rate&lt;/code&gt; encola eventos a intervalos con distribución exponencial, suma a la latencia de cada evento su espera en la cola y se detiene con el error &amp;quot;event queue is full&amp;quot; cuando los hilos no dan abasto (comprobado el 31 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo se lee la salida de sysbench?&lt;/h2&gt;
&lt;p&gt;Empieza por el rendimiento: eventos por segundo, o transacciones y consultas por segundo en los scripts OLTP. Después lee el bloque de latencia en milisegundos: mínimo, media, máximo, el percentil elegido (p95 por defecto) y la suma.&lt;/p&gt;
&lt;p&gt;La versión 1.0.20 muestra, en lugar de «Throughput», un bloque «General statistics» con el tiempo total y el número total de eventos. Los nombres de campo vienen del &lt;a href=&quot;https://github.com/akopytov/sysbench/blob/master/src/db_driver.c&quot;&gt;código del informe de base de datos&lt;/a&gt; y del archivo fuente principal en master, aquí sin valores:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;SQL statistics:
    queries performed: read, write, other, total
    transactions, queries (N per sec.)
    ignored errors, reconnects (N per sec.)
Throughput:
    events/s (eps), time elapsed, total number of events
Latency (ms):
    min, avg, max, 95th percentile, sum
Threads fairness:
    events, execution time (avg/stddev)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Un percentil 95 deja fuera el evento más lento de cada veinte. Usa &lt;code&gt;--percentile=99&lt;/code&gt; o añade &lt;code&gt;--histogram&lt;/code&gt; cuando importa la cola de la distribución; nuestra guía sobre la &lt;a href=&quot;https://loadtest.app/es/tail-latency/&quot;&gt;latencia de cola&lt;/a&gt; explica por qué.&lt;/p&gt;
&lt;h2&gt;¿Cuándo no es sysbench la herramienta adecuada?&lt;/h2&gt;
&lt;p&gt;Cuando tu pregunta trata sobre tu aplicación. Una puntuación de CPU muestra lo rápido que una máquina comprueba números primos, y una ejecución OLTP mide el servidor de base de datos con las tablas y consultas de sysbench, sin tu esquema, tu pool de conexiones ni la ruta de red.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Elige &lt;strong&gt;pgbench&lt;/strong&gt; para pruebas nativas de PostgreSQL: la &lt;a href=&quot;https://www.postgresql.org/docs/current/pgbench.html&quot;&gt;documentación de PostgreSQL&lt;/a&gt; describe un escenario por defecto basado a grandes rasgos en TPC-B, además de archivos de script propios (comprobado el 31 de octubre de 2026).&lt;/li&gt;
&lt;li&gt;Elige &lt;strong&gt;HammerDB&lt;/strong&gt; para pruebas al estilo TPC-C: su &lt;a href=&quot;https://www.hammerdb.com/document.html&quot;&gt;documentación&lt;/a&gt; cubre la carga TPROC-C, derivada de TPC-C, para SQL Server, Db2, Oracle, PostgreSQL, MariaDB y MySQL (comprobado el 31 de octubre de 2026).&lt;/li&gt;
&lt;li&gt;Elige &lt;strong&gt;JMeter&lt;/strong&gt; con su sampler JDBC Request para combinar SQL y HTTP en un mismo plan de prueba; la &lt;a href=&quot;https://jmeter.apache.org/usermanual/build-db-test-plan.html&quot;&gt;guía de planes de prueba de base de datos&lt;/a&gt; indica que el &lt;code&gt;.jar&lt;/code&gt; del driver va en la carpeta &lt;code&gt;lib&lt;/code&gt; de JMeter.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;LoadFocus, que publica este sitio, no ejecuta sysbench ni puede conectarse por sí mismo a MySQL o PostgreSQL. &lt;a href=&quot;https://loadfocus.com/es-es/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=sysbench&quot;&gt;Ejecuta planes de prueba JMeter&lt;/a&gt; y scripts de k6 desde 25 regiones en la nube contra la capa web o de API que hay delante de la base de datos. Una combinación útil: una ejecución de sysbench para dimensionar el servidor de base de datos y después una &lt;a href=&quot;https://loadfocus.com/es-es/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=sysbench&quot;&gt;prueba de carga de la aplicación&lt;/a&gt; para ver si las peticiones reales llegan a ese límite.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿sysbench sigue teniendo mantenimiento?&lt;/strong&gt;
Muy poco. La última versión es la 1.0.20, del 24 de abril de 2020. La rama master ha recibido desde entonces commits ocasionales, ninguno en una versión, el más reciente el 9 de marzo de 2025.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué significa el percentil 95 en la salida de sysbench?&lt;/strong&gt;
Es la latencia, en milisegundos, dentro de la cual terminó el 95 % de los eventos. 95 es el valor por defecto de la opción &lt;code&gt;--percentile&lt;/code&gt;, y puedes fijar otro, como 99.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede sysbench hacer benchmarks de PostgreSQL?&lt;/strong&gt;
Sí. Los scripts OLTP incluidos funcionan contra PostgreSQL con &lt;code&gt;--db-driver=pgsql&lt;/code&gt; cuando sysbench se ha compilado con soporte para PostgreSQL.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede LoadFocus ejecutar sysbench?&lt;/strong&gt;
No. LoadFocus ejecuta planes de prueba JMeter y scripts de k6 contra sitios web y API desde 25 regiones en la nube, y no se conecta directamente a MySQL ni a PostgreSQL.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;Modelo de carga abierto vs cerrado: cuál usar y cuándo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/coordinated-omission/&quot;&gt;Coordinated omission: qué es y cómo evitarla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/tail-latency/&quot;&gt;Latencia de cola: qué es y cómo medirla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/http-benchmarking-tools/&quot;&gt;Herramientas de benchmark HTTP: wrk, hey, oha, ab y más&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/throughput-vs-latency/&quot;&gt;Rendimiento vs latencia: cómo se relacionan bajo carga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/pgbench/&quot;&gt;pgbench: benchmark y pruebas de carga de PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/ycsb/&quot;&gt;YCSB: cargas de trabajo A-F, ejecución y límites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/redis-benchmark/&quot;&gt;redis-benchmark: cómo usarlo y leer sus resultados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/tpc-h/&quot;&gt;TPC-H: qué mide el benchmark y cómo ejecutarlo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>YCSB: cargas de trabajo A-F, ejecución y límites</title><link>https://loadtest.app/es/ycsb/</link><guid isPermaLink="true">https://loadtest.app/es/ycsb/</guid><description>YCSB explicado: qué mide el Yahoo! Cloud Serving Benchmark, sus cargas de trabajo A a F, las fases load y run, cómo leer su salida y dónde se queda corto.</description><pubDate>Sat, 31 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, un servicio de pruebas de carga mencionado en este artículo.&lt;/p&gt;&lt;p&gt;YCSB, el Yahoo! Cloud Serving Benchmark, es una herramienta open source escrita en Java que carga registros sintéticos en una base de datos y después ejecuta sobre ellos una mezcla fija de lecturas, actualizaciones, inserciones y escaneos mientras registra el rendimiento y la latencia de cada operación. Sus seis cargas de trabajo básicas (core workloads), de la A a la F, son mezclas estándar, así que la misma prueba puede correr contra Cassandra, MongoDB, Redis, HBase y decenas de bases más gracias a los bindings. Mide solo la base de datos, por lo que no dice nada de las consultas reales de tu aplicación ni de la latencia que ven tus usuarios.&lt;/p&gt;
&lt;p&gt;No hemos ejecutado YCSB para este artículo. Los datos salen de su repositorio de GitHub, su wiki y su código fuente, comprobados el 31 de octubre de 2026, y las valoraciones son nuestras.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Carga de trabajo&lt;/th&gt;
&lt;th&gt;Mezcla de operaciones&lt;/th&gt;
&lt;th&gt;Distribución de claves&lt;/th&gt;
&lt;th&gt;Ejemplo que da la wiki&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;A: muchas actualizaciones&lt;/td&gt;
&lt;td&gt;50 % lecturas, 50 % actualizaciones&lt;/td&gt;
&lt;td&gt;zipfian&lt;/td&gt;
&lt;td&gt;Almacén de sesiones que guarda las acciones recientes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B: sobre todo lecturas&lt;/td&gt;
&lt;td&gt;95 % lecturas, 5 % actualizaciones&lt;/td&gt;
&lt;td&gt;zipfian&lt;/td&gt;
&lt;td&gt;Etiquetado de fotos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C: solo lectura&lt;/td&gt;
&lt;td&gt;100 % lecturas&lt;/td&gt;
&lt;td&gt;zipfian&lt;/td&gt;
&lt;td&gt;Caché de perfiles de usuario&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D: leer lo más reciente&lt;/td&gt;
&lt;td&gt;95 % lecturas, 5 % inserciones&lt;/td&gt;
&lt;td&gt;latest&lt;/td&gt;
&lt;td&gt;Actualizaciones de estado de usuarios&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E: rangos cortos&lt;/td&gt;
&lt;td&gt;95 % escaneos, 5 % inserciones&lt;/td&gt;
&lt;td&gt;zipfian (escaneos de hasta 100 registros)&lt;/td&gt;
&lt;td&gt;Hilos de conversación&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F: leer-modificar-escribir&lt;/td&gt;
&lt;td&gt;50 % lecturas, 50 % leer-modificar-escribir&lt;/td&gt;
&lt;td&gt;zipfian&lt;/td&gt;
&lt;td&gt;Base de datos de usuarios&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Las mezclas vienen de los archivos del &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/tree/master/workloads&quot;&gt;directorio workloads&lt;/a&gt; y los ejemplos de la &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/wiki/Core-Workloads&quot;&gt;página Core Workloads&lt;/a&gt; (comprobado el 31 de octubre de 2026). Cada archivo trae solo 1.000 registros y 1.000 operaciones: suficiente para depurar una instalación y demasiado pocos para un benchmark.&lt;/p&gt;
&lt;h2&gt;¿Qué es YCSB y sigue teniendo mantenimiento?&lt;/h2&gt;
&lt;p&gt;Es un generador de carga con un conjunto de cargas de trabajo estándar para comparar bases clave-valor y de tipo &amp;quot;cloud serving&amp;quot;, que Yahoo! publicó como open source en 2010 con licencia Apache 2.0. La última versión es de octubre de 2019, y el código todavía recibe pequeños commits.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/wiki/Papers-and-Presentations&quot;&gt;página de publicaciones&lt;/a&gt; cita el artículo original, &amp;quot;Benchmarking Cloud Serving Systems with YCSB&amp;quot;, de Cooper, Silberstein, Tam, Ramakrishnan y Sears (ACM SoCC 2010). La &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/releases/tag/0.17.0&quot;&gt;versión 0.17.0&lt;/a&gt; tiene fecha del 6 de octubre de 2019 y no existe ningún tag posterior, mientras que el &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/commits/master&quot;&gt;historial de commits&lt;/a&gt; muestra trabajo de 2026, como una opción para seguir adelante cuando falla una inserción y un cambio en el binding de Cloud Spanner del 20 de octubre (comprobado el 31 de octubre de 2026). Esos cambios solo llegan si compilas desde el código fuente, y para eso necesitas Maven 3.&lt;/p&gt;
&lt;h2&gt;¿Cómo se ejecuta un benchmark con YCSB?&lt;/h2&gt;
&lt;p&gt;En dos fases que comparten las mismas propiedades: &lt;code&gt;load&lt;/code&gt; inserta &lt;code&gt;recordcount&lt;/code&gt; registros y después &lt;code&gt;run&lt;/code&gt; ejecuta &lt;code&gt;operationcount&lt;/code&gt; operaciones con la mezcla de la carga de trabajo. Indicas el binding de tu base de datos y pasas el archivo de la carga de trabajo con &lt;code&gt;-P&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;bin/ycsb load mongodb -s -P workloads/workloada \
  -p recordcount=1000000 \
  -p mongodb.url=mongodb://db1:27017/ycsb
bin/ycsb run mongodb -s -P workloads/workloada \
  -p recordcount=1000000 -p operationcount=5000000 \
  -p mongodb.url=mongodb://db1:27017/ycsb \
  -threads 32 -target 20000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/wiki/Running-a-Workload&quot;&gt;página Running a Workload&lt;/a&gt; recoge los detalles en los que más gente tropieza (comprobado el 31 de octubre de 2026). El cliente nunca crea tablas, así que antes tienes que asociar &lt;code&gt;usertable&lt;/code&gt; a lo que necesite tu almacén de datos, por ejemplo una tabla en MySQL o un keyspace en Cassandra. Los archivos &lt;code&gt;-P&lt;/code&gt; posteriores sobrescriben a los anteriores, y &lt;code&gt;-p&lt;/code&gt; los sobrescribe a todos. La fase run necesita el mismo &lt;code&gt;recordcount&lt;/code&gt; que la carga, porque elige las claves entre todo el conjunto de datos. &lt;code&gt;-s&lt;/code&gt; muestra una línea de estado cada 10 segundos. Como D y E insertan registros, la página Core Workloads aconseja cargar una vez con el archivo de A, ejecutar A, B, C, F y D, y después borrar los datos y volver a cargar para E.&lt;/p&gt;
&lt;h2&gt;¿Qué controlan -threads y -target?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;-threads&lt;/code&gt; fija cuántos hilos cliente envían operaciones (uno por defecto) y &lt;code&gt;-target&lt;/code&gt; limita el total de operaciones por segundo. Sin objetivo, cada hilo envía la siguiente operación en cuanto vuelve la anterior, así que una base de datos más lenta simplemente recibe menos carga.&lt;/p&gt;
&lt;p&gt;Es un modelo de carga cerrado, y nuestro artículo sobre el &lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;modelo de carga abierto vs cerrado&lt;/a&gt; explica lo que oculta ese modelo. El ejemplo de la wiki, 10 hilos con un objetivo de 100 operaciones por segundo, solo se cumple mientras la latencia media se mantenga por debajo de 100 ms; con pocos hilos, el ritmo alcanzado se queda por debajo del objetivo. Es la &lt;a href=&quot;https://loadtest.app/es/littles-law-load-testing/&quot;&gt;ley de Little&lt;/a&gt;: los hilos divididos entre la latencia media ponen techo al rendimiento. Si lanzas varios objetivos y anotas la latencia de cada uno, obtienes la curva de nuestra guía sobre &lt;a href=&quot;https://loadtest.app/es/throughput-vs-latency/&quot;&gt;rendimiento vs latencia&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;¿Cómo se lee la salida de YCSB?&lt;/h2&gt;
&lt;p&gt;Al final de cada fase, el cliente imprime un bloque &lt;code&gt;[OVERALL]&lt;/code&gt; con el tiempo de ejecución y el rendimiento, y luego un bloque por tipo de operación con el recuento, las latencias media, mínima, máxima y por percentil, y un recuento por código de retorno.&lt;/p&gt;
&lt;p&gt;Estos nombres de campo salen del código fuente de la 0.17.0; los valores son marcadores de posición:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;[OVERALL], RunTime(ms), &amp;lt;total&amp;gt;
[OVERALL], Throughput(ops/sec), &amp;lt;rate&amp;gt;
[READ], Operations, &amp;lt;count&amp;gt;
[READ], AverageLatency(us), &amp;lt;value&amp;gt;
[READ], 95thPercentileLatency(us), &amp;lt;value&amp;gt;
[READ], 99thPercentileLatency(us), &amp;lt;value&amp;gt;
[READ], Return=OK, &amp;lt;count&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La salida de ejemplo de la wiki muestra milisegundos, pero la medición HdrHistogram por defecto, tanto en la 0.17.0 como en el código actual, da microsegundos, &lt;code&gt;(us)&lt;/code&gt;. La &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/wiki/Core-Properties&quot;&gt;página Core Properties&lt;/a&gt; y la versión 0.17.0 fijan los percentiles por defecto en 95 y 99, que puedes cambiar con &lt;code&gt;hdrhistogram.percentiles&lt;/code&gt;; desde abril de 2025 la rama master añade el 50, así que una compilación desde el código fuente también muestra &lt;code&gt;50thPercentileLatency(us)&lt;/code&gt; (comprobado el 31 de octubre de 2026). El &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB&quot;&gt;README&lt;/a&gt; dirige la atención al P99 y más allá, advierte que los percentiles no se pueden promediar y recomienda, si usas varios clientes, guardar archivos de histograma HDR con &lt;code&gt;hdrhistogram.fileoutput=true&lt;/code&gt; y combinarlos.&lt;/p&gt;
&lt;h2&gt;¿Tiene en cuenta YCSB la coordinated omission?&lt;/h2&gt;
&lt;p&gt;Solo si lo pides, y solo con &lt;code&gt;-target&lt;/code&gt;. Por defecto, cada latencia se mide desde el momento en que la operación se envía de verdad, así que un atasco que retrasa las operaciones que vienen detrás apenas se nota.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/blob/master/core/src/main/java/site/ycsb/measurements/Measurements.java&quot;&gt;código fuente de las mediciones&lt;/a&gt; incluye una propiedad &lt;code&gt;measurement.interval&lt;/code&gt; que acepta &lt;code&gt;op&lt;/code&gt; (por defecto), &lt;code&gt;intended&lt;/code&gt; o &lt;code&gt;both&lt;/code&gt; (comprobado el 31 de octubre de 2026). Con un objetivo, cada hilo anota el inicio previsto de cada operación; &lt;code&gt;intended&lt;/code&gt; mide la latencia desde ese punto y &lt;code&gt;both&lt;/code&gt; añade bloques &lt;code&gt;Intended-&lt;/code&gt; como &lt;code&gt;[Intended-READ]&lt;/code&gt; junto a los habituales. La wiki no menciona la propiedad, así que revisa el código de la versión que compiles. Nuestra guía sobre la &lt;a href=&quot;https://loadtest.app/es/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt; explica por qué el inicio previsto da la cifra honesta.&lt;/p&gt;
&lt;h2&gt;¿Qué bases de datos puede probar YCSB?&lt;/h2&gt;
&lt;p&gt;Cualquiera que tenga un binding. El archivo de build de la rama master lista 46 módulos de binding, entre ellos Cassandra, MongoDB, Redis, HBase, DynamoDB, Cloud Spanner, RocksDB y un binding JDBC genérico.&lt;/p&gt;
&lt;p&gt;La lista está en el &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/blob/master/pom.xml&quot;&gt;pom.xml&lt;/a&gt;, y cada directorio de binding tiene su propio README con las propiedades de conexión, como &lt;code&gt;mongodb.url&lt;/code&gt; en el &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/tree/master/mongodb&quot;&gt;binding de MongoDB&lt;/a&gt; (comprobado el 31 de octubre de 2026). Según la página Running a Workload, una sola máquina cliente basta para clústeres de unas 10 máquinas; por encima, arrancas varios clientes, y la página &lt;a href=&quot;https://github.com/brianfrankcooper/YCSB/wiki/Running-a-Workload-in-Parallel&quot;&gt;Running a Workload in Parallel&lt;/a&gt; reparte la carga entre ellos con &lt;code&gt;insertstart&lt;/code&gt; e &lt;code&gt;insertcount&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;¿Cuándo no es YCSB la herramienta adecuada?&lt;/h2&gt;
&lt;p&gt;Cuando tu pregunta es sobre tu aplicación. La carga de trabajo básica escribe registros sintéticos, 10 campos con una longitud de 100 cada uno por defecto, mediante operaciones simples por clave, así que no puede mostrar cómo se comportan bajo carga tus propias consultas, tus índices o el código de tu API.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Para OLTP relacional, &lt;a href=&quot;https://www.postgresql.org/docs/current/pgbench.html&quot;&gt;pgbench&lt;/a&gt; ejecuta contra PostgreSQL un script inspirado en TPC-B y acepta tus propios scripts, y &lt;a href=&quot;https://github.com/akopytov/sysbench&quot;&gt;sysbench&lt;/a&gt; incluye benchmarks en Lua de tipo OLTP (ambos comprobados el 31 de octubre de 2026).&lt;/li&gt;
&lt;li&gt;Para la latencia que ven los usuarios, pon bajo carga la capa HTTP o de API que hay delante de la base de datos. LoadFocus, que publica este sitio, &lt;a href=&quot;https://loadfocus.com/es-es/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=ycsb&quot;&gt;ejecuta planes de prueba JMeter y scripts de k6&lt;/a&gt; desde 25 regiones en la nube contra endpoints web y de API. LoadFocus no ejecuta YCSB.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Cuáles son las cargas de trabajo básicas de YCSB?&lt;/strong&gt;
Seis mezclas estándar: A tiene un 50 % de lecturas y un 50 % de actualizaciones, B un 95 % de lecturas, C solo lecturas, D favorece los registros insertados más recientemente, E hace escaneos cortos y F hace operaciones de lectura-modificación-escritura.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué diferencia hay entre ycsb load y ycsb run?&lt;/strong&gt;
La fase load inserta el número de registros que fija &lt;code&gt;recordcount&lt;/code&gt;. La fase run ejecuta después &lt;code&gt;operationcount&lt;/code&gt; operaciones con la mezcla de la carga de trabajo sobre esos registros e informa del rendimiento y la latencia.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿YCSB sigue teniendo mantenimiento?&lt;/strong&gt;
La última versión, la 0.17.0, salió el 6 de octubre de 2019. El repositorio todavía recibe commits de vez en cuando, el más reciente el 20 de octubre de 2026, así que las correcciones nuevas exigen compilar desde el código fuente.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede LoadFocus ejecutar benchmarks de YCSB?&lt;/strong&gt;
No. LoadFocus no ejecuta YCSB. Sus planes de prueba JMeter y sus scripts de k6 se dirigen a endpoints web y de API, es decir, a la capa que hay delante del almacén de datos.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/coordinated-omission/&quot;&gt;Coordinated omission: qué es y cómo evitarla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/tail-latency/&quot;&gt;Latencia de cola: qué es y cómo medirla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;Modelo de carga abierto vs cerrado: cuál usar y cuándo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/littles-law-load-testing/&quot;&gt;Ley de Little en pruebas de carga: dimensionar y comprobar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/throughput-vs-latency/&quot;&gt;Rendimiento vs latencia: cómo se relacionan bajo carga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/pgbench/&quot;&gt;pgbench: benchmark y pruebas de carga de PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/sysbench/&quot;&gt;Cómo usar sysbench: benchmarks de CPU, disco y MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/redis-benchmark/&quot;&gt;redis-benchmark: cómo usarlo y leer sus resultados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/tpc-h/&quot;&gt;TPC-H: qué mide el benchmark y cómo ejecutarlo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Pruebas de carga con NBomber: análisis del framework .NET</title><link>https://loadtest.app/es/nbomber-load-testing/</link><guid isPermaLink="true">https://loadtest.app/es/nbomber-load-testing/</guid><description>Pruebas de carga con NBomber: escenarios en C# y F#, simulaciones inject y constant, umbrales, plugin HTTP, modo clúster y la licencia para empresas.</description><pubDate>Wed, 21 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, que vende un servicio de pruebas de carga que aparece en este artículo.&lt;/p&gt;&lt;p&gt;NBomber es un framework de pruebas de carga para .NET: escribes cada prueba como un escenario en C# o F#, la añades a un proyecto normal y la ejecutas como cualquier otro programa. Las pruebas de carga con NBomber encajan con equipos que ya desarrollan en .NET y quieren sus pruebas de carga en el mismo lenguaje, el mismo repositorio y el mismo ejecutor de pruebas. Solo es gratis para uso personal y académico; una empresa necesita una licencia de pago, y ese dato decide más evaluaciones que cualquier función.&lt;/p&gt;
&lt;p&gt;No hemos ejecutado NBomber para este análisis. Los datos salen de la documentación, la página de precios, el repositorio de GitHub y el paquete de NuGet de NBomber, comprobados el 21 de octubre de 2026, y las valoraciones son nuestras.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tema&lt;/th&gt;
&lt;th&gt;NBomber&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licencia&lt;/td&gt;
&lt;td&gt;Gratis para uso personal y académico; de pago para organizaciones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Precio para una empresa&lt;/td&gt;
&lt;td&gt;Business 1.500 $ al año, Enterprise 2.500 $ al año&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versión actual&lt;/td&gt;
&lt;td&gt;6.7.1 (16 de octubre de 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entorno&lt;/td&gt;
&lt;td&gt;.NET Standard 2.1, es decir, .NET Core 3.0 o posterior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pruebas escritas como&lt;/td&gt;
&lt;td&gt;Escenarios en C# o F#&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modelo de carga&lt;/td&gt;
&lt;td&gt;Inject (tasa de llegada) o copias constantes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comprobaciones de aprobación&lt;/td&gt;
&lt;td&gt;Umbrales durante la ejecución, aserciones sobre las estadísticas finales&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escalado&lt;/td&gt;
&lt;td&gt;NBomber Cluster, licencia Enterprise&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Quién desarrolla NBomber y es gratis?&lt;/h2&gt;
&lt;p&gt;Lo desarrolla NBomber LLC, con el código en GitHub. Es gratis para uso personal, de aficionado y académico, y la página de licencia dice sin rodeos que NBomber no es gratis para organizaciones.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://nbomber.com/docs/getting-started/license/&quot;&gt;página de licencia&lt;/a&gt; incluye en el uso personal los benchmarks, los tutoriales y el contenido de análisis. Dentro de una empresa necesitas una licencia Business o Enterprise, que se emite por organización y no por puesto de desarrollador, sin límite de instancias ni de ejecuciones en paralelo. La &lt;a href=&quot;https://nbomber.com/pricing&quot;&gt;página de precios&lt;/a&gt; indica 1.500 $ al año para Business y 2.500 $ al año para Enterprise, ambas con 30 días de garantía de devolución. La clave de licencia se pasa al ejecutor con &lt;code&gt;.WithLicense(...)&lt;/code&gt; o con un argumento &lt;code&gt;--license&lt;/code&gt;, y NBomber necesita acceso a internet para validarla, con validación sin conexión disponible si la pides por correo (comprobado el 21 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;La última versión es la &lt;a href=&quot;https://github.com/PragmaticFlow/NBomber/releases/tag/v6.7.1&quot;&gt;v6.7.1&lt;/a&gt;, publicada el 16 de octubre de 2026, cuatro días después de la 6.7.0 (comprobado el 21 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo funciona un escenario de NBomber?&lt;/h2&gt;
&lt;p&gt;Un escenario es un nombre más una función asíncrona que NBomber cronometra en cada llamada. Le añades simulaciones de carga y umbrales, lo registras en &lt;code&gt;NBomberRunner&lt;/code&gt; y ejecutas el programa.&lt;/p&gt;
&lt;p&gt;Esta prueba se salta el warm-up, sube la tasa de llegada a 50 copias nuevas del escenario por segundo en dos minutos, la mantiene diez minutos y termina con código de salida 1 si el 1 % o más de las peticiones han fallado. Usa el plugin &lt;code&gt;NBomber.Http&lt;/code&gt; para la petición:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-csharp&quot;&gt;var http = Http.CreateDefaultClient();

var scenario = Scenario.Create(&amp;quot;browse&amp;quot;, async context =&amp;gt;
{
    var request = Http.CreateRequest(&amp;quot;GET&amp;quot;,
        &amp;quot;https://staging.example.com/products&amp;quot;);
    return await Http.Send(http, request);
})
.WithoutWarmUp()
.WithLoadSimulations(
    Simulation.RampingInject(rate: 50,
        interval: TimeSpan.FromSeconds(1),
        during: TimeSpan.FromMinutes(2)),
    Simulation.Inject(rate: 50,
        interval: TimeSpan.FromSeconds(1),
        during: TimeSpan.FromMinutes(10)))
.WithThresholds(
    Threshold.Create(s =&amp;gt; s.Fail.Request.Percent &amp;lt; 1));

var result = NBomberRunner
    .RegisterScenarios(scenario).Run();
return result.Thresholds.Any(t =&amp;gt; t.IsFailed) ? 1 : 0;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La &lt;a href=&quot;https://nbomber.com/docs/protocols/http/http-client/&quot;&gt;página del cliente HTTP&lt;/a&gt; recomienda &lt;code&gt;Http.CreateDefaultClient()&lt;/code&gt; en lugar de un simple &lt;code&gt;new HttpClient()&lt;/code&gt; y dice que el plugin registra los códigos de estado y los datos transferidos (comprobado el 21 de octubre de 2026). Un umbral por sí mismo únicamente deja constancia del fallo en el informe; la última línea es la que lo convierte en un código de salida que un pipeline puede leer. Sin &lt;code&gt;.WithoutWarmUp()&lt;/code&gt;, NBomber ejecuta primero un warm-up de 30 segundos con las simulaciones del escenario, según la &lt;a href=&quot;https://nbomber.com/docs/nbomber/scenario/&quot;&gt;página de escenarios&lt;/a&gt; (comprobado el 21 de octubre de 2026). Como el escenario es C# normal, todo lo que pueda llamar una biblioteca de .NET se puede someter a carga de la misma forma.&lt;/p&gt;
&lt;h2&gt;¿Qué modelos de carga ofrece NBomber?&lt;/h2&gt;
&lt;p&gt;Los dos. Las simulaciones inject lanzan copias nuevas a un ritmo fijo, hagan lo que hagan las anteriores, que es un modelo de carga abierto; las simulaciones constant mantienen un número fijo de copias en marcha, que es uno cerrado.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://nbomber.com/docs/nbomber/load-simulation/&quot;&gt;página de simulaciones de carga&lt;/a&gt; las enumera (comprobado el 21 de octubre de 2026):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Abiertas:&lt;/strong&gt; &lt;code&gt;Inject&lt;/code&gt;, &lt;code&gt;RampingInject&lt;/code&gt;, &lt;code&gt;InjectRandom&lt;/code&gt; e &lt;code&gt;IterationsForInject&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cerradas:&lt;/strong&gt; &lt;code&gt;KeepConstant&lt;/code&gt;, &lt;code&gt;RampingConstant&lt;/code&gt; e &lt;code&gt;IterationsForConstant&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Control de tiempo:&lt;/strong&gt; &lt;code&gt;Pause&lt;/code&gt;, que retrasa el inicio de un escenario o lo pausa durante un tiempo fijado.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nuestro artículo sobre el &lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;modelo de carga abierto vs cerrado&lt;/a&gt; explica cuál encaja con tu tráfico. Un sitio web público suele comportarse como el modelo abierto; un grupo fijo de clientes internos, como el cerrado.&lt;/p&gt;
&lt;h2&gt;¿Cómo funcionan los umbrales y las comprobaciones de aprobación?&lt;/h2&gt;
&lt;p&gt;Los umbrales en tiempo de ejecución revisan las estadísticas en curso, cada 5 segundos por defecto, y aparecen en el informe HTML. Las aserciones, escritas con xUnit o NUnit, revisan las estadísticas finales tras la ejecución, y una aserción fallida termina la ejecución con estado fallido.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://nbomber.com/docs/nbomber/asserts_and_thresholds/&quot;&gt;página de umbrales&lt;/a&gt; muestra comprobaciones sobre el porcentaje de errores, los códigos de estado, los percentiles de latencia (p50, p75, p95, p99 y máximo), las peticiones por segundo y los bytes transferidos. Por defecto un umbral no detiene la prueba; &lt;code&gt;abortWhenErrorCount&lt;/code&gt; la detiene tras un número dado de comprobaciones fallidas (comprobado el 21 de octubre de 2026). La página no indica un código de salida, por eso el ejemplo de arriba devuelve uno a partir del resultado. Nuestra guía de &lt;a href=&quot;https://loadtest.app/es/load-test-pass-fail-criteria/&quot;&gt;criterios de aprobación en pruebas de carga&lt;/a&gt; ayuda a elegir los límites.&lt;/p&gt;
&lt;h2&gt;¿Qué protocolos puede probar NBomber?&lt;/h2&gt;
&lt;p&gt;Cualquier protocolo que hable una biblioteca de .NET, porque NBomber solo cronometra el código que le das. Hay plugins listos para HTTP, WebSockets, MQTT y AMQP, además de una opción WebBrowser.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://nbomber.com/docs/getting-started/overview/&quot;&gt;página de introducción&lt;/a&gt; describe el framework como independiente del protocolo, y la página de precios incluye esos plugins en todos los planes, también en el gratuito. Eso abarca también las bases de datos y las colas de mensajes que llamas con sus propios clientes de .NET (comprobado el 21 de octubre de 2026). A cambio, fuera de los plugins tienes que escribir y mantener tú el código del cliente.&lt;/p&gt;
&lt;h2&gt;¿Cómo se escala una prueba de NBomber?&lt;/h2&gt;
&lt;p&gt;Con NBomber Cluster: un Coordinator orquesta la ejecución y los Agents ejecutan los escenarios, todos comunicados a través de un broker de mensajes NATS. Cluster forma parte de la licencia Enterprise.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://nbomber.com/docs/cluster/overview/&quot;&gt;introducción al clúster&lt;/a&gt; explica los roles, y la página de licencia indica que los desarrolladores pueden probarlo en local con un Local Dev Cluster antes de comprar; la &lt;a href=&quot;https://nbomber.com/docs/cluster/local-dev-cluster/&quot;&gt;página del Local Dev Cluster&lt;/a&gt; lo limita a 1 Coordinator y 2 Agents y detiene cada ejecución al cabo de un minuto (comprobado el 21 de octubre de 2026). La integración con Kubernetes de NBomber Studio, también exclusiva de Enterprise, prepara por ti NATS y los pods de los Agents. Sin Cluster, un proceso de NBomber corre en una sola máquina; la &lt;a href=&quot;https://nbomber.com/docs/getting-started/system-requirements/&quot;&gt;página de requisitos del sistema&lt;/a&gt; recomienda de 4 a 8 núcleos de CPU para carga alta.&lt;/p&gt;
&lt;p&gt;LoadFocus, que publica este sitio, no ejecuta pruebas de NBomber. &lt;a href=&quot;https://loadfocus.com/es-es/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=nbomber-load-testing&quot;&gt;Ejecuta planes de prueba JMeter y scripts de k6&lt;/a&gt; desde 25 regiones en la nube.&lt;/p&gt;
&lt;h2&gt;¿Qué hace bien NBomber y dónde están sus límites?&lt;/h2&gt;
&lt;p&gt;Es fuerte para equipos .NET: las pruebas son código C# o F#, cualquier cliente de .NET se convierte en una prueba de carga y los dos modelos de carga vienen integrados. Sus límites son la licencia para empresas, un ecosistema de un solo lenguaje y las ejecuciones distribuidas de pago.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Las pruebas viven junto al código de la aplicación, con el mismo IDE, los mismos paquetes y las mismas revisiones.&lt;/li&gt;
&lt;li&gt;Los umbrales vienen integrados, y las aserciones se ejecutan dentro de las pruebas de xUnit o NUnit que ya tienes.&lt;/li&gt;
&lt;li&gt;El uso comercial requiere licencia, incluso para un solo desarrollador.&lt;/li&gt;
&lt;li&gt;Las ejecuciones distribuidas requieren Enterprise y un broker NATS.&lt;/li&gt;
&lt;li&gt;Quien no conozca .NET tendrá que aprender antes C# o F#.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;¿Cuándo elegir k6, Gatling o JMeter en lugar de NBomber?&lt;/h2&gt;
&lt;p&gt;Elige otra herramienta cuando tu equipo no programe en .NET o cuando el coste de la licencia no encaje.&lt;/p&gt;
&lt;p&gt;Elige &lt;strong&gt;k6&lt;/strong&gt; si quieres scripts en JavaScript y una herramienta open source sin coste de licencia para uso en empresa: su &lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;repositorio&lt;/a&gt; tiene licencia AGPL-3.0 (comprobado el 21 de octubre de 2026). LoadFocus &lt;a href=&quot;https://loadfocus.com/es-es/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=nbomber-load-testing&quot;&gt;ejecuta scripts de k6&lt;/a&gt; desde 25 regiones en la nube, aunque lanza los escenarios arrival-rate con un número fijo de usuarios. Elige &lt;strong&gt;Gatling&lt;/strong&gt; para una herramienta de código sobre la JVM; nuestro &lt;a href=&quot;https://loadtest.app/es/gatling-load-testing/&quot;&gt;análisis de Gatling&lt;/a&gt; la cubre. Elige &lt;strong&gt;JMeter&lt;/strong&gt; si tus testers prefieren una interfaz gráfica o necesitas samplers JDBC, JMS o LDAP de serie. El repaso de &lt;a href=&quot;https://loadtest.app/es/open-source-load-testing-tools/&quot;&gt;herramientas de pruebas de carga open source&lt;/a&gt; las compara.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿NBomber es gratis para uso comercial?&lt;/strong&gt;
No. NBomber solo es gratis para uso personal y académico. Una empresa necesita una licencia Business de 1.500 $ al año o una licencia Enterprise de 2.500 $ al año.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué versiones de .NET admite NBomber?&lt;/strong&gt;
Apunta a .NET Standard 2.1, así que funciona en .NET Core 3.0 y en todas las versiones de .NET posteriores. La documentación recomienda .NET 10.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede LoadFocus ejecutar pruebas de NBomber?&lt;/strong&gt;
No. LoadFocus ejecuta planes de prueba JMeter y scripts de k6. Para ejecutar NBomber en más de una máquina, usa NBomber Cluster, que requiere una licencia Enterprise.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-load-testing/&quot;&gt;Pruebas de carga con Gatling: la herramienta JVM a fondo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-source-load-testing-tools/&quot;&gt;Herramientas de pruebas de carga open source: seis opciones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;Modelo de carga abierto vs cerrado: cuál usar y cuándo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/load-test-pass-fail-criteria/&quot;&gt;Criterios de aprobación en pruebas de carga: cómo fijarlos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/tsung-load-testing/&quot;&gt;Pruebas de carga con Tsung: la herramienta Erlang a fondo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Pruebas de carga con Tsung: la herramienta Erlang a fondo</title><link>https://loadtest.app/es/tsung-load-testing/</link><guid isPermaLink="true">https://loadtest.app/es/tsung-load-testing/</guid><description>Pruebas de carga con Tsung: escenarios XML, fases de llegada, plugins HTTP, XMPP, bases de datos y MQTT, clientes distribuidos y su última versión (2023).</description><pubDate>Wed, 21 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, que vende un servicio de pruebas de carga que aparece en este artículo.&lt;/p&gt;&lt;p&gt;Tsung es una herramienta de pruebas de carga open source escrita en Erlang que describe cada prueba en un archivo XML y puede repartir la carga entre muchas máquinas cliente. Las pruebas de carga con Tsung siguen teniendo sentido para protocolos que cubren pocas herramientas, como XMPP, LDAP o PostgreSQL a nivel de protocolo, y para muchísimos usuarios con hardware modesto. La última versión de Tsung salió en marzo de 2023, así que para pruebas nuevas de HTTP o de API a la mayoría de los equipos les irá mejor con k6, Gatling o JMeter.&lt;/p&gt;
&lt;p&gt;No hemos ejecutado Tsung para este análisis. Los datos salen de la documentación y del repositorio de GitHub de Tsung, comprobados el 21 de octubre de 2026, y las valoraciones son nuestras.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tema&lt;/th&gt;
&lt;th&gt;Tsung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licencia&lt;/td&gt;
&lt;td&gt;GPL-2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escrito en&lt;/td&gt;
&lt;td&gt;Erlang (requiere Erlang/OTP R16B03 o posterior)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Última versión&lt;/td&gt;
&lt;td&gt;1.8.0 (2 de marzo de 2023)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pruebas escritas como&lt;/td&gt;
&lt;td&gt;Archivos de configuración XML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modelo de carga&lt;/td&gt;
&lt;td&gt;Usuarios nuevos por fase de llegada (abierto)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocolos&lt;/td&gt;
&lt;td&gt;HTTP, WebDAV, XMPP, PostgreSQL, MySQL, LDAP, WebSocket, AMQP, MQTT, TCP/UDP en bruto (algunos experimentales)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escalado&lt;/td&gt;
&lt;td&gt;Máquinas cliente por SSH sin contraseña&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Informes&lt;/td&gt;
&lt;td&gt;Panel en vivo en el puerto 8091, informe HTML con &lt;code&gt;tsung_stats.pl&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Quién mantiene Tsung y sigue activo el proyecto?&lt;/h2&gt;
&lt;p&gt;ProcessOne aloja el proyecto en GitHub con licencia GPL-2.0. Se mantiene, pero con poco movimiento: la última versión, la 1.8.0, es de marzo de 2023, y desde entonces solo llegan de vez en cuando pull requests fusionadas.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://github.com/processone/tsung&quot;&gt;repositorio&lt;/a&gt; muestra su último commit el 2 de marzo de 2026, una pull request que sustituye llamadas obsoletas, y el &lt;a href=&quot;https://github.com/processone/tsung/releases/tag/v1.8.0&quot;&gt;tag v1.8.0&lt;/a&gt; tiene fecha del 2 de marzo de 2023 (comprobado el 21 de octubre de 2026). La &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/&quot;&gt;documentación&lt;/a&gt; todavía lleva el título 1.7.0, así que revisa el repositorio cuando un detalle parezca desfasado. Un proyecto tranquilo también significa menos respuestas cuando algo sale mal.&lt;/p&gt;
&lt;h2&gt;¿Cómo funciona una prueba de Tsung?&lt;/h2&gt;
&lt;p&gt;Una prueba es un archivo XML con cuatro partes principales: las máquinas cliente, los servidores de destino, las fases de carga y las sesiones de usuario. Cada usuario nuevo elige una sesión según su probabilidad y ejecuta sus peticiones en orden.&lt;/p&gt;
&lt;p&gt;Este fragmento lanza cinco usuarios nuevos por segundo durante diez minutos; cada uno carga una lista de productos, hace una pausa de unos dos segundos y envía una petición POST al carrito:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-xml&quot;&gt;&amp;lt;load&amp;gt;
  &amp;lt;arrivalphase phase=&amp;quot;1&amp;quot; duration=&amp;quot;10&amp;quot; unit=&amp;quot;minute&amp;quot;&amp;gt;
    &amp;lt;users arrivalrate=&amp;quot;5&amp;quot; unit=&amp;quot;second&amp;quot;/&amp;gt;
  &amp;lt;/arrivalphase&amp;gt;
&amp;lt;/load&amp;gt;
&amp;lt;sessions&amp;gt;
  &amp;lt;session name=&amp;quot;browse&amp;quot; probability=&amp;quot;100&amp;quot;
           type=&amp;quot;ts_http&amp;quot;&amp;gt;
    &amp;lt;request&amp;gt;&amp;lt;http url=&amp;quot;/products&amp;quot; method=&amp;quot;GET&amp;quot;/&amp;gt;&amp;lt;/request&amp;gt;
    &amp;lt;thinktime value=&amp;quot;2&amp;quot; random=&amp;quot;true&amp;quot;/&amp;gt;
    &amp;lt;request&amp;gt;&amp;lt;http url=&amp;quot;/cart&amp;quot; method=&amp;quot;POST&amp;quot;
                   contents=&amp;quot;sku=A-100&amp;quot;/&amp;gt;&amp;lt;/request&amp;gt;
  &amp;lt;/session&amp;gt;
&amp;lt;/sessions&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/conf-sessions.html&quot;&gt;página de sesiones&lt;/a&gt; dice que las probabilidades de las sesiones deben sumar 100 (desde la 1.5.0 también valen pesos) y que un tiempo de reflexión aleatorio sigue una distribución exponencial alrededor de su valor, salvo que indiques un rango con &lt;code&gt;min&lt;/code&gt; y &lt;code&gt;max&lt;/code&gt; (comprobado el 21 de octubre de 2026). Para HTTP y PostgreSQL hay un grabador proxy que convierte una sesión de navegador o de cliente en este XML.&lt;/p&gt;
&lt;h2&gt;¿Qué modelo de carga usa Tsung?&lt;/h2&gt;
&lt;p&gt;Un modelo de carga abierto. Cada fase de llegada lanza usuarios nuevos a un intervalo o una tasa fijos, hagan lo que hagan los usuarios que ya están en marcha, y una fase termina cuando se acaba su tiempo aunque sus sesiones no hayan terminado.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/conf-load.html&quot;&gt;página de carga&lt;/a&gt; recoge los controles: &lt;code&gt;interarrival&lt;/code&gt; o &lt;code&gt;arrivalrate&lt;/code&gt; por fase, &lt;code&gt;maxnumber&lt;/code&gt; para limitar los usuarios que lanza una fase, un atributo &lt;code&gt;duration&lt;/code&gt; sobre toda la carga para detener la prueba a una hora fija, y &lt;code&gt;wait_all_sessions_end&lt;/code&gt; para que la fase siguiente espere a que terminen los usuarios actuales (comprobado el 21 de octubre de 2026). Nuestros artículos sobre el &lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;modelo de carga abierto vs cerrado&lt;/a&gt; y sobre el &lt;a href=&quot;https://loadtest.app/es/think-time-in-load-testing/&quot;&gt;tiempo de reflexión&lt;/a&gt; explican cómo esas decisiones cambian lo que mide una prueba.&lt;/p&gt;
&lt;h2&gt;¿Qué protocolos puede probar Tsung?&lt;/h2&gt;
&lt;p&gt;Más que la mayoría de las herramientas de pruebas de carga: HTTP (incluido SOAP), WebDAV, XMPP, PostgreSQL, MySQL, LDAP, WebSocket, AMQP, MQTT y TCP, UDP o SSL en bruto. La documentación marca como experimentales los plugins de MySQL, WebSocket, AMQP y MQTT, con AMQP solo en 0.9.1 y MQTT solo en 3.1.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/features.html&quot;&gt;página de funciones&lt;/a&gt; describe cada plugin (comprobado el 21 de octubre de 2026). En XMPP y PostgreSQL Tsung lleva mucho tiempo con pocos rivales: habla el protocolo por sí mismo, así que pruebas el servidor y no una biblioteca cliente. Para aplicaciones en tiempo real, nuestro repaso de &lt;a href=&quot;https://loadtest.app/es/websocket-load-testing-tools/&quot;&gt;herramientas de pruebas de carga WebSocket&lt;/a&gt; pone a Tsung junto a opciones más recientes.&lt;/p&gt;
&lt;h2&gt;¿Cómo se reparte una prueba de Tsung entre varias máquinas?&lt;/h2&gt;
&lt;p&gt;Enumeras las máquinas cliente en el XML, y el controlador lanza la carga en ellas por SSH sin contraseña, o por rsh. A cada cliente se le puede dar un peso, un límite de usuarios y un número de CPU.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/conf-client-server.html&quot;&gt;página de clientes y servidor&lt;/a&gt; explica que Tsung ejecuta una máquina virtual de Erlang por cada CPU que declares con &lt;code&gt;cpu&lt;/code&gt; en cada cliente (una por defecto) y arranca una nueva cuando una VM llega a &lt;code&gt;maxusers&lt;/code&gt;. También puede tomar las máquinas cliente de un planificador de lotes como PBS, LSF u OAR. La &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/installation.html&quot;&gt;página de instalación&lt;/a&gt; pide Erlang/OTP R16B03 o posterior y, de forma opcional, Perl 5 y gnuplot, o Python y matplotlib, para los gráficos (comprobado el 21 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;LoadFocus, que publica este sitio, no ejecuta archivos de Tsung. &lt;a href=&quot;https://loadfocus.com/es-es/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tsung-load-testing&quot;&gt;Ejecuta planes de prueba JMeter&lt;/a&gt; y scripts de k6 desde 25 regiones en la nube.&lt;/p&gt;
&lt;h2&gt;¿Cómo se leen los resultados de Tsung?&lt;/h2&gt;
&lt;p&gt;De dos maneras: con un panel en vivo que sirve el controlador en el puerto 8091 y con un informe HTML que genera el script &lt;code&gt;tsung_stats.pl&lt;/code&gt; después de la ejecución.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://tsung.readthedocs.io/en/latest/reports.html&quot;&gt;página de informes&lt;/a&gt; dice que el panel existe desde la 1.6.0, muestra el estado actual, construye los gráficos mientras corre la prueba y se detiene cuando la prueba termina, salvo que arranques Tsung con &lt;code&gt;-k&lt;/code&gt; (comprobado el 21 de octubre de 2026). El informe cubre tiempos de respuesta y de conexión, transacciones, peticiones por segundo y códigos de error, y puede incluir datos de CPU, memoria y red de los servidores, recogidos con agentes de Erlang, SNMP o munin. La documentación no describe ningún umbral de aprobación, así que un pipeline de CI tiene que analizar los resultados por su cuenta; nuestra guía de &lt;a href=&quot;https://loadtest.app/es/load-test-pass-fail-criteria/&quot;&gt;criterios de aprobación en pruebas de carga&lt;/a&gt; explica qué revisar.&lt;/p&gt;
&lt;h2&gt;¿Qué hace bien Tsung y dónde están sus límites?&lt;/h2&gt;
&lt;p&gt;Es fuerte en variedad de protocolos, fases de llegada abiertas y muchos usuarios por máquina, que la documentación cifra en miles por CPU. Sus límites son un historial de versiones con poco movimiento, scripts solo en XML y ninguna comprobación de aprobación integrada.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pruebas de XMPP, LDAP y bases de datos a nivel de protocolo, sin escribir código cliente.&lt;/li&gt;
&lt;li&gt;Reparto por SSH sin más, sin broker ni servicio adicional.&lt;/li&gt;
&lt;li&gt;Monitorización de los servidores en el mismo informe.&lt;/li&gt;
&lt;li&gt;Cualquier lógica más allá del XML exige Erlang, que pocos equipos escriben.&lt;/li&gt;
&lt;li&gt;Erlang tiene que estar instalado en el controlador y en cada cliente.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;¿Cuándo elegir k6, Gatling o JMeter en lugar de Tsung?&lt;/h2&gt;
&lt;p&gt;Elige otra herramienta cuando pruebes HTTP o API y quieras un proyecto activo con scripts en un lenguaje habitual.&lt;/p&gt;
&lt;p&gt;Elige &lt;strong&gt;k6&lt;/strong&gt; para scripts en JavaScript con &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;umbrales&lt;/a&gt; dentro del propio script y un proyecto activo (comprobado el 21 de octubre de 2026). Elige &lt;strong&gt;Gatling&lt;/strong&gt; para simulaciones basadas en código sobre la JVM; nuestro &lt;a href=&quot;https://loadtest.app/es/gatling-load-testing/&quot;&gt;análisis de Gatling&lt;/a&gt; lo explica a fondo. Elige &lt;strong&gt;JMeter&lt;/strong&gt; si tus testers quieren una interfaz gráfica o necesitas samplers JDBC, JMS o LDAP con un gran ecosistema de plugins. LoadFocus &lt;a href=&quot;https://loadfocus.com/es-es/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tsung-load-testing&quot;&gt;ejecuta JMeter y k6&lt;/a&gt; desde 25 regiones en la nube, y el repaso de &lt;a href=&quot;https://loadtest.app/es/open-source-load-testing-tools/&quot;&gt;herramientas de pruebas de carga open source&lt;/a&gt; compara estas herramientas.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Tsung sigue teniendo mantenimiento?&lt;/strong&gt;
Sí, aunque con poco movimiento. La última versión, la 1.8.0, salió el 2 de marzo de 2023, y el repositorio todavía recibe de vez en cuando cambios fusionados, el último en marzo de 2026.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué protocolos admite Tsung?&lt;/strong&gt;
HTTP y SOAP, WebDAV, XMPP, PostgreSQL, LDAP y TCP, UDP o SSL en bruto, además de MySQL, WebSocket, AMQP y MQTT, que la documentación marca como experimentales.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede LoadFocus ejecutar pruebas de Tsung?&lt;/strong&gt;
No. LoadFocus ejecuta planes de prueba JMeter y scripts de k6. Para repartir una prueba de Tsung entre varias máquinas, enuméralas como clientes en el archivo XML.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/websocket-load-testing-tools/&quot;&gt;Herramientas de pruebas de carga WebSocket: seis opciones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-source-load-testing-tools/&quot;&gt;Herramientas de pruebas de carga open source: seis opciones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;Modelo de carga abierto vs cerrado: cuál usar y cuándo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-load-testing/&quot;&gt;Pruebas de carga con Gatling: la herramienta JVM a fondo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/nbomber-load-testing/&quot;&gt;Pruebas de carga con NBomber: análisis del framework .NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/pgbench/&quot;&gt;pgbench: benchmark y pruebas de carga de PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/sysbench/&quot;&gt;Cómo usar sysbench: benchmarks de CPU, disco y MySQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Puntuación Apdex: qué es y cómo se calcula</title><link>https://loadtest.app/es/apdex-score/</link><guid isPermaLink="true">https://loadtest.app/es/apdex-score/</guid><description>La puntuación Apdex explicada: la fórmula, cómo elegir el umbral T, un ejemplo numérico y cómo la calculan JMeter, Artillery y LoadFocus en una prueba.</description><pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, un servicio de pruebas de carga mencionado en este artículo.&lt;/p&gt;&lt;p&gt;Una puntuación Apdex es un número entre 0 y 1 que indica qué parte de las peticiones fue lo bastante rápida para quien las esperaba. Eliges un tiempo objetivo T: las respuestas hasta T cuentan entero, las que llegan hasta cuatro veces T cuentan la mitad y las más lentas cuentan cero. Un resultado de 1 significa que todas las peticiones cumplieron el objetivo, y 0 que todas fueron demasiado lentas.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Zona&lt;/th&gt;
&lt;th&gt;Tiempo de respuesta&lt;/th&gt;
&lt;th&gt;Peso en la puntuación&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Satisfecho (satisfied)&lt;/td&gt;
&lt;td&gt;hasta T&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tolerable (tolerating)&lt;/td&gt;
&lt;td&gt;más de T, hasta 4T&lt;/td&gt;
&lt;td&gt;0,5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frustrado (frustrated)&lt;/td&gt;
&lt;td&gt;más de 4T&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Los datos de abajo salen de la documentación y del código fuente de las herramientas, comprobados el 19 de octubre de 2026.&lt;/p&gt;
&lt;h2&gt;¿Cómo se calcula una puntuación Apdex?&lt;/h2&gt;
&lt;p&gt;Suma las peticiones satisfechas y la mitad de las tolerables, y divide entre el total. El resultado siempre queda entre 0 y 1.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Apdex(T) = (satisfied + tolerating / 2) / total
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.newrelic.com/docs/apm/new-relic-apm/apdex/apdex-measuring-user-satisfaction/&quot;&gt;documentación de Apdex de New Relic&lt;/a&gt; resuelve un ejemplo con T en 500 ms: de 200 peticiones, 170 terminaron en 500 ms o menos, 20 tardaron entre 500 ms y 2 segundos, y 10 fallaron o tardaron más. Eso da (170 + 20 / 2) / 200 = 0,90 (comprobado el 19 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;Un segundo ejemplo muestra por qué la puntuación sirve en una prueba de carga. Supón una ejecución de 10.000 peticiones con T en 300 ms: 8.200 terminan en 300 ms, 1.300 entre 300 ms y 1,2 segundos, y 500 tardan más. El Apdex es (8.200 + 650) / 10.000 = 0,885. La misma ejecución puede mostrar sin problema una media de 280 ms, que por sí sola parece bien y esconde las 500 peticiones de más de un segundo.&lt;/p&gt;
&lt;h2&gt;¿De dónde viene Apdex?&lt;/h2&gt;
&lt;p&gt;Apdex, abreviatura de Application Performance Index, es un estándar abierto de un grupo de empresas llamado Apdex Alliance. Peter Sevcik, de NetForecast, fundó la Alliance en 2004.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://en.wikipedia.org/wiki/Apdex&quot;&gt;artículo de Wikipedia sobre Apdex&lt;/a&gt; cita el artículo de Sevcik de 2005 y recoge la regla de 4T. El &lt;a href=&quot;https://www.apdex.org/&quot;&gt;Apdex Users Group&lt;/a&gt; dice ahora que las reglas de los umbrales T y F «se han vuelto flexibles» (comprobado el 19 de octubre de 2026), y las herramientas aprovechan esa libertad.&lt;/p&gt;
&lt;h2&gt;¿Cómo la calculan JMeter, Artillery y LoadFocus?&lt;/h2&gt;
&lt;p&gt;Las tres parten de T = 500 ms. Se diferencian en dónde termina la zona tolerable y en qué hacen con las peticiones fallidas, así que una misma ejecución puede dar tres valores algo distintos.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Herramienta&lt;/th&gt;
&lt;th&gt;T por defecto&lt;/th&gt;
&lt;th&gt;Tolerable hasta&lt;/th&gt;
&lt;th&gt;Peticiones fallidas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Panel HTML de JMeter&lt;/td&gt;
&lt;td&gt;500 ms&lt;/td&gt;
&lt;td&gt;1.500 ms&lt;/td&gt;
&lt;td&gt;cuentan como frustradas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plugin &lt;code&gt;apdex&lt;/code&gt; de Artillery&lt;/td&gt;
&lt;td&gt;500 ms&lt;/td&gt;
&lt;td&gt;4T (2.000 ms)&lt;/td&gt;
&lt;td&gt;solo se puntúan las respuestas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Página de resultados de LoadFocus&lt;/td&gt;
&lt;td&gt;500 ms, fijo&lt;/td&gt;
&lt;td&gt;4T (2.000 ms)&lt;/td&gt;
&lt;td&gt;se clasifican por tiempo de respuesta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New Relic APM&lt;/td&gt;
&lt;td&gt;se fija por aplicación&lt;/td&gt;
&lt;td&gt;4T&lt;/td&gt;
&lt;td&gt;los errores de servidor son frustrados&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;JMeter.&lt;/strong&gt; El &lt;a href=&quot;https://jmeter.apache.org/usermanual/generating-dashboard.html&quot;&gt;informe del panel&lt;/a&gt; incluye una tabla APDEX por transacción. Sus valores por defecto son &lt;code&gt;jmeter.reportgenerator.apdex_satisfied_threshold=500&lt;/code&gt; y &lt;code&gt;apdex_tolerated_threshold=1500&lt;/code&gt;, así que la zona tolerable acaba en 3T salvo que la cambies, y &lt;code&gt;apdex_per_transaction&lt;/code&gt; fija umbrales distintos por sampler. En &lt;a href=&quot;https://github.com/apache/jmeter/blob/master/src/core/src/main/java/org/apache/jmeter/report/processor/ApdexSummaryConsumer.java&quot;&gt;&lt;code&gt;ApdexSummaryConsumer&lt;/code&gt;&lt;/a&gt; una muestra fallida suma al total y nunca a las satisfechas o tolerables, de modo que cada fallo baja la puntuación (comprobado el 19 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artillery.&lt;/strong&gt; El &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/apdex&quot;&gt;plugin apdex&lt;/a&gt; solo funciona con el motor HTTP y publica los contadores &lt;code&gt;apdex.satisfied&lt;/code&gt;, &lt;code&gt;apdex.tolerated&lt;/code&gt; y &lt;code&gt;apdex.frustrated&lt;/code&gt;. Su código en &lt;a href=&quot;https://github.com/artilleryio/artillery/tree/main/packages/artillery-plugin-apdex&quot;&gt;artillery-plugin-apdex 1.24.0&lt;/a&gt; clasifica cada respuesta por su tiempo total frente a T y 4T, y luego imprime la puntuación con una etiqueta: excellent desde 0,94, good desde 0,85, fair desde 0,70, poor desde 0,49 y unacceptable por debajo. Una petición que nunca recibe respuesta nunca se puntúa (comprobado el 19 de octubre de 2026). Nuestro &lt;a href=&quot;https://loadtest.app/es/artillery-load-testing/&quot;&gt;análisis de Artillery&lt;/a&gt; cubre la herramienta en sí.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus&lt;/strong&gt;, que publica este sitio, muestra la puntuación Apdex en la pestaña Insights del resultado de una prueba de carga, junto a un &lt;a href=&quot;https://loadfocus.com/docs/es-es/guides/load-testing/response-time-distribution?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=apdex-score&quot;&gt;histograma de tiempos de respuesta&lt;/a&gt;. T está fijo en 500 ms y la zona tolerable acaba en 2.000 ms; T no se puede cambiar. Cada muestra se clasifica por su tiempo de respuesta, con las partes satisfecha, tolerable y frustrada junto a la puntuación.&lt;/p&gt;
&lt;h2&gt;¿Cómo se elige el umbral T?&lt;/h2&gt;
&lt;p&gt;Elige T según lo que esperan los usuarios de esa página o ese endpoint, y fíjalo por transacción si tu herramienta lo permite. Un único T para toda una aplicación mezcla un endpoint de búsqueda rápido y una exportación de informes lenta en un solo número.&lt;/p&gt;
&lt;p&gt;Algunas reglas prácticas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Parte de un objetivo real.&lt;/strong&gt; Si ya tienes un objetivo de latencia como «el 95 % de las llamadas de pago en menos de 400 ms», T = 400 ms hace que el Apdex y el objetivo cuenten lo mismo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mantén el mismo T entre ejecuciones.&lt;/strong&gt; Un Apdex solo se compara con otro medido con el mismo T. Escríbelo como Apdex(0.4) o «Apdex con T = 400 ms» para que nadie compare umbrales distintos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iguala también la zona tolerable.&lt;/strong&gt; El valor por defecto de JMeter acaba en 3T y los demás en 4T. Antes de comparar un informe de JMeter con otra herramienta, pon &lt;code&gt;apdex_tolerated_threshold&lt;/code&gt; en cuatro veces T.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No ajustes T para que una versión apruebe.&lt;/strong&gt; Mover T después de una mala ejecución cambia la regla de medir, y la tendencia que seguías desaparece.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;¿Qué es una buena puntuación Apdex?&lt;/h2&gt;
&lt;p&gt;El plugin de Artillery llama &lt;code&gt;excellent&lt;/code&gt; a 0,94 o más, &lt;code&gt;good&lt;/code&gt; a 0,85-0,94 y &lt;code&gt;poor&lt;/code&gt; o peor a todo lo que queda bajo 0,70. Esas etiquetas solo significan algo si T se eligió con honestidad.&lt;/p&gt;
&lt;p&gt;Un Apdex de 0,95 con T = 2 segundos puede describir un servicio más lento que un 0,80 con T = 200 ms. Cuando fijes un criterio para publicar una versión, escribe el umbral y la puntuación juntos («Apdex(0.5) de al menos 0,9») y compruébalo junto a un límite de percentil, porque cada uno detecta problemas distintos.&lt;/p&gt;
&lt;h2&gt;¿Qué oculta Apdex?&lt;/h2&gt;
&lt;p&gt;Comprime toda la distribución de tiempos de respuesta en tres franjas, así que no puede decir cuán lentas fueron las peticiones frustradas. Una petición de 2,1 segundos y otra de 30 segundos bajan la puntuación exactamente lo mismo.&lt;/p&gt;
&lt;p&gt;Por eso funciona mejor junto a otros números:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Los percentiles&lt;/strong&gt; muestran cuán lentas son las peticiones lentas. Nuestra guía sobre la &lt;a href=&quot;https://loadtest.app/es/tail-latency/&quot;&gt;latencia de cola&lt;/a&gt; explica por qué el percentil 99 importa en cuanto una página llama a varios servicios.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La tasa de errores&lt;/strong&gt; detecta fallos que tu herramienta quizá no puntúe. Artillery nunca puntúa peticiones sin respuesta y New Relic cuenta los errores de servidor como frustrados, así que lee el número de errores aparte.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El tamaño de la muestra&lt;/strong&gt; importa: New Relic advierte que por debajo de unas 100 peticiones por minuto la puntuación es inestable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El sesgo de medición&lt;/strong&gt; también cuenta. Un generador de carga que espera las respuestas lentas envía menos peticiones en los periodos lentos, y el Apdex parece mejor que la realidad; consulta la &lt;a href=&quot;https://loadtest.app/es/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;¿Cómo se usa Apdex en una prueba de carga?&lt;/h2&gt;
&lt;p&gt;Úsalo como resumen para quien no va a leer un histograma, y deja la decisión de aprobar o suspender en límites explícitos.&lt;/p&gt;
&lt;p&gt;Una rutina que funciona:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fija T por transacción clave a partir de tu objetivo de latencia.&lt;/li&gt;
&lt;li&gt;Ejecuta la prueba y anota el Apdex con ese T, junto con los percentiles 95 y 99 y la tasa de errores.&lt;/li&gt;
&lt;li&gt;Compara el Apdex con la ejecución anterior con el mismo T. Una caída de 0,93 a 0,86 es una señal clara incluso para alguien de fuera del equipo.&lt;/li&gt;
&lt;li&gt;Haz fallar el build con límites de percentil y de errores, como explica nuestra guía de &lt;a href=&quot;https://loadtest.app/es/load-test-pass-fail-criteria/&quot;&gt;criterios de aprobación en pruebas de carga&lt;/a&gt;, e informa del Apdex al lado.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Una puntuación Apdex más alta es mejor?&lt;/strong&gt;
Sí. 1,0 significa que todas las peticiones terminaron dentro de T, y 0 que todas superaron el límite tolerable o contaron como frustradas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuál es el umbral Apdex por defecto en JMeter?&lt;/strong&gt;
El panel HTML usa 500 ms para satisfecho y 1.500 ms para tolerable. Se cambian con &lt;code&gt;jmeter.reportgenerator.apdex_satisfied_threshold&lt;/code&gt; y &lt;code&gt;apdex_tolerated_threshold&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Apdex incluye los errores?&lt;/strong&gt;
Depende de la herramienta. JMeter cuenta las muestras fallidas como frustradas y New Relic hace lo mismo con los errores de servidor, mientras que el plugin de Artillery solo puntúa las peticiones que recibieron respuesta.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puedo comparar puntuaciones Apdex de dos herramientas?&lt;/strong&gt;
Solo si coinciden T, el límite tolerable y el tratamiento de los errores. Si no, compara mejor los percentiles y las tasas de errores de base.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/tail-latency/&quot;&gt;Latencia de cola: qué es y cómo medirla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/load-test-pass-fail-criteria/&quot;&gt;Criterios de aprobación en pruebas de carga: cómo fijarlos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/coordinated-omission/&quot;&gt;Coordinated omission: qué es y cómo evitarla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/throughput-vs-latency/&quot;&gt;Rendimiento vs latencia: cómo se relacionan bajo carga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/artillery-load-testing/&quot;&gt;Pruebas de carga con Artillery: análisis de la herramienta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/slo-vs-sla/&quot;&gt;SLO vs SLA: diferencia, SLI y presupuesto de error&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Pruebas de carga con Artillery: análisis de la herramienta</title><link>https://loadtest.app/es/artillery-load-testing/</link><guid isPermaLink="true">https://loadtest.app/es/artillery-load-testing/</guid><description>Pruebas de carga con Artillery: scripts YAML y TypeScript, fases de llegada, Playwright, comprobaciones ensure, ejecuciones en AWS y Azure, y precios.</description><pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, que vende un servicio de pruebas de carga que aparece en este artículo.&lt;/p&gt;&lt;p&gt;Artillery es una herramienta de pruebas de carga open source que corre sobre Node.js y describe cada prueba en un archivo YAML, TypeScript o JavaScript. Las pruebas de carga con Artillery encajan con equipos que viven en el ecosistema JavaScript, que quieren que lleguen usuarios nuevos a un ritmo fijo o que quieren pruebas de navegador con Playwright en la misma herramienta. A los equipos que quieren un único binario sin runtime les va mejor k6, y a los que necesitan muchos protocolos de serie, JMeter.&lt;/p&gt;
&lt;p&gt;No hemos ejecutado Artillery para este análisis. Los datos salen de la documentación, el repositorio, el paquete de npm y la página de precios de Artillery, comprobados el 19 de octubre de 2026, y las valoraciones son nuestras.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tema&lt;/th&gt;
&lt;th&gt;Artillery&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licencia&lt;/td&gt;
&lt;td&gt;MPL-2.0; algunos módulos de Azure bajo BSL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;Node.js, última LTS (el paquete pide 22.18.0 o posterior)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versión actual&lt;/td&gt;
&lt;td&gt;2.0.34 (14 de agosto de 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pruebas escritas en&lt;/td&gt;
&lt;td&gt;YAML, TypeScript o JavaScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modelo de carga&lt;/td&gt;
&lt;td&gt;Usuarios virtuales nuevos por segundo, por fases&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Motores integrados&lt;/td&gt;
&lt;td&gt;HTTP, WebSocket, Socket.IO, Playwright&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comprobaciones de aprobación&lt;/td&gt;
&lt;td&gt;Plugin &lt;code&gt;ensure&lt;/code&gt;, código de salida distinto de cero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escalado&lt;/td&gt;
&lt;td&gt;&lt;code&gt;run-lambda&lt;/code&gt;, &lt;code&gt;run-fargate&lt;/code&gt;, &lt;code&gt;run-aci&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Informes alojados&lt;/td&gt;
&lt;td&gt;Artillery Cloud, opcional, con nivel gratuito&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Quién desarrolla Artillery y con qué licencia?&lt;/h2&gt;
&lt;p&gt;Lo mantiene Artillery Software Inc. en GitHub. Casi todo el código está bajo MPL-2.0, que permite el uso comercial; algunos módulos específicos de Azure están bajo la Business Source License.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://github.com/artilleryio/artillery&quot;&gt;README del repositorio&lt;/a&gt; permite usar Artillery en Azure para evaluación y pruebas de concepto, y exige una licencia comercial para el uso comercial o en producción allí. La última versión es la &lt;a href=&quot;https://github.com/artilleryio/artillery/releases/tag/artillery-2.0.34&quot;&gt;2.0.34&lt;/a&gt;, publicada en npm el 14 de agosto de 2026, y sus metadatos piden Node.js 22.18.0 o posterior; la &lt;a href=&quot;https://www.artillery.io/docs/get-started/get-artillery&quot;&gt;guía de instalación&lt;/a&gt; recomienda la versión LTS más reciente (comprobado el 19 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo funciona un script de prueba de Artillery?&lt;/h2&gt;
&lt;p&gt;Un script tiene dos partes: &lt;code&gt;config&lt;/code&gt;, que fija el destino, las fases de carga y los plugins, y &lt;code&gt;scenarios&lt;/code&gt;, que enumera lo que hace cada usuario virtual. Puedes escribirlo en YAML o exportar &lt;code&gt;config&lt;/code&gt; y &lt;code&gt;scenarios&lt;/code&gt; desde un archivo TypeScript o JavaScript.&lt;/p&gt;
&lt;p&gt;Esta prueba sube de 5 a 50 usuarios nuevos por segundo en dos minutos, mantiene 50 por segundo durante diez minutos y falla si el percentil 99 del tiempo de respuesta llega a 800 ms:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;config:
  target: https://staging.example.com
  phases:
    - duration: 120
      arrivalRate: 5
      rampTo: 50
      name: ramp
    - duration: 600
      arrivalRate: 50
      name: sustain
  plugins:
    ensure:
      thresholds:
        - http.response_time.p99: 800
scenarios:
  - name: browse and add to cart
    flow:
      - get:
          url: /products
      - think: 2
      - post:
          url: /cart
          json:
            sku: A-100
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Según la &lt;a href=&quot;https://www.artillery.io/docs/reference/test-script&quot;&gt;referencia de scripts de prueba&lt;/a&gt;, los cuatro tipos de fase son una tasa de llegada constante, una rampa lineal con &lt;code&gt;rampTo&lt;/code&gt;, un &lt;code&gt;arrivalCount&lt;/code&gt; fijo repartido en un periodo y una &lt;code&gt;pause&lt;/code&gt;. El código propio cargado con &lt;code&gt;config.processor&lt;/code&gt; puede ser un módulo TypeScript en local y en Fargate, pero no en Lambda (comprobado el 19 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Qué modelo de carga usa Artillery?&lt;/h2&gt;
&lt;p&gt;Artillery lanza usuarios virtuales nuevos al ritmo que fijes, hayan terminado o no los anteriores. Es un modelo de carga abierto, que mantiene las llegadas aunque el sistema se vuelva lento.&lt;/p&gt;
&lt;p&gt;Cada usuario nuevo elige un escenario, lo ejecuta y se va, así que un sistema lento acumula usuarios como lo haría el tráfico real. &lt;code&gt;maxVusers&lt;/code&gt; limita el número de usuarios simultáneos de una fase si necesitas proteger el generador de carga. Nuestro artículo sobre el &lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;modelo de carga abierto vs cerrado&lt;/a&gt; explica la diferencia, y la &lt;a href=&quot;https://loadtest.app/es/littles-law-load-testing/&quot;&gt;ley de Little&lt;/a&gt; muestra cómo la tasa de llegada y el tiempo de respuesta fijan el número de usuarios simultáneos.&lt;/p&gt;
&lt;h2&gt;¿Qué protocolos y navegadores puede probar?&lt;/h2&gt;
&lt;p&gt;HTTP es el motor por defecto, y WebSocket, Socket.IO y Playwright vienen integrados. gRPC y AWS Kinesis necesitan motores que se instalan aparte.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://www.artillery.io/docs/reference/engines&quot;&gt;página de motores&lt;/a&gt; describe el modelo: cada escenario corre en un motor, y puedes escribir el tuyo. En npm, &lt;code&gt;artillery-engine-grpc&lt;/code&gt; va por la 0.0.9 y &lt;code&gt;artillery-engine-kinesis&lt;/code&gt; por la 1.1.1, ambos bajo MPL-2.0. El &lt;a href=&quot;https://www.artillery.io/docs/reference/engines/playwright&quot;&gt;motor de Playwright&lt;/a&gt; ejecuta tu código de Playwright en navegadores headless reales y publica Web Vitals como TTFB, FCP y LCP por página. La documentación avisa de que un navegador separado por usuario, en lugar de un contexto de navegador, necesita mucha más CPU y memoria (comprobado el 19 de octubre de 2026). Nuestro repaso de &lt;a href=&quot;https://loadtest.app/es/websocket-load-testing-tools/&quot;&gt;herramientas de pruebas de carga WebSocket&lt;/a&gt; sitúa a Artillery junto a otras opciones para aplicaciones en tiempo real.&lt;/p&gt;
&lt;h2&gt;¿Cómo encaja en la CI?&lt;/h2&gt;
&lt;p&gt;El plugin &lt;code&gt;ensure&lt;/code&gt; convierte métricas en comprobaciones de aprobación, y una comprobación fallida hace que Artillery termine con un código distinto de cero. Eso basta para que cualquier sistema de CI haga fallar el build.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/ensure&quot;&gt;referencia de ensure&lt;/a&gt; ofrece dos tipos de comprobación: &lt;code&gt;thresholds&lt;/code&gt;, donde una métrica debe quedar por debajo de un valor, y &lt;code&gt;conditions&lt;/code&gt;, que combinan métricas en una expresión como &lt;code&gt;http.response_time.p95 &amp;lt; 250 and http.request_rate &amp;gt; 1000&lt;/code&gt;. Una condición marcada con &lt;code&gt;strict: false&lt;/code&gt; avisa sin hacer fallar. El &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/apdex&quot;&gt;plugin apdex&lt;/a&gt; añade una puntuación Apdex a las pruebas HTTP, con un umbral por defecto de 500 ms (comprobado el 19 de octubre de 2026); nuestro artículo sobre la &lt;a href=&quot;https://loadtest.app/es/apdex-score/&quot;&gt;puntuación Apdex&lt;/a&gt; explica cómo leerla. Para un archivo de workflow, consulta nuestra guía de &lt;a href=&quot;https://loadtest.app/es/load-testing-in-github-actions/&quot;&gt;pruebas de carga en GitHub Actions&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;¿Cómo se escala una prueba de Artillery?&lt;/h2&gt;
&lt;p&gt;Desde la línea de comandos, en tu propia cuenta de nube: &lt;code&gt;run-lambda&lt;/code&gt; y &lt;code&gt;run-fargate&lt;/code&gt; en AWS, &lt;code&gt;run-aci&lt;/code&gt; en Azure Container Instances. Artillery crea los recursos que necesita la ejecución y borra después los temporales.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://www.artillery.io/docs/load-testing-at-scale/aws-fargate&quot;&gt;guía de Fargate&lt;/a&gt; enumera los recursos y los permisos de IAM implicados. La &lt;a href=&quot;https://www.artillery.io/docs/load-testing-at-scale/aws-lambda&quot;&gt;guía de Lambda&lt;/a&gt; indica sus límites: una prueba no puede durar más de 15 minutos, una prueba en marcha no se puede detener y los hooks &lt;code&gt;before&lt;/code&gt; y &lt;code&gt;after&lt;/code&gt; se ejecutan una vez por worker. La &lt;a href=&quot;https://www.artillery.io/docs/load-testing-at-scale/azure-aci&quot;&gt;guía de Azure&lt;/a&gt; exige Artillery 2.0.19 o posterior y, fuera de la evaluación, una suscripción (comprobado el 19 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;LoadFocus, que publica este sitio, no ejecuta scripts de Artillery. &lt;a href=&quot;https://loadfocus.com/es-es/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=artillery-load-testing&quot;&gt;Ejecuta planes de prueba JMeter y scripts de k6&lt;/a&gt; desde 25 regiones en la nube, así que para Artillery los comandos anteriores son la forma de escalar.&lt;/p&gt;
&lt;h2&gt;¿Cuánto cuesta Artillery Cloud?&lt;/h2&gt;
&lt;p&gt;El panel es opcional: los resultados solo llegan allí si ejecutas con &lt;code&gt;--record&lt;/code&gt; y una clave de API. Los planes van de un nivel gratuito a 499 $ al mes.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://www.artillery.io/pricing&quot;&gt;página de precios&lt;/a&gt; indica (comprobado el 19 de octubre de 2026):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Free:&lt;/strong&gt; 30 informes al mes, 1 mes de conservación, 2 miembros, pruebas distribuidas de hasta 5 workers y 30 minutos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Team, 199 $ al mes:&lt;/strong&gt; 1.000 informes, 6 meses, 8 miembros, hasta 25 workers y 2 horas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Business, 499 $ al mes:&lt;/strong&gt; 2.500 informes, 18 meses, sin límite de miembros, workers ni duración.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El SSO empresarial, los registros de auditoría y los SLA de soporte empiezan en 1.199 $ al mes, y la facturación anual ahorra un 20 %.&lt;/p&gt;
&lt;h2&gt;¿Qué hace bien Artillery y dónde están sus límites?&lt;/h2&gt;
&lt;p&gt;Destaca en carga por tasa de llegada, scripts cortos y legibles y pruebas de navegador con Playwright. Flojea cuando necesitas un único binario, muchos protocolos sin complementos o usar Azure sin licencia.&lt;/p&gt;
&lt;p&gt;Como herramienta de Node.js puede usar cualquier módulo de npm en funciones propias, a cambio de un runtime más en cada máquina de pruebas. Límites que la propia documentación reconoce:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Las ejecuciones en Lambda se cortan a los 15 minutos y no se pueden cancelar.&lt;/li&gt;
&lt;li&gt;El código propio en TypeScript (&lt;code&gt;config.processor&lt;/code&gt;) no corre en Lambda.&lt;/li&gt;
&lt;li&gt;gRPC y Kinesis son motores aparte.&lt;/li&gt;
&lt;li&gt;El uso en producción en Azure exige una licencia comercial.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;¿Cuándo elegir k6, JMeter o Locust en lugar de Artillery?&lt;/h2&gt;
&lt;p&gt;Elige otra herramienta cuando su runtime, sus protocolos o su lenguaje encajen mejor con tu equipo.&lt;/p&gt;
&lt;p&gt;Elige &lt;strong&gt;k6&lt;/strong&gt; si quieres un binario de Go sin Node.js que mantener y umbrales en el script. Nuestra comparativa &lt;a href=&quot;https://loadtest.app/es/k6-vs-artillery/&quot;&gt;k6 vs Artillery&lt;/a&gt; pone las dos frente a frente. LoadFocus &lt;a href=&quot;https://loadfocus.com/es-es/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=artillery-load-testing&quot;&gt;ejecuta scripts de k6&lt;/a&gt; desde 25 regiones en la nube, aunque ejecuta los escenarios arrival-rate con un número fijo de usuarios; para mantener una tasa de llegada, ejecútalos con el propio k6.&lt;/p&gt;
&lt;p&gt;Elige &lt;strong&gt;JMeter&lt;/strong&gt; si necesitas JDBC, JMS, LDAP o FTP de serie, o si tus testers montan las pruebas en una interfaz gráfica.&lt;/p&gt;
&lt;p&gt;Elige &lt;strong&gt;Locust&lt;/strong&gt; si tu equipo escribe Python; nuestro &lt;a href=&quot;https://loadtest.app/es/locust-load-testing/&quot;&gt;análisis de Locust&lt;/a&gt; lo cubre. El repaso de &lt;a href=&quot;https://loadtest.app/es/open-source-load-testing-tools/&quot;&gt;herramientas de pruebas de carga open source&lt;/a&gt; las pone todas lado a lado.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Artillery es gratis para uso comercial?&lt;/strong&gt;
La CLI está casi toda bajo MPL-2.0, que permite el uso comercial. La excepción es Azure: el uso comercial o en producción de sus módulos de Azure exige una licencia comercial.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede Artillery ejecutar pruebas de navegador?&lt;/strong&gt;
Sí. Su motor de Playwright integrado ejecuta tu código de Playwright en navegadores headless y publica Web Vitals de cada página.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede LoadFocus ejecutar scripts de Artillery?&lt;/strong&gt;
No. LoadFocus ejecuta planes de prueba JMeter y scripts de k6. Para escalar una prueba de Artillery, usa &lt;code&gt;run-lambda&lt;/code&gt;, &lt;code&gt;run-fargate&lt;/code&gt; o &lt;code&gt;run-aci&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/k6-vs-artillery/&quot;&gt;k6 vs Artillery: qué herramienta de pruebas de carga elegir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-source-load-testing-tools/&quot;&gt;Herramientas de pruebas de carga open source: seis opciones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;Modelo de carga abierto vs cerrado: cuál usar y cuándo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/websocket-load-testing-tools/&quot;&gt;Herramientas de pruebas de carga WebSocket: seis opciones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/apdex-score/&quot;&gt;Puntuación Apdex: qué es y cómo se calcula&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Azure Load Testing: análisis del servicio de Microsoft</title><link>https://loadtest.app/es/azure-load-testing/</link><guid isPermaLink="true">https://loadtest.app/es/azure-load-testing/</guid><description>Análisis de Azure Load Testing: pruebas JMeter y Locust, pruebas rápidas por URL, motores y límites, regiones, endpoints privados, precio por VUH y CI.</description><pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, que vende un servicio de pruebas de carga que aparece en este artículo.&lt;/p&gt;&lt;p&gt;Azure Load Testing es el servicio gestionado de Microsoft para ejecutar pruebas de JMeter y Locust a gran escala desde Azure, con cobro por hora de usuario virtual. Encaja bien cuando el sistema que pruebas corre en Azure, porque puede traer métricas de servidor de Azure Monitor y llegar a endpoints privados dentro de una red virtual. A los equipos que escriben scripts de k6, no tienen suscripción de Azure o prueban desde fuera de las regiones de Azure les resultarán más sencillos otros servicios.&lt;/p&gt;
&lt;p&gt;No hemos ejecutado Azure Load Testing para este análisis. Los datos salen de la documentación y la página de precios de Microsoft, comprobadas el 19 de octubre de 2026, y las valoraciones son nuestras.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tema&lt;/th&gt;
&lt;th&gt;Azure Load Testing&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Tipo&lt;/td&gt;
&lt;td&gt;Servicio gestionado en el hub Azure App Testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frameworks de prueba&lt;/td&gt;
&lt;td&gt;Solo Apache JMeter y Locust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opción sin código&lt;/td&gt;
&lt;td&gt;Prueba rápida por URL, hasta cinco peticiones HTTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escala por ejecución&lt;/td&gt;
&lt;td&gt;Hasta 400 instancias de motor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prueba más larga&lt;/td&gt;
&lt;td&gt;24 horas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Origen de la carga&lt;/td&gt;
&lt;td&gt;La región del recurso, o hasta 5 regiones&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Endpoints privados&lt;/td&gt;
&lt;td&gt;Sí, mediante inyección en una red virtual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Precio&lt;/td&gt;
&lt;td&gt;0,15 $ por hora de usuario virtual, 0,06 $ a partir de 10.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conservación&lt;/td&gt;
&lt;td&gt;6 meses; métricas de cliente 365 días&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Qué es Azure Load Testing?&lt;/h2&gt;
&lt;p&gt;Es un servicio totalmente gestionado que ejecuta tu prueba de carga en los motores de prueba de Microsoft, así que nunca montas ni parcheas generadores de carga. Creas un recurso de pruebas de carga en una región de Azure, le añades pruebas y lanzas ejecuciones desde el portal, la Azure CLI o un pipeline.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/overview-what-is-azure-load-testing&quot;&gt;página de introducción&lt;/a&gt; dice que la aplicación probada puede estar en cualquier sitio: en Azure, en tus instalaciones o en otra nube. Microsoft incluye ahora el servicio en el hub Azure App Testing, junto a Playwright Workspaces; el &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/quickstart-create-run-load-test-with-locust&quot;&gt;inicio rápido de Locust&lt;/a&gt; crea el recurso desde ese hub (comprobado el 19 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Qué tipos de prueba y herramientas admite?&lt;/h2&gt;
&lt;p&gt;Tres caminos: una prueba rápida por URL, un script de JMeter subido o un script de Locust subido. La documentación dice claramente que no admite ningún otro framework de pruebas.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/quickstart-create-and-run-load-test&quot;&gt;prueba rápida&lt;/a&gt; admite hasta cinco peticiones HTTP y un objetivo de usuarios virtuales o de peticiones por segundo. Cada motor maneja hasta 250 usuarios virtuales, así que 400 usuarios corren en dos motores de 200 cada uno.&lt;/p&gt;
&lt;p&gt;Con &lt;strong&gt;JMeter&lt;/strong&gt; puedes usar plugins de jmeter-plugins.org o subir los tuyos, y la introducción afirma que funciona cualquier protocolo que admita JMeter, como una conexión a base de datos o una cola de mensajes. Con &lt;strong&gt;Locust&lt;/strong&gt; puedes añadir plugins de Locust y otras bibliotecas de Python. La propia documentación de Locust remite al servicio como su &lt;a href=&quot;https://docs.locust.io/en/stable/hosted-load-testing.html&quot;&gt;opción alojada&lt;/a&gt;, y nuestro &lt;a href=&quot;https://loadtest.app/es/locust-load-testing/&quot;&gt;análisis de Locust&lt;/a&gt; cubre la herramienta en sí. Los scripts de k6, Gatling y Artillery no se ejecutan aquí (comprobado el 19 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo funcionan los motores, los usuarios virtuales y los límites?&lt;/h2&gt;
&lt;p&gt;Escalas una prueba añadiendo instancias de motor. En JMeter, la carga total es el número de usuarios del plan de prueba multiplicado por el número de motores; en Locust, fijas el total de usuarios y eliges cuántos motores los generan.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/concept-load-testing-concepts&quot;&gt;página de conceptos&lt;/a&gt; da ambas fórmulas, y la &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/resource-limits-quotas-capacity&quot;&gt;página de límites del servicio&lt;/a&gt; fija los topes por región y suscripción (comprobado el 19 de octubre de 2026):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Instancias de motor por ejecución: de 1 a 400 por defecto según la oferta, 400 como máximo.&lt;/li&gt;
&lt;li&gt;Instancias de motor simultáneas: de 5 a 400 por defecto, hasta 1.000 bajo petición.&lt;/li&gt;
&lt;li&gt;Duración de la prueba: de 3 a 24 horas por defecto, 24 horas como máximo.&lt;/li&gt;
&lt;li&gt;Criterios de fallo: hasta 50 por prueba.&lt;/li&gt;
&lt;li&gt;Conservación: métricas de servidor 90 días, métricas de cliente 365 días, resultados y registros 6 meses.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Subir un límite por defecto exige una solicitud a soporte; nada supera los máximos indicados.&lt;/p&gt;
&lt;h2&gt;¿Puede probar endpoints privados y generar carga desde varias regiones?&lt;/h2&gt;
&lt;p&gt;Sí a ambas cosas, con una pega: no se combinan. La carga desde varias regiones solo funciona contra endpoints públicos.&lt;/p&gt;
&lt;p&gt;Por defecto, los motores corren en la región de tu recurso de pruebas de carga. La &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/how-to-generate-load-from-multiple-regions&quot;&gt;guía de varias regiones&lt;/a&gt; permite elegir hasta 5 regiones por prueba y repartir la carga entre ellas, y al hacerlo pasa la prueba a tráfico público. Para servicios sin endpoint público, la &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/how-to-test-private-endpoint&quot;&gt;inyección en una red virtual&lt;/a&gt; coloca los motores dentro de la red que aloja la aplicación (comprobado el 19 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Qué muestran los resultados y las métricas de servidor?&lt;/h2&gt;
&lt;p&gt;El panel muestra en directo durante la ejecución las métricas del lado del cliente, como usuarios virtuales, tiempo de respuesta y peticiones por segundo. Para aplicaciones alojadas en Azure añade métricas del lado del servidor de Azure Monitor, Application Insights y Container Insights en la misma línea de tiempo.&lt;/p&gt;
&lt;p&gt;Esa combinación es la gran ventaja del servicio: ves la base de datos o el contenedor que se satura en el momento en que suben los tiempos de respuesta, sin montar un panel aparte. La &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/how-to-monitor-server-side-metrics&quot;&gt;guía de métricas de servidor&lt;/a&gt; describe los pasos. Las ejecuciones anteriores se pueden comparar lado a lado, y puedes descargar los resultados para otras herramientas.&lt;/p&gt;
&lt;h2&gt;¿Cómo funcionan los criterios de aprobación y la CI?&lt;/h2&gt;
&lt;p&gt;Defines criterios de fallo sobre métricas de cliente o de servidor, y la ejecución se marca como fallida en cuanto se incumple alguno. Los pipelines de Azure DevOps, GitHub Actions o cualquier herramienta de CI que pueda llamar a la Azure CLI pueden lanzar una prueba y decidir según ese resultado.&lt;/p&gt;
&lt;p&gt;Según la &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/how-to-define-test-criteria&quot;&gt;guía de criterios de fallo&lt;/a&gt;, un criterio es un agregado de una métrica de cliente, como el tiempo de respuesta medio o el porcentaje de errores, comparado con un umbral, ya sea para toda la prueba o para una petición con nombre. Las métricas de servidor necesitan que la identidad administrada del recurso pueda leerlas. La parada automática corta una ejecución cuando la tasa de errores supera un límite, para que una URL equivocada no siga costando dinero. La &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-testing/how-to-configure-load-test-cicd&quot;&gt;guía de CI/CD&lt;/a&gt; cubre GitHub Actions y Azure Pipelines (comprobado el 19 de octubre de 2026). Nuestra guía de &lt;a href=&quot;https://loadtest.app/es/load-test-pass-fail-criteria/&quot;&gt;criterios de aprobación en pruebas de carga&lt;/a&gt; explica cómo elegir los límites.&lt;/p&gt;
&lt;h2&gt;¿Cuánto cuesta Azure Load Testing?&lt;/h2&gt;
&lt;p&gt;Pagas por hora de usuario virtual (VUH): 0,15 $ por VUH las primeras 10.000 y 0,06 $ por VUH a partir de ahí, igual en todas las regiones de la página de precios. Desde el 1 de marzo de 2026 hay además un cobro mínimo por ejecución.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://azure.microsoft.com/en-us/pricing/details/load-testing/&quot;&gt;página de precios&lt;/a&gt; define una VUH como usuarios virtuales por minutos, dividido entre 60, contado cada 10 segundos; 1.000 usuarios durante 30 minutos son 500 VUH, o 75 $ con la tarifa del primer tramo. El mínimo es de 10 usuarios virtuales por motor durante toda la ejecución, y al menos 10 minutos. Una ejecución de 3 horas con 5 usuarios en un motor se cobra por tanto como 30 VUH, no 15 (comprobado el 19 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cuándo conviene elegir otra cosa?&lt;/h2&gt;
&lt;p&gt;Elige otra opción cuando tus scripts, tu nube o tu presupuesto apunten a otro sitio.&lt;/p&gt;
&lt;p&gt;Nuestro repaso de &lt;a href=&quot;https://loadtest.app/es/open-source-load-testing-tools/&quot;&gt;herramientas de pruebas de carga open source&lt;/a&gt; cubre las herramientas que puedes ejecutar tú mismo.&lt;/p&gt;
&lt;p&gt;Elige &lt;strong&gt;LoadFocus&lt;/strong&gt;, que publica este sitio, si quieres ejecutar &lt;a href=&quot;https://loadfocus.com/es-es/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=azure-load-testing&quot;&gt;planes de prueba JMeter y scripts de k6&lt;/a&gt; desde 25 regiones en la nube sin suscripción de Azure. No ejecuta Locust, y ejecuta los escenarios arrival-rate de k6 con un número fijo de usuarios.&lt;/p&gt;
&lt;p&gt;Elige &lt;strong&gt;Grafana Cloud k6&lt;/strong&gt; o el &lt;a href=&quot;https://grafana.com/docs/k6/latest/testing-guides/running-distributed-tests/&quot;&gt;k6-operator&lt;/a&gt; si tus pruebas están escritas para k6, que Azure Load Testing no puede ejecutar (comprobado el 19 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;Elige &lt;strong&gt;Locust en tu propia infraestructura&lt;/strong&gt; si ya tienes Kubernetes o máquinas libres: su &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;modo distribuido&lt;/a&gt; es gratis y solo pagas el hardware.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Azure Load Testing admite k6?&lt;/strong&gt;
No. Ejecuta pruebas de Apache JMeter y de Locust, además de pruebas rápidas por URL que convierte él mismo en un script. Los scripts de k6 necesitan otro servicio o tu propia infraestructura.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puedo usar Azure Load Testing con una aplicación que no está en Azure?&lt;/strong&gt;
Sí. Los motores de prueba pueden apuntar a cualquier endpoint público. Las métricas de servidor solo se recogen para recursos de Azure, así que con otro alojamiento lees las métricas de servidor en tu propia monitorización.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Hay un nivel gratuito?&lt;/strong&gt;
La página de precios solo muestra precios por hora para las pruebas de carga, con un mínimo por ejecución. Las cuentas nuevas de Azure reciben un crédito de 200 $ para sus primeros 30 días, según la misma página.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/locust-load-testing/&quot;&gt;Pruebas de carga con Locust: análisis de la herramienta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-source-load-testing-tools/&quot;&gt;Herramientas de pruebas de carga open source: seis opciones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/load-test-pass-fail-criteria/&quot;&gt;Criterios de aprobación en pruebas de carga: cómo fijarlos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/locust-vs-jmeter/&quot;&gt;Locust vs JMeter: ¿scripts de Python o planes de JMeter?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/load-testing-in-github-actions/&quot;&gt;Pruebas de carga en GitHub Actions: guía práctica&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Latencia de cola: qué es y cómo medirla</title><link>https://loadtest.app/es/tail-latency/</link><guid isPermaLink="true">https://loadtest.app/es/tail-latency/</guid><description>La latencia de cola explicada: por qué importa el 1 % más lento de las peticiones, cómo lo agrava el fan-out, sus causas y cómo medir el p99 en una prueba.</description><pubDate>Mon, 19 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, un servicio de pruebas de carga mencionado en este artículo.&lt;/p&gt;&lt;p&gt;La latencia de cola es el tiempo de respuesta de las pocas peticiones más lentas, que suele darse como el percentil 99 o 99,9. Importa porque una acción del usuario a menudo espera a muchas peticiones, así que un retraso que afecta a 1 petición de cada 100 puede llegar a la mayoría de tus usuarios. Una prueba de carga que solo muestra la media o la mediana no la refleja.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Llamadas al backend por página&lt;/th&gt;
&lt;th&gt;Parte de las páginas con al menos una llamada lenta (1 de cada 100)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1,0 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;4,9 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;9,6 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;18,2 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;39,5 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;63,4 %&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;La tabla supone que cada llamada es lenta con un 1 % de probabilidad, con independencia de las demás: la parte es &lt;code&gt;1 - 0.99^n&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;¿Qué se considera la cola?&lt;/h2&gt;
&lt;p&gt;La cola es la parte de la distribución de tiempos de respuesta por encima de un percentil alto, casi siempre p99 y p99,9. La mediana describe una petición típica, y la cola describe las peticiones de las que se queja la gente.&lt;/p&gt;
&lt;p&gt;Un percentil es un corte: p99 = 800 ms significa que el 99 % de las peticiones tardó 800 ms o menos y el 1 % tardó más. En un histograma de tiempos de respuesta, la cola queda a la derecha de ese corte, a menudo como un tramo largo y fino lejos del pico principal. Nuestra guía de &lt;a href=&quot;https://loadtest.app/es/throughput-vs-latency/&quot;&gt;rendimiento vs latencia&lt;/a&gt; explica cómo miden la latencia y los percentiles las herramientas de pruebas de carga.&lt;/p&gt;
&lt;h2&gt;¿Por qué importa tanto la latencia de cola?&lt;/h2&gt;
&lt;p&gt;Porque las peticiones se multiplican. Una página o una llamada de API que se reparte entre muchos servicios solo termina cuando responde el más lento, así que la cola de cada servicio se convierte en la experiencia típica del conjunto.&lt;/p&gt;
&lt;p&gt;La referencia es «The Tail at Scale», de Jeffrey Dean y Luiz André Barroso, publicado en Communications of the ACM en 2013 (&lt;a href=&quot;https://www.barroso.org/publications/TheTailAtScale.pdf&quot;&gt;PDF del artículo&lt;/a&gt;, comprobado el 19 de octubre de 2026). Su ejemplo: un servidor que suele responder en 10 ms pero tarda un segundo en el percentil 99. Si una petición toca uno de esos servidores, 1 de cada 100 peticiones de usuario es lenta. Si tiene que reunir respuestas de 100 en paralelo, el 63 % de las peticiones de usuario tarda más de un segundo. Incluso con solo 1 llamada lenta de cada 10.000, un servicio con 2.000 servidores ve casi 1 de cada 5 peticiones por encima del segundo.&lt;/p&gt;
&lt;p&gt;También publican mediciones de un servicio real de Google: el percentil 99 de una sola petición hoja era de 10 ms, pero llegaba a 140 ms hasta que terminaban todas las peticiones hoja, y esperar al 5 % más lento suponía la mitad de ese tiempo.&lt;/p&gt;
&lt;h2&gt;¿Qué causa la latencia de cola?&lt;/h2&gt;
&lt;p&gt;Sobre todo interferencias de otro trabajo en la máquina o en la red. La misma petición es rápida casi siempre y lenta cuando está pasando otra cosa.&lt;/p&gt;
&lt;p&gt;Dean y Barroso enumeran los sospechosos habituales:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Recursos compartidos:&lt;/strong&gt; otro trabajo en la misma máquina que compite por núcleos de CPU, cachés del procesador, ancho de banda de memoria o de red.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Demonios en segundo plano&lt;/strong&gt; que se despiertan y se llevan una parte de la máquina.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tareas de mantenimiento&lt;/strong&gt; como la compactación de registros o la recolección de basura en entornos gestionados.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Colas&lt;/strong&gt; en servidores y conmutadores de red, que amplifican todas las demás fuentes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Límites de potencia y temperatura&lt;/strong&gt; que frenan una CPU tras un pico de trabajo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En las pruebas de carga, la misma lista aparece como pausas de GC en servicios JVM o Node.js, un pool de conexiones agotado, una consulta lenta a la base de datos que solo disparan algunas peticiones, cachés frías tras un despliegue y reintentos después de un timeout. Una cola que crece con la carga apunta a colas de espera; una cola presente incluso con poca carga apunta a algo periódico, como el GC o una tarea programada.&lt;/p&gt;
&lt;h2&gt;¿Cómo se mide la latencia de cola en una prueba de carga?&lt;/h2&gt;
&lt;p&gt;Reúne suficientes muestras, pide a tu herramienta los percentiles adecuados y nunca promedies percentiles entre máquinas o ventanas de tiempo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Suficientes muestras.&lt;/strong&gt; El p99 lo decide el 1 % más lento de las peticiones, así que una ejecución de 500 peticiones lo apoya en 5 de ellas. Para un p99 estable necesitas miles de peticiones por transacción, y para el p99,9 decenas de miles. Las pruebas de humo cortas sirven para detectar errores y poco para juzgar la cola.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Los percentiles adecuados.&lt;/strong&gt; Los valores por defecto suelen quedarse antes de la cola. En k6, &lt;code&gt;summaryTrendStats&lt;/code&gt; es por defecto &lt;code&gt;avg,min,med,max,p(90),p(95)&lt;/code&gt;, así que el p99 solo aparece si lo añades (&lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/k6-options/reference/&quot;&gt;referencia de opciones de k6&lt;/a&gt;, comprobada el 19 de octubre de 2026):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;k6 run --summary-trend-stats=&amp;quot;med,p(95),p(99),p(99.9),max&amp;quot; \
  script.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Aggregate_Report&quot;&gt;Aggregate Report&lt;/a&gt; de JMeter muestra las líneas del 90 %, 95 % y 99 %, y las propiedades &lt;code&gt;aggregate_rpt_pct1&lt;/code&gt; a &lt;code&gt;aggregate_rpt_pct3&lt;/code&gt; cambian qué percentiles aparecen (comprobado el 19 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nada de percentiles promediados.&lt;/strong&gt; El p99 de una ejecución completa no es la media de los p99 de cada minuto ni la de los p99 de cada generador de carga. Junta las muestras en bruto o un histograma y calcula el percentil una sola vez. El artículo sobre &lt;a href=&quot;https://loadtest.app/es/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt; trata HdrHistogram, la herramienta habitual para eso, y una segunda trampa: un generador de carga que espera las respuestas lentas envía menos peticiones mientras el sistema va lento, y esconde justo la cola que buscas.&lt;/p&gt;
&lt;p&gt;LoadFocus, que publica este sitio, muestra en cada ejecución las tarjetas P95 y P99, un &lt;a href=&quot;https://loadfocus.com/docs/es-es/guides/load-testing/response-time-distribution?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tail-latency&quot;&gt;histograma de tiempos de respuesta&lt;/a&gt; construido a partir de las muestras individuales y las peticiones más lentas, de modo que una cola larga a la derecha del pico se ve de un vistazo.&lt;/p&gt;
&lt;h2&gt;¿Cómo se fija un límite de aprobación para la cola?&lt;/h2&gt;
&lt;p&gt;Pon un límite al p99 de cada transacción clave, junto a un límite de p95 y otro de tasa de errores. Básalo en lo que necesitan los usuarios de esa transacción y haz que la ejecución dure lo suficiente para que el p99 sea estable.&lt;/p&gt;
&lt;p&gt;Un conjunto razonable para una API de pago podría ser: p95 por debajo de 400 ms, p99 por debajo de 1.200 ms y errores por debajo del 0,5 %. En k6 son umbrales sobre &lt;code&gt;http_req_duration&lt;/code&gt; como &lt;code&gt;p(99)&amp;lt;1200&lt;/code&gt;, y un umbral superado hace que k6 termine con un código distinto de cero (&lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;umbrales de k6&lt;/a&gt;, comprobado el 19 de octubre de 2026). LoadFocus tiene un campo &lt;a href=&quot;https://loadfocus.com/docs/es-es/guides/load-testing/pass-fail-thresholds?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=tail-latency&quot;&gt;Max P99 response time&lt;/a&gt; junto a Max P95 para pruebas cloud, JMeter y k6, y cada ejecución recibe entonces un PASS o un FAIL. Nuestra guía de &lt;a href=&quot;https://loadtest.app/es/load-test-pass-fail-criteria/&quot;&gt;criterios de aprobación en pruebas de carga&lt;/a&gt; cubre el resto del conjunto.&lt;/p&gt;
&lt;p&gt;Si además informas de una &lt;a href=&quot;https://loadtest.app/es/apdex-score/&quot;&gt;puntuación Apdex&lt;/a&gt;, recuerda que mete toda petición por encima de cuatro veces T en la misma franja, así que no distingue una cola de 2 segundos de una de 30. El p99 sí.&lt;/p&gt;
&lt;h2&gt;¿Cómo se reduce la latencia de cola?&lt;/h2&gt;
&lt;p&gt;Elimina las fuentes de variabilidad donde puedas y diseña los clientes para que una llamada lenta no retenga toda la respuesta.&lt;/p&gt;
&lt;p&gt;Arreglos habituales, más o menos del más barato al más costoso:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ajusta el GC y el tamaño de los pools&lt;/strong&gt; para que las pausas y la espera de una conexión libre sigan siendo cortas bajo carga.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deja margen.&lt;/strong&gt; Las colas de espera crecen de golpe cerca de la saturación, así que la capacidad libre acorta la cola; la guía de &lt;a href=&quot;https://loadtest.app/es/throughput-vs-latency/&quot;&gt;rendimiento vs latencia&lt;/a&gt; muestra cómo encontrar el codo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pon timeouts y limita los reintentos&lt;/strong&gt; para que una llamada atascada falle rápido en lugar de acumular todo lo que viene detrás.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Usa peticiones de cobertura (hedged requests)&lt;/strong&gt; en lecturas idempotentes: envía una segunda copia a otra réplica si la primera no ha respondido a tiempo. Dean y Barroso describen enviar la copia solo después de la latencia esperada del percentil 95, lo que limita la carga extra a un 5 % aproximadamente. En una de sus pruebas, una copia enviada a los 10 ms bajó el percentil 99,9 de 1.800 ms a 74 ms con solo un 2 % más de peticiones.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reduce el fan-out.&lt;/strong&gt; Menos llamadas al backend por página significa menos ocasiones de caer en la cola, como muestra la tabla del principio.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tras cada cambio, repite la misma prueba con el mismo perfil de carga y compara p99 y p99,9 entre ejecuciones.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿La latencia de cola es lo mismo que el p99?&lt;/strong&gt;
El p99 es la forma más común de expresarla, y la cola es todo el extremo lento de la distribución. Sigue también el p99,9 y el máximo cuando la ejecución tenga suficientes peticiones.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Por qué mi p99 es tan superior a mi media?&lt;/strong&gt;
Porque unas pocas peticiones lentas apenas mueven la media y definen por completo el p99. Una diferencia grande es normal; una diferencia que crece con la carga suele indicar colas de espera.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuántas peticiones necesito para medir el p99?&lt;/strong&gt;
Como mínimo unos miles por transacción, para que el p99 se apoye en decenas de peticiones lentas. Para el p99,9, cuenta con decenas de miles.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/coordinated-omission/&quot;&gt;Coordinated omission: qué es y cómo evitarla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/throughput-vs-latency/&quot;&gt;Rendimiento vs latencia: cómo se relacionan bajo carga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/apdex-score/&quot;&gt;Puntuación Apdex: qué es y cómo se calcula&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/load-test-pass-fail-criteria/&quot;&gt;Criterios de aprobación en pruebas de carga: cómo fijarlos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/littles-law-load-testing/&quot;&gt;Ley de Little en pruebas de carga: dimensionar y comprobar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/ycsb/&quot;&gt;YCSB: cargas de trabajo A-F, ejecución y límites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/slo-vs-sla/&quot;&gt;SLO vs SLA: diferencia, SLI y presupuesto de error&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Pruebas de carga gRPC: herramientas, configuración, métricas</title><link>https://loadtest.app/es/grpc-load-testing/</link><guid isPermaLink="true">https://loadtest.app/es/grpc-load-testing/</guid><description>Pruebas de carga gRPC: qué herramientas hablan gRPC de forma nativa, cómo escribir una prueba con k6 o ghz y por qué un fallo sigue llegando como HTTP 200.</description><pubDate>Fri, 16 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, un servicio de pruebas de carga mencionado en este artículo.&lt;/p&gt;&lt;p&gt;Una prueba de carga gRPC necesita una herramienta que hable HTTP/2 y Protocol Buffers: k6 y ghz lo hacen de serie, JMeter necesita un plugin, el soporte gRPC de Gatling está limitado en su edición gratuita y en Locust tienes que integrar tú mismo un cliente gRPC. Cuenta los resultados por estado gRPC, no por estado HTTP, porque las llamadas fallidas siguen llegando como HTTP 200, y comprueba que la carga llega a todos los backends.&lt;/p&gt;
&lt;p&gt;Para este artículo no se ejecutó ninguna prueba gRPC. Los datos sobre herramientas salen de la documentación y los repositorios de cada proyecto, comprobados el 16 de octubre de 2026; los datos sobre LoadFocus salen de su código.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Herramienta&lt;/th&gt;
&lt;th&gt;Soporte gRPC&lt;/th&gt;
&lt;th&gt;Lee la API desde&lt;/th&gt;
&lt;th&gt;Control del ritmo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;Integrado (&lt;code&gt;k6/net/grpc&lt;/code&gt;), llamadas unarias y streams&lt;/td&gt;
&lt;td&gt;Archivos &lt;code&gt;.proto&lt;/code&gt; o reflexión del servidor&lt;/td&gt;
&lt;td&gt;Ejecutores arrival-rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ghz&lt;/td&gt;
&lt;td&gt;Herramienta de línea de comandos dedicada a gRPC&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.proto&lt;/code&gt;, protoset o reflexión del servidor&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--rps&lt;/code&gt; y planes de carga&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;Plugin de terceros (jmeter-grpc-request)&lt;/td&gt;
&lt;td&gt;Una carpeta de archivos &lt;code&gt;.proto&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Thread Groups y temporizadores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;Componente gRPC aparte; edición gratuita limitada a 5 usuarios, 5 minutos&lt;/td&gt;
&lt;td&gt;Código generado desde los &lt;code&gt;.proto&lt;/code&gt; con protoc&lt;/td&gt;
&lt;td&gt;Perfiles de inyección&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;Sin cliente integrado; envuelve uno y reporta las llamadas&lt;/td&gt;
&lt;td&gt;Tu cliente gRPC de Python&lt;/td&gt;
&lt;td&gt;Tiempos de espera, &lt;code&gt;constant_throughput&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Por qué gRPC necesita una prueba de carga distinta de REST?&lt;/h2&gt;
&lt;p&gt;gRPC va sobre HTTP/2, envía Protocol Buffers binarios en lugar de JSON, pone el resultado de la llamada en un trailer en vez de en el estado HTTP y multiplexa muchas llamadas sobre una sola conexión. Cada una de esas cosas cambia cómo escribes la prueba o lees sus resultados.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://grpc.io/blog/grpc-load-balancing/&quot;&gt;artículo sobre balanceo de carga en gRPC&lt;/a&gt; enumera las características de HTTP/2 que importan aquí: un protocolo binario, muchas peticiones multiplexadas en una conexión y compresión de cabeceras, con mensajes Protobuf fuertemente tipados encima (comprobado el 16 de octubre de 2026). Una herramienta que solo envía JSON sobre HTTP/1.1 no puede llamar a un método gRPC, así que comprueba primero el soporte del protocolo.&lt;/p&gt;
&lt;h2&gt;¿Qué herramienta deberías usar?&lt;/h2&gt;
&lt;p&gt;Usa k6 si quieres escenarios, checks y umbrales escritos en código; usa ghz para un benchmark rápido de un método desde la línea de comandos. Recurre a JMeter, Gatling o Locust cuando tu equipo ya hace todo lo demás con ellos.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;k6.&lt;/strong&gt; El &lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-net-grpc/&quot;&gt;módulo k6/net/grpc&lt;/a&gt; carga definiciones Protobuf, se conecta, hace llamadas unarias con &lt;code&gt;invoke&lt;/code&gt; y abre streams. Reporta &lt;code&gt;grpc_req_duration&lt;/code&gt; y el número de mensajes de los streams en sus &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/metrics/reference/&quot;&gt;métricas&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ghz.&lt;/strong&gt; Una herramienta de benchmark de línea de comandos solo para gRPC. Sus &lt;a href=&quot;https://ghz.sh/docs/options&quot;&gt;opciones&lt;/a&gt; incluyen &lt;code&gt;--rps&lt;/code&gt;, &lt;code&gt;--concurrency&lt;/code&gt;, &lt;code&gt;--total&lt;/code&gt; y &lt;code&gt;--duration&lt;/code&gt;, y si no pasas ni &lt;code&gt;--proto&lt;/code&gt; ni &lt;code&gt;--protoset&lt;/code&gt; intenta la reflexión del servidor. La última &lt;a href=&quot;https://github.com/bojand/ghz/releases&quot;&gt;versión&lt;/a&gt; es v0.121.0 (comprobado el 16 de octubre de 2026).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JMeter.&lt;/strong&gt; El núcleo de JMeter no tiene sampler gRPC; el &lt;a href=&quot;https://github.com/zalopay-oss/jmeter-grpc-request&quot;&gt;plugin jmeter-grpc-request&lt;/a&gt; añade uno que lee una carpeta de archivos &lt;code&gt;.proto&lt;/code&gt;, sin generar código (última etiqueta v1.2.6, comprobado el 16 de octubre de 2026).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gatling.&lt;/strong&gt; El &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README de Gatling&lt;/a&gt; pone gRPC, MQTT y GraphQL bajo la Gatling Enterprise Component License, limitados en Community Edition a 5 usuarios simultáneos y pruebas de 5 minutos (comprobado el 16 de octubre de 2026). Su &lt;a href=&quot;https://docs.gatling.io/reference/script/grpc/setup/&quot;&gt;guía de configuración de gRPC&lt;/a&gt; genera código a partir de tus archivos &lt;code&gt;.proto&lt;/code&gt; con protoc.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Locust.&lt;/strong&gt; Su documentación sobre &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;probar otros sistemas&lt;/a&gt; incluye un ejemplo de gRPC: envuelves un cliente gRPC para que cada llamada se reporte a Locust, y &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;&lt;code&gt;constant_throughput&lt;/code&gt;&lt;/a&gt; limita una tarea a un número máximo de ejecuciones por segundo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Elige ghz en lugar de k6 cuando solo necesitas saber cómo se comporta un método a un ritmo dado y no quieres escribir un script. Elige Locust en su lugar cuando tu equipo escribe en Python y la prueba necesita lógica que resulta más fácil ahí.&lt;/p&gt;
&lt;h2&gt;¿Cómo se escribe una prueba de carga gRPC en k6?&lt;/h2&gt;
&lt;p&gt;Carga el archivo &lt;code&gt;.proto&lt;/code&gt; en el código de inicialización y, en cada iteración, conéctate, llama al método y comprueba el estado gRPC. La estructura sigue el ejemplo de la documentación de k6.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;import grpc from &amp;#39;k6/net/grpc&amp;#39;;
import { check } from &amp;#39;k6&amp;#39;;

const client = new grpc.Client();
client.load([&amp;#39;protos&amp;#39;], &amp;#39;hello.proto&amp;#39;);

export const options = { vus: 20, duration: &amp;#39;1m&amp;#39; };

export default () =&amp;gt; {
  client.connect(&amp;#39;grpc.example.com:443&amp;#39;);
  const res = client.invoke(&amp;#39;hello.Greeter/SayHello&amp;#39;, {
    name: &amp;#39;load test&amp;#39;,
  });
  check(res, {
    &amp;#39;status is OK&amp;#39;: (r) =&amp;gt; r &amp;amp;&amp;amp; r.status === grpc.StatusOK,
  });
  client.close();
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La &lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-net-grpc/client/client-invoke/&quot;&gt;página de &lt;code&gt;invoke&lt;/code&gt;&lt;/a&gt; usa la misma secuencia de carga, conexión, llamada, comprobación y cierre. &lt;code&gt;connect&lt;/code&gt; usa TLS salvo que pases &lt;code&gt;plaintext: true&lt;/code&gt;, y con &lt;code&gt;reflect: true&lt;/code&gt; pide su API al servidor en lugar de leer un archivo &lt;code&gt;.proto&lt;/code&gt; (&lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-net-grpc/client/client-connect/&quot;&gt;parámetros de conexión&lt;/a&gt;). Para mantener un ritmo de peticiones en vez de un número de usuarios, ejecuta la función en un escenario arrival-rate.&lt;/p&gt;
&lt;h2&gt;¿Cómo se hace un benchmark rápido con ghz?&lt;/h2&gt;
&lt;p&gt;Indica a ghz el método, un cuerpo de petición y un ritmo o una concurrencia, y muestra un histograma de latencia, percentiles y un recuento por código de estado. Sirve para un primer vistazo a un método.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ghz --insecure --proto ./hello.proto \
  --call hello.Greeter.SayHello \
  -d &amp;#39;{&amp;quot;name&amp;quot;:&amp;quot;load test&amp;quot;}&amp;#39; \
  --rps 200 -c 50 -z 1m \
  localhost:50051
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;--rps&lt;/code&gt; fija el ritmo objetivo, repartido entre los workers, &lt;code&gt;-c&lt;/code&gt; cuántos workers hay y &lt;code&gt;-z&lt;/code&gt; la duración. Quita &lt;code&gt;--proto&lt;/code&gt; para que ghz use la reflexión del servidor, si el servidor la tiene activada. La &lt;a href=&quot;https://ghz.sh/docs/output&quot;&gt;página de salida de ghz&lt;/a&gt; muestra un informe de ejemplo.&lt;/p&gt;
&lt;h2&gt;¿Qué deberías medir en una prueba de carga gRPC?&lt;/h2&gt;
&lt;p&gt;Mide los percentiles de latencia de las llamadas, el rendimiento y el número de cada código de estado gRPC. Una tasa de éxito a nivel HTTP puede marcar 100 % mientras las llamadas fallan, porque el resultado viaja en el trailer &lt;code&gt;grpc-status&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://raw.githubusercontent.com/grpc/grpc/master/doc/PROTOCOL-HTTP2.md&quot;&gt;especificación de gRPC sobre HTTP/2&lt;/a&gt; fija el estado HTTP en &lt;code&gt;:status 200&lt;/code&gt; y lleva el resultado de la llamada en trailers como &lt;code&gt;grpc-status&lt;/code&gt; y &lt;code&gt;grpc-message&lt;/code&gt;. La &lt;a href=&quot;https://grpc.github.io/grpc/core/md_doc_statuscodes.html&quot;&gt;lista de códigos de estado&lt;/a&gt; tiene los que más importan bajo carga:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DEADLINE_EXCEEDED&lt;/code&gt; (4): el plazo venció antes de que terminara la llamada.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RESOURCE_EXHAUSTED&lt;/code&gt; (8): se agotó una cuota o un recurso.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;INTERNAL&lt;/code&gt; (13): se rompió un invariante interno, un código reservado para errores graves.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UNAVAILABLE&lt;/code&gt; (14): suele ser pasajero; reintentar con backoff puede resolverlo, aunque no siempre es seguro en llamadas no idempotentes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cuenta cada uno por escalón de carga. Los errores de plazo pueden subir mientras las llamadas que tienen éxito aún parecen rápidas, porque las lentas se cortan en el plazo en lugar de registrarse como lentas. Nuestra guía de &lt;a href=&quot;https://loadtest.app/es/load-test-pass-fail-criteria/&quot;&gt;criterios de aprobación en pruebas de carga&lt;/a&gt; muestra cómo convertir esos recuentos en umbrales.&lt;/p&gt;
&lt;h2&gt;¿Por qué toda la carga cae en un solo servidor?&lt;/h2&gt;
&lt;p&gt;Porque gRPC multiplexa muchas llamadas sobre una conexión de larga duración, un balanceador que trabaja por conexión envía cada llamada de esa conexión al mismo backend. Un generador de carga con pocas conexiones puede entonces saturar un servidor mientras los demás están parados.&lt;/p&gt;
&lt;p&gt;El artículo sobre balanceo de carga en gRPC explica el mecanismo. Un balanceador a nivel de transporte (L3/L4) termina la conexión TCP y abre otra hacia un backend elegido, copiando las tramas HTTP/2 y gRPC entre ambas; un balanceador a nivel de aplicación (L7) analiza HTTP/2 y puede repartir los streams de una misma conexión de cliente entre varios backends. Si tus clientes de producción pasan por un balanceador L7 o balancean del lado del cliente, prueba por el mismo camino y revisa la CPU y el número de peticiones de cada backend durante la ejecución.&lt;/p&gt;
&lt;h2&gt;¿Se pueden ejecutar pruebas de carga gRPC en LoadFocus?&lt;/h2&gt;
&lt;p&gt;No de forma que sus informes lo muestren. LoadFocus ejecuta la versión estándar de k6 v0.57.0, que incluye el módulo gRPC, pero su agente de k6 solo envía a los resultados las muestras de peticiones HTTP, así que las llamadas gRPC generarían carga sin aparecer en sus gráficos ni en sus recuentos de errores.&lt;/p&gt;
&lt;p&gt;Hay dos límites más. La subida de archivos de k6 acepta archivos &lt;code&gt;.js&lt;/code&gt;, &lt;code&gt;.ts&lt;/code&gt;, &lt;code&gt;.csv&lt;/code&gt;, &lt;code&gt;.txt&lt;/code&gt;, &lt;code&gt;.json&lt;/code&gt;, &lt;code&gt;.env&lt;/code&gt; y &lt;code&gt;.properties&lt;/code&gt;, no archivos &lt;code&gt;.proto&lt;/code&gt;, así que un script tendría que conectarse con &lt;code&gt;reflect: true&lt;/code&gt;. Y la vía de JMeter está cerrada: los agentes de JMeter de LoadFocus traen JMeter 5.6.2 con plugins preinstalados que no incluyen un sampler gRPC, y la subida de JMeter no acepta archivos JAR de plugins. Para gRPC, ejecuta k6 o ghz en tus propias máquinas y usa los &lt;a href=&quot;https://loadfocus.com/es-es/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=grpc-load-testing&quot;&gt;scripts de k6&lt;/a&gt; en LoadFocus para la parte HTTP del mismo sistema, donde genera carga desde 25 regiones.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Se pueden hacer pruebas de carga de llamadas gRPC en streaming?&lt;/strong&gt;
Sí, con k6 y ghz. El módulo gRPC de k6 tiene una clase &lt;code&gt;Stream&lt;/code&gt; con &lt;code&gt;write&lt;/code&gt;, &lt;code&gt;end&lt;/code&gt; y manejadores de eventos, y ghz tiene opciones para intervalos y duraciones de streaming. Mide los mensajes enviados y recibidos además de la latencia de las llamadas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Hace falta el archivo .proto para hacer una prueba de carga de un servicio gRPC?&lt;/strong&gt;
No si el servidor tiene la reflexión activada. k6 puede conectarse con &lt;code&gt;reflect: true&lt;/code&gt;, y ghz recurre a la reflexión cuando no pasas ni &lt;code&gt;--proto&lt;/code&gt; ni &lt;code&gt;--protoset&lt;/code&gt;. Sin reflexión necesitas el archivo &lt;code&gt;.proto&lt;/code&gt; o un protoset compilado.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Por qué mis errores gRPC no aparecen como peticiones fallidas?&lt;/strong&gt;
Porque el estado HTTP de una llamada gRPC es 200 aunque la llamada falle. El resultado está en el trailer &lt;code&gt;grpc-status&lt;/code&gt;, así que comprueba ese valor en tu script y cuenta cada código por separado.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/websocket-load-testing-tools/&quot;&gt;Herramientas de pruebas de carga WebSocket: seis opciones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/how-to-load-test-a-graphql-api/&quot;&gt;Prueba de carga de una API GraphQL: guía práctica&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-vs-k6/&quot;&gt;Gatling vs k6: ¿simulaciones en la JVM o un binario Go?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/http-benchmarking-tools/&quot;&gt;Herramientas de benchmark HTTP: wrk, hey, oha, ab y más&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Rendimiento vs latencia: cómo se relacionan bajo carga</title><link>https://loadtest.app/es/throughput-vs-latency/</link><guid isPermaLink="true">https://loadtest.app/es/throughput-vs-latency/</guid><description>Rendimiento vs latencia: qué mide cada uno, por qué la Latency de JMeter no es el tiempo de respuesta y por qué la latencia sube al llegar al techo.</description><pubDate>Fri, 16 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, un servicio de pruebas de carga mencionado en este artículo.&lt;/p&gt;&lt;p&gt;El rendimiento (throughput) es la cantidad de trabajo que un sistema termina por unidad de tiempo, por ejemplo peticiones por segundo. La latencia es lo que tarda una unidad de trabajo, por ejemplo 120 milisegundos por petición. Con poca carga apenas se afectan entre sí; cuando la carga se acerca a la capacidad del sistema, el rendimiento deja de subir y la latencia empieza a crecer, y encontrar ese punto es justo para lo que sirve una prueba de carga.&lt;/p&gt;
&lt;p&gt;El ejemplo de abajo es aritmética, sin ninguna prueba detrás. Las definiciones de las herramientas salen de la documentación de cada proyecto, comprobada el 16 de octubre de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Rendimiento&lt;/th&gt;
&lt;th&gt;Latencia&lt;/th&gt;
&lt;th&gt;Ancho de banda&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Pregunta que responde&lt;/td&gt;
&lt;td&gt;¿Cuánto se termina por segundo?&lt;/td&gt;
&lt;td&gt;¿Cuánto tarda una unidad?&lt;/td&gt;
&lt;td&gt;¿Cuánto podría llevar el enlace?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unidad habitual&lt;/td&gt;
&lt;td&gt;peticiones o transacciones por segundo&lt;/td&gt;
&lt;td&gt;milisegundos&lt;/td&gt;
&lt;td&gt;megabits por segundo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;En k6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http_reqs&lt;/code&gt; (cuenta y tasa)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http_req_duration&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;no es un objetivo de la prueba&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;En JMeter&lt;/td&gt;
&lt;td&gt;Throughput&lt;/td&gt;
&lt;td&gt;Elapsed time (y una &amp;quot;Latency&amp;quot; aparte)&lt;/td&gt;
&lt;td&gt;no es un objetivo de la prueba&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Qué diferencia hay entre rendimiento y latencia?&lt;/h2&gt;
&lt;p&gt;El rendimiento cuenta el trabajo terminado a lo largo del tiempo; la latencia mide lo que tarda una unidad de trabajo. Un sistema puede tener latencia baja y rendimiento bajo, o rendimiento alto y latencia alta, así que necesitas las dos cifras para describirlo.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://jmeter.apache.org/usermanual/glossary.html&quot;&gt;glosario de JMeter&lt;/a&gt; calcula el rendimiento como el número de peticiones dividido entre el tiempo total, desde el inicio de la primera muestra hasta el final de la última, incluidas las pausas entre muestras, porque debe representar la carga sobre el servidor (comprobado el 16 de octubre de 2026). Eso hace del rendimiento una propiedad de toda la ejecución, mientras que la latencia pertenece a cada petición y se lee mejor como una distribución: mediana, p95, p99.&lt;/p&gt;
&lt;h2&gt;¿El ancho de banda es lo mismo que el rendimiento?&lt;/h2&gt;
&lt;p&gt;No. El ancho de banda es la cantidad máxima de datos que podría llevar un enlace de red; el rendimiento es lo que pasa de verdad. En una prueba de carga, el rendimiento suele referirse a peticiones terminadas, y el ancho de banda solo importa cuando cargas de datos grandes llenan el enlace antes de que la aplicación agote su capacidad.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://aws.amazon.com/compare/the-difference-between-throughput-and-latency/&quot;&gt;página comparativa de AWS&lt;/a&gt; resume la visión de red: la latencia es el retraso en la comunicación de red, el rendimiento es el volumen medio de datos que realmente pasa en un periodo y el ancho de banda es el máximo teórico (comprobado el 16 de octubre de 2026). Buena parte de lo que se encuentra en internet usa ese sentido de red. Las pruebas de carga usan las mismas palabras para peticiones en lugar de paquetes, y por eso conviene decir cuál de los dos significa un informe.&lt;/p&gt;
&lt;h2&gt;¿Qué significa &amp;quot;latencia&amp;quot; en una herramienta de pruebas de carga?&lt;/h2&gt;
&lt;p&gt;Depende de la herramienta. En JMeter, Latency es el tiempo hasta la primera parte de la respuesta, y el tiempo de respuesta completo se llama Elapsed time. En k6, &lt;code&gt;http_req_duration&lt;/code&gt; abarca el envío, la espera y la recepción, y el tiempo hasta el primer byte es una métrica aparte.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://jmeter.apache.org/usermanual/glossary.html&quot;&gt;glosario de JMeter&lt;/a&gt; mide el Elapsed time desde justo antes de enviar la petición hasta justo después de recibir la última respuesta, y la Latency hasta justo después de recibir la primera. La &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/metrics/reference/&quot;&gt;referencia de métricas de k6&lt;/a&gt; define &lt;code&gt;http_req_duration&lt;/code&gt; como &lt;code&gt;http_req_sending + http_req_waiting + http_req_receiving&lt;/code&gt;, sin la resolución DNS ni el establecimiento de la conexión, y llama a &lt;code&gt;http_req_waiting&lt;/code&gt; el tiempo hasta el primer byte (ambos comprobados el 16 de octubre de 2026). Así que la Latency de JMeter equivale a &lt;code&gt;http_req_waiting&lt;/code&gt; de k6, no a &lt;code&gt;http_req_duration&lt;/code&gt;. Si comparas una &amp;quot;latencia&amp;quot; de JMeter con una &amp;quot;duration&amp;quot; de k6, la cifra de JMeter parecerá mejor sin serlo.&lt;/p&gt;
&lt;h2&gt;¿Cómo cambian el rendimiento y la latencia al crecer la carga?&lt;/h2&gt;
&lt;p&gt;Al principio, más carga significa más rendimiento, y la latencia se mantiene más o menos plana. Cuando el sistema llega a su capacidad, el rendimiento deja de crecer y cada usuario adicional solo añade espera, así que la latencia sube con la carga.&lt;/p&gt;
&lt;p&gt;Un ejemplo, solo aritmética. Un servicio atiende como mucho 200 peticiones por segundo y responde en 0,1 segundos cuando no está ocupado. Cada usuario virtual envía una petición y luego hace una pausa de 1 segundo. Con un número fijo de usuarios, la forma de la ley de Little para el modelo cerrado los relaciona: usuarios = peticiones por segundo × (latencia + tiempo de reflexión), como muestra paso a paso nuestro &lt;a href=&quot;https://loadtest.app/es/littles-law-load-testing/&quot;&gt;artículo sobre la ley de Little&lt;/a&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Usuarios virtuales&lt;/th&gt;
&lt;th&gt;Rendimiento (peticiones/s)&lt;/th&gt;
&lt;th&gt;Latencia (s)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;0,1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;150&lt;/td&gt;
&lt;td&gt;136&lt;/td&gt;
&lt;td&gt;0,1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;220&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;0,1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;0,5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;1,0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;600&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;2,0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Hasta 220 usuarios, el rendimiento crece al mismo ritmo que ellos. A partir de ahí se queda fijo en 200, y la latencia tiene que absorber el resto: 300 usuarios necesitan 300 ÷ 200 = 1,5 segundos por vuelta, lo que deja 0,5 segundos de latencia. Los sistemas reales suelen curvarse de forma más gradual, porque las colas empiezan a formarse antes del techo exacto. Con una prueba de tasa de llegada el panorama es más duro: si las peticiones llegan a más de 200 por segundo, la acumulación crece mientras dure el exceso, que es la diferencia que explica el artículo sobre el &lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;modelo de carga abierto vs cerrado&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;¿Cómo encuentras el codo en tus propios resultados?&lt;/h2&gt;
&lt;p&gt;Sube la carga por escalones, mantén cada escalón lo suficiente para que se estabilice y anota el rendimiento y un percentil de latencia de cada uno. El codo es el primer escalón en el que el rendimiento deja de subir con la carga mientras la latencia empieza a crecer.&lt;/p&gt;
&lt;p&gt;Algunas cosas hacen fiable esa lectura:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mantén cada escalón unos minutos, para medir el rendimiento en un tramo estable y no en una rampa.&lt;/li&gt;
&lt;li&gt;Lee un percentil, no solo la media; la media puede seguir tranquila mientras el pequeño porcentaje de peticiones más lentas se vuelve mucho más lento.&lt;/li&gt;
&lt;li&gt;Revisa los errores en cada escalón. Los fallos rápidos cuentan como peticiones terminadas con tiempos cortos, así que un sistema que falla puede mostrar más rendimiento y menos latencia.&lt;/li&gt;
&lt;li&gt;Vigila el generador de carga. Si su CPU está saturada, el techo que encontraste puede ser el suyo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;El &lt;a href=&quot;https://loadfocus.com/docs/es-es/guides/load-testing/response-time-vs-virtual-users?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=throughput-vs-latency&quot;&gt;gráfico de tiempo de respuesta frente a usuarios virtuales&lt;/a&gt; de LoadFocus muestra el tiempo de respuesta medio y máximo frente a los usuarios virtuales activos, un punto por cada nivel alcanzado, y ahí es donde aparece el codo en una prueba por escalones.&lt;/p&gt;
&lt;h2&gt;¿Se puede subir el rendimiento sin subir la latencia?&lt;/h2&gt;
&lt;p&gt;A veces. Añadir capacidad mueve el techo, así que la latencia se mantiene plana más tiempo. Agrupar trabajo (batching) suele hacer la concesión contraria: sube el rendimiento haciendo esperar a cada petición.&lt;/p&gt;
&lt;p&gt;El algoritmo de Nagle de TCP es el ejemplo clásico de esa concesión. La &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc896.html&quot;&gt;RFC 896&lt;/a&gt; retiene los segmentos nuevos mientras haya datos enviados en la conexión sin confirmar, de modo que la red lleva menos paquetes y más llenos, y cada escritura pequeña puede esperar (comprobado el 16 de octubre de 2026). Agrupar peticiones y usar búferes de escritura funciona igual: más trabajo por segundo, más tiempo por elemento. Cuando cambies algo de esto, repite la prueba por escalones y compara las dos curvas, no una sola cifra.&lt;/p&gt;
&lt;h2&gt;¿Cuál de los dos va en tus criterios de aprobación?&lt;/h2&gt;
&lt;p&gt;Los dos, unidos. Un objetivo de latencia dice poco sin el rendimiento con el que se midió, y un objetivo de rendimiento dice poco si la latencia se duplicó para alcanzarlo. Exprésalos como una pareja, por ejemplo p95 por debajo de 300 milisegundos a 200 peticiones por segundo con menos de un 1 % de errores.&lt;/p&gt;
&lt;p&gt;Nuestra guía de &lt;a href=&quot;https://loadtest.app/es/load-test-pass-fail-criteria/&quot;&gt;criterios de aprobación en pruebas de carga&lt;/a&gt; muestra cómo escribir y automatizar esa pareja. Si tu herramienta espera a las respuestas lentas antes de enviar la siguiente petición, sus cifras de latencia pueden quedarse cortas; la &lt;a href=&quot;https://loadtest.app/es/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt; explica cómo ocurre y cómo evitarla. La &lt;a href=&quot;https://loadfocus.com/es-es/glossary/what-is-latency?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=throughput-vs-latency&quot;&gt;entrada del glosario de LoadFocus sobre la latencia&lt;/a&gt; explica de dónde viene la latencia y por qué importan los percentiles.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Una latencia baja significa un rendimiento alto?&lt;/strong&gt;
No necesariamente. Un sistema puede responder rápido a cada petición pero atender pocas a la vez, o atender muchas a la vez mientras cada una espera. Solo conoces las dos cosas después de medirlas bajo la misma carga, idealmente en varios niveles de carga.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué diferencia hay entre latencia y tiempo de respuesta?&lt;/strong&gt;
En el uso cotidiano suelen significar lo mismo. En JMeter, Latency es el tiempo hasta la primera parte de la respuesta y Elapsed time el tiempo de respuesta completo, así que comprueba cuál muestra un informe antes de comparar herramientas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Por qué deja de subir el rendimiento en una prueba de carga?&lt;/strong&gt;
Algo ha llegado a su límite: la CPU, una base de datos, un pool de conexiones, un límite de peticiones (rate limit) o el propio generador de carga. A partir de ahí, los usuarios adicionales solo hacen cola, lo que se ve como latencia en aumento con el rendimiento plano.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/littles-law-load-testing/&quot;&gt;Ley de Little en pruebas de carga: dimensionar y comprobar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;Modelo de carga abierto vs cerrado: cuál usar y cuándo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/coordinated-omission/&quot;&gt;Coordinated omission: qué es y cómo evitarla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/load-test-pass-fail-criteria/&quot;&gt;Criterios de aprobación en pruebas de carga: cómo fijarlos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/tail-latency/&quot;&gt;Latencia de cola: qué es y cómo medirla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/apdex-score/&quot;&gt;Puntuación Apdex: qué es y cómo se calcula&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/amdahls-law/&quot;&gt;Ley de Amdahl: fórmula, ejemplos y límites&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Gatling vs Locust: ¿simulaciones JVM o locustfiles Python?</title><link>https://loadtest.app/es/gatling-vs-locust/</link><guid isPermaLink="true">https://loadtest.app/es/gatling-vs-locust/</guid><description>Gatling vs Locust comparados: licencia, ejecución, código de prueba, modelo de carga, escalado, criterios de aprobación e informes, con consejos.</description><pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, que vende un servicio de pruebas de carga que aparece en este artículo.&lt;/p&gt;&lt;p&gt;Gatling y Locust son dos herramientas open source gratuitas que guardan las pruebas de carga como código en tu repositorio. Elige Gatling si tu equipo trabaja en la JVM o si quieres perfiles de inyección abiertos y cerrados, aserciones y un informe HTML en un solo paquete. Elige Locust si tu equipo escribe Python, valora una interfaz web para iniciar y seguir una ejecución, y necesita el modo distribuido sin una edición comercial.&lt;/p&gt;
&lt;p&gt;Los datos de esta comparación Gatling vs Locust salen de la documentación y del repositorio de cada proyecto, comprobados el 13 de octubre de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Gatling&lt;/th&gt;
&lt;th&gt;Locust&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licencia&lt;/td&gt;
&lt;td&gt;Apache 2.0; gRPC, MQTT y GraphQL con una licencia de componente aparte (&lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;repositorio&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;MIT (&lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;repositorio&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entorno de ejecución&lt;/td&gt;
&lt;td&gt;JVM, OpenJDK LTS 11 a 25 (versión 3.16.0)&lt;/td&gt;
&lt;td&gt;Python 3.11 o posterior (versión 2.46.7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Código de prueba&lt;/td&gt;
&lt;td&gt;Java, Kotlin, Scala, JavaScript o TypeScript&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocolos integrados&lt;/td&gt;
&lt;td&gt;HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events, JMS&lt;/td&gt;
&lt;td&gt;HTTP y HTTPS; otros mediante un cliente de Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modelo de carga&lt;/td&gt;
&lt;td&gt;Perfiles de inyección abiertos o cerrados&lt;/td&gt;
&lt;td&gt;Un pool de usuarios, es decir, un modelo cerrado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Criterios de aprobación&lt;/td&gt;
&lt;td&gt;Aserciones, evaluadas después de la ejecución&lt;/td&gt;
&lt;td&gt;Código de salida 1 si fallan peticiones, o tu propio listener&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Informes&lt;/td&gt;
&lt;td&gt;Informe HTML después de cada ejecución&lt;/td&gt;
&lt;td&gt;Gráficos en vivo en la interfaz web, archivos CSV, informe HTML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escalado&lt;/td&gt;
&lt;td&gt;Gatling Enterprise&lt;/td&gt;
&lt;td&gt;Modo master y workers integrado, operador de Kubernetes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Cuál es la diferencia entre Gatling y Locust?&lt;/h2&gt;
&lt;p&gt;Gatling ejecuta simulaciones en la JVM y Locust ejecuta programas de Python normales. Gatling trae de serie un modelo de carga y un informe, y en Locust escribes tú mismo la lógica de la prueba.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README&lt;/a&gt; de Gatling describe un motor no bloqueante construido sobre Netty y un SDK en cinco lenguajes: Java, Kotlin y Scala se ejecutan con Maven, Gradle o sbt, y JavaScript y TypeScript con un SDK aparte. Su &lt;a href=&quot;https://docs.gatling.io/reference/deploy/install-local/&quot;&gt;página de instalación&lt;/a&gt; pide un OpenJDK LTS de 64 bits de la 11 a la 25, y Node.js 24 o posterior para el SDK de JavaScript.&lt;/p&gt;
&lt;p&gt;El README de Locust lo presenta como una forma de escribir pruebas de carga escalables en Python puro, y sus &lt;a href=&quot;https://raw.githubusercontent.com/locustio/locust/master/pyproject.toml&quot;&gt;metadatos del paquete&lt;/a&gt; exigen Python 3.11 o posterior. La página &lt;a href=&quot;https://docs.locust.io/en/stable/what-is-locust.html&quot;&gt;What is Locust&lt;/a&gt; dice que se basa en eventos con gevent, así que un solo proceso puede manejar muchos miles de usuarios concurrentes (comprobado el 13 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo se escribe la misma prueba en cada herramienta?&lt;/h2&gt;
&lt;p&gt;En Gatling encadenas peticiones en un escenario y le das un perfil de inyección. En Locust escribes una clase de usuario con tareas y un tiempo de espera entre ellas.&lt;/p&gt;
&lt;p&gt;Cincuenta usuarios concurrentes que listan usuarios y luego esperan de uno a tres segundos, durante cinco minutos. Con el SDK de Java de Gatling (imports omitidos):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class ApiSimulation extends Simulation {
  HttpProtocolBuilder api =
      http.baseUrl(&amp;quot;https://staging.example.com&amp;quot;);

  ScenarioBuilder users = scenario(&amp;quot;API users&amp;quot;)
      .exec(http(&amp;quot;list users&amp;quot;).get(&amp;quot;/api/users&amp;quot;))
      .pause(1, 3);

  {
    setUp(users.injectClosed(
        constantConcurrentUsers(50).during(300)))
      .protocols(api);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La misma prueba en Locust:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from locust import HttpUser, task, between


class ApiUser(HttpUser):
    wait_time = between(1, 3)

    @task
    def list_users(self):
        self.client.get(&amp;quot;/api/users&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;referencia de inyección&lt;/a&gt; de Gatling incluye &lt;code&gt;constantConcurrentUsers&lt;/code&gt; entre los pasos del modelo cerrado. Locust recibe el número de usuarios y la duración como opciones (comprobado el 13 de octubre de 2026):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;locust -f locustfile.py --headless -u 50 -r 5 -t 5m \
  --host https://staging.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;¿Cómo modelan la carga Gatling y Locust?&lt;/h2&gt;
&lt;p&gt;Gatling ofrece modelos abiertos y cerrados, según el método que llames. Locust ejecuta un pool de usuarios, lo que equivale a un modelo cerrado.&lt;/p&gt;
&lt;p&gt;La página de &lt;a href=&quot;https://docs.gatling.io/testing-concepts/workload-models/&quot;&gt;modelos de carga&lt;/a&gt; de Gatling define los sistemas cerrados como los que limitan los usuarios concurrentes, y los abiertos como aquellos en los que los usuarios siguen llegando aunque la aplicación responda despacio. Añade que la mayoría de los sitios web son abiertos. &lt;code&gt;injectOpen&lt;/code&gt; recibe tasas de llegada e &lt;code&gt;injectClosed&lt;/code&gt; objetivos de concurrencia.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;guía del locustfile&lt;/a&gt; dice que el tiempo de espera solo puede limitar el rendimiento y no lanza usuarios nuevos para alcanzar una tasa objetivo. Si una vuelta tarda más de lo que permite la espera, la tasa queda por debajo del objetivo (comprobado el 13 de octubre de 2026). Nuestra guía sobre el &lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;modelo de carga abierto vs cerrado&lt;/a&gt; explica por qué importa.&lt;/p&gt;
&lt;h2&gt;¿Cómo se ejecuta una prueba mayor de lo que genera una sola máquina?&lt;/h2&gt;
&lt;p&gt;Locust trae el modo distribuido integrado. La edición open source de Gatling genera carga desde una sola máquina, y las ejecuciones distribuidas requieren Gatling Enterprise.&lt;/p&gt;
&lt;p&gt;Locust arranca un proceso con &lt;code&gt;--master&lt;/code&gt; y tantos procesos &lt;code&gt;--worker&lt;/code&gt; como quieras. Según los &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;docs de carga distribuida&lt;/a&gt;, un proceso de Python no usa más de un núcleo, así que se ejecuta un worker por núcleo, y &lt;code&gt;--processes&lt;/code&gt; arranca varios en una máquina. Un &lt;a href=&quot;https://docs.locust.io/en/stable/kubernetes-operator.html&quot;&gt;operador de Kubernetes&lt;/a&gt; gestiona las ejecuciones distribuidas dentro de un clúster.&lt;/p&gt;
&lt;p&gt;Las &lt;a href=&quot;https://docs.gatling.io/tutorials/faq/&quot;&gt;preguntas frecuentes&lt;/a&gt; de Gatling dicen que la Community Edition no admite pruebas distribuidas, y el README describe Enterprise como una ejecución en generadores de carga gestionados o en infraestructura privada (comprobado el 13 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;Hay una salida para ambas. LoadFocus, que publica este sitio, no ejecuta simulaciones de Gatling ni pruebas de Locust. Si prefieres no ejecutar ninguna de las dos a gran escala, ejecuta &lt;a href=&quot;https://loadfocus.com/es-es/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-vs-locust&quot;&gt;scripts de k6&lt;/a&gt; y &lt;a href=&quot;https://loadfocus.com/es-es/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-vs-locust&quot;&gt;planes de prueba de JMeter&lt;/a&gt; desde 25 regiones en la nube. Su validador de k6 avisa de que los escenarios de tasa de llegada se ejecutan allí con un número fijo de usuarios, así que no mantienen un ritmo de peticiones. Pasar de cualquiera de las dos herramientas a esas obliga a reescribir la prueba.&lt;/p&gt;
&lt;h2&gt;¿Cómo deciden si una prueba ha pasado, y qué informes obtienes?&lt;/h2&gt;
&lt;p&gt;Gatling evalúa las aserciones después de la ejecución y escribe un informe HTML cada vez. Locust termina con el código 1 si falló alguna petición, y otras comprobaciones las añades como listener.&lt;/p&gt;
&lt;p&gt;Las &lt;a href=&quot;https://docs.gatling.io/concepts/assertions/&quot;&gt;aserciones&lt;/a&gt; de Gatling se evalúan después de la simulación, y una sola aserción fallida hace fallar la simulación. Su &lt;a href=&quot;https://docs.gatling.io/reference/stats/reports/oss/&quot;&gt;informe HTML&lt;/a&gt; muestra percentiles del tiempo de respuesta, usuarios iniciados por segundo, usuarios concurrentes y peticiones por segundo.&lt;/p&gt;
&lt;p&gt;Según los &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;docs headless&lt;/a&gt; de Locust, la ejecución termina con el código 1 si alguna muestra falló, y un ejemplo de listener hace fallar la ejecución por el ratio de fallos, el tiempo de respuesta medio o el percentil 95. La &lt;a href=&quot;https://docs.locust.io/en/stable/configuration.html&quot;&gt;referencia de configuración&lt;/a&gt; menciona &lt;code&gt;--csv&lt;/code&gt; para archivos de estadísticas y &lt;code&gt;--html&lt;/code&gt; para un informe (comprobado el 13 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Qué protocolos puede probar cada herramienta?&lt;/h2&gt;
&lt;p&gt;Gatling trae más protocolos, con límites en los más nuevos. Locust trae HTTP y HTTPS y espera un cliente de Python para el resto.&lt;/p&gt;
&lt;p&gt;El README de Gatling enumera HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events y JMS bajo Apache 2.0 sin límites. gRPC, MQTT y GraphQL están bajo la Gatling Enterprise Component License, y las pruebas con ellos quedan limitadas a 5 usuarios concurrentes y 5 minutos en la Community Edition.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;página sobre otros sistemas&lt;/a&gt; de Locust muestra cómo envolver una librería de protocolo y notificar cada llamada, con ejemplos de gRPC y MQTT. La librería tiene que funcionar con gevent, que no puede parchear la E/S hecha en código C compilado, y locust-plugins añade usuarios para Kafka, Selenium y Playwright (comprobado el 13 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cuál deberías elegir?&lt;/h2&gt;
&lt;p&gt;Elige según el lenguaje y la forma de cargar el sistema. Gatling encaja con equipos JVM y pruebas en modelo abierto, y Locust con equipos Python y pruebas con lógica propia.&lt;/p&gt;
&lt;p&gt;Elige Gatling en lugar de Locust si tu equipo vive en la JVM y quiere pruebas en Java, Kotlin o Scala construidas con Maven, Gradle o sbt, si necesitas un modelo abierto como una tasa de llegada fija, si necesitas JMS o Server-Sent Events, o si quieres aserciones y un informe sin código adicional.&lt;/p&gt;
&lt;p&gt;Elige Locust en lugar de Gatling si tu equipo escribe Python y quiere que las pruebas reutilicen un cliente interno de Python, si quieres una interfaz web para iniciar una ejecución y cambiar la carga mientras corre, si necesitas el modo distribuido en la herramienta gratuita, o si el sistema recibe sobre todo usuarios que esperan y tu protocolo tiene una librería de Python compatible con gevent.&lt;/p&gt;
&lt;p&gt;Para un constructor de pruebas con interfaz gráfica mira JMeter, y para un solo binario sin JVM ni Python mira k6.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Es Gatling más rápido que Locust?&lt;/strong&gt;
No lo hemos medido nosotros, así que no vamos a nombrar un ganador. La comparación justa es el mismo escenario con las dos herramientas en tu propio hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede Locust ejecutar simulaciones de Gatling?&lt;/strong&gt;
No según la documentación de Locust, que describe las pruebas solo como código Python. Una simulación de Gatling hay que reescribirla como locustfile, y lo mismo vale a la inversa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede LoadFocus ejecutar pruebas de Gatling o de Locust?&lt;/strong&gt;
No. LoadFocus ejecuta planes de prueba de JMeter y scripts de k6. Para repartir una simulación de Gatling entre varias máquinas usa Gatling Enterprise, y para Locust su modo master y workers o su operador de Kubernetes.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-load-testing/&quot;&gt;Pruebas de carga con Gatling: la herramienta JVM a fondo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/locust-load-testing/&quot;&gt;Pruebas de carga con Locust: análisis de la herramienta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-vs-k6/&quot;&gt;Gatling vs k6: ¿simulaciones en la JVM o un binario Go?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/locust-vs-jmeter/&quot;&gt;Locust vs JMeter: ¿scripts de Python o planes de JMeter?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;Modelo de carga abierto vs cerrado: cuál usar y cuándo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>JMeter vs Postman: ¿qué herramienta para pruebas de carga?</title><link>https://loadtest.app/es/jmeter-vs-postman/</link><guid isPermaLink="true">https://loadtest.app/es/jmeter-vs-postman/</guid><description>JMeter vs Postman en pruebas de carga: qué hacen los usuarios virtuales, la nube y los precios de Postman, sus límites y cuándo elegir JMeter.</description><pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, que vende un servicio de pruebas de carga que aparece en este artículo.&lt;/p&gt;&lt;p&gt;Postman es un cliente de API pensado para comprobaciones funcionales, colecciones y trabajo en equipo, al que se ha añadido un modo de pruebas de rendimiento. Apache JMeter es un generador de carga desde el principio. Usa Postman si quieres reutilizar la colección que ya tienes para una prueba de carga rápida o un smoke test en CI. Usa JMeter cuando la prueba de carga es el trabajo principal: muchos protocolos, grandes cantidades de usuarios, informes detallados y generación de carga distribuida.&lt;/p&gt;
&lt;p&gt;Los datos sobre Postman salen de su documentación y de su página de precios, y los de JMeter del sitio del propio proyecto, todos comprobados el 13 de octubre de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Postman&lt;/th&gt;
&lt;th&gt;Apache JMeter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Propósito principal&lt;/td&gt;
&lt;td&gt;Cliente de API, pruebas funcionales y de colecciones, con modo de rendimiento&lt;/td&gt;
&lt;td&gt;Pruebas de carga y de rendimiento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Definición de la prueba&lt;/td&gt;
&lt;td&gt;Una colección de peticiones con scripts y aserciones &lt;code&gt;pm.test()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Un plan de prueba creado en una GUI y guardado como archivo &lt;code&gt;.jmx&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usuarios virtuales&lt;/td&gt;
&lt;td&gt;Cada uno ejecuta la colección en bucle; las ejecuciones locales las limita tu máquina&lt;/td&gt;
&lt;td&gt;Un hilo de Java por usuario en un Thread Group&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perfiles de carga&lt;/td&gt;
&lt;td&gt;Fixed, Ramp up, Spike y Peak&lt;/td&gt;
&lt;td&gt;Thread Groups con periodo de rampa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;De dónde viene la carga&lt;/td&gt;
&lt;td&gt;Tu máquina o un runner de CI, o la nube de Postman en planes de pago&lt;/td&gt;
&lt;td&gt;Tu máquina, o servidores JMeter remotos que gestionas tú&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coste de la carga&lt;/td&gt;
&lt;td&gt;Ejecuciones locales en todos los planes; ejecuciones en la nube a 0,04 $ por hora de usuario virtual&lt;/td&gt;
&lt;td&gt;Gratis, licencia Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aprobado o suspendido en CI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;postman performance run&lt;/code&gt; con &lt;code&gt;--pass-if&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Modo CLI (&lt;code&gt;jmeter -n&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Qué hacen las pruebas de rendimiento de Postman?&lt;/h2&gt;
&lt;p&gt;Ejecutan las peticiones de una colección con varios usuarios virtuales en paralelo, durante un número de minutos fijado. Cada usuario repite las peticiones en orden, y tus scripts y aserciones actuales se ejecutan bajo carga.&lt;/p&gt;
&lt;p&gt;Según la &lt;a href=&quot;https://learning.postman.com/docs/tests-and-scripts/performance-testing/testing-api-performance&quot;&gt;documentación de pruebas de rendimiento&lt;/a&gt;, la colección de tus pruebas funcionales es también tu prueba de carga, sin un script ni un lenguaje aparte que mantener (comprobado el 13 de octubre de 2026). Eliges una duración y un número de usuarios virtuales, y luego un perfil Fixed, Ramp up, Spike o Peak, como describe la &lt;a href=&quot;https://learning.postman.com/docs/tests-and-scripts/performance-testing/performance-test-configuration&quot;&gt;página de configuración&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;¿Cuáles son los límites de Postman para pruebas de carga?&lt;/h2&gt;
&lt;p&gt;El límite principal es de dónde viene la carga. Una ejecución local queda limitada por la máquina que la lanza, y lo que vaya más allá requiere un plan de pago.&lt;/p&gt;
&lt;p&gt;Para las ejecuciones locales, la documentación de Postman dice que el número de usuarios virtuales depende de los recursos del sistema y de la colección usada, que los scripts de pre-request y post-response reducen los usuarios que se pueden simular, y que la ejecución se detiene si la máquina supera su umbral de recursos. Sugiere una primera prueba de 10 a 20 usuarios virtuales (comprobado el 13 de octubre de 2026). Pasado ese punto, el propio generador de carga puede distorsionar tus medidas, y por eso Postman muestra también los picos de CPU y memoria de la máquina de prueba.&lt;/p&gt;
&lt;p&gt;Los datos son el siguiente límite. Según la misma página de configuración, los archivos de datos CSV y JSON solo funcionan en ejecuciones locales, mientras que los datasets funcionan en locales y en la nube.&lt;/p&gt;
&lt;h2&gt;¿Cuánto cuesta hacer pruebas de carga con Postman?&lt;/h2&gt;
&lt;p&gt;Las ejecuciones de rendimiento locales van incluidas en todos los planes. Las ejecuciones en la nube son para planes de pago y se facturan por uso, en horas de usuario virtual.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://www.postman.com/pricing/&quot;&gt;página de precios&lt;/a&gt; de Postman indica pruebas de rendimiento locales ilimitadas y pruebas de rendimiento en la nube a 0,04 $ por hora de usuario virtual (comprobado el 13 de octubre de 2026). A esa tarifa publicada, 500 usuarios virtuales durante una hora son 500 horas de usuario virtual, es decir, 20 $, además de la cuota del plan. Las direcciones IP estáticas para llegar a destinos tras un cortafuegos son una función de Enterprise. No hemos valorado los planes en sí: consulta la página para las cuotas actuales por usuario.&lt;/p&gt;
&lt;h2&gt;¿Qué protocolos se pueden probar?&lt;/h2&gt;
&lt;p&gt;JMeter tiene una lista larga y documentada. Para Postman no hemos encontrado una lista de protocolos admitidos en las ejecuciones de rendimiento, así que no afirmamos nada al respecto.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://jmeter.apache.org/&quot;&gt;página principal&lt;/a&gt; de JMeter cita HTTP y HTTPS, SOAP y REST, FTP, bases de datos mediante JDBC, LDAP, mensajería JMS, correo SMTP, POP3 e IMAP, comandos nativos y scripts de shell, TCP y objetos Java (comprobado el 13 de octubre de 2026). Postman maneja en la aplicación otros tipos de petición, como GraphQL, gRPC y WebSocket, pero eso no dice cuáles se ejecutan bajo carga. Prueba uno antes de depender de él.&lt;/p&gt;
&lt;h2&gt;¿Cómo se escala más allá de una máquina?&lt;/h2&gt;
&lt;p&gt;Postman escala con su propia nube, JMeter con servidores que gestionas tú. Lo primero es más fácil de empezar, lo segundo te da control.&lt;/p&gt;
&lt;p&gt;En un plan de pago, las ejecuciones en la nube de Postman reparten la carga entre workers gestionados, de modo que una sola máquina deja de limitar la prueba. El &lt;a href=&quot;https://jmeter.apache.org/usermanual/remote-test.html&quot;&gt;modo de pruebas remotas&lt;/a&gt; de JMeter permite que un cliente controle muchos servidores JMeter. Todos los nodos necesitan la misma versión de JMeter, un keystore para RMI sobre SSL salvo que lo desactives, y su propia copia de los archivos de datos (comprobado el 13 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;Hay una tercera vía para los planes de prueba de JMeter. LoadFocus, el editor de este sitio, &lt;a href=&quot;https://loadfocus.com/es-es/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=jmeter-vs-postman&quot;&gt;ejecuta tus planes de prueba de JMeter existentes&lt;/a&gt; desde 25 regiones en la nube. Subes el archivo &lt;code&gt;.jmx&lt;/code&gt; y fijas usuarios virtuales, duración y rampa, sin servidores remotos que configurar. LoadFocus solo ejecuta JMeter y k6, así que no ejecuta una colección de Postman.&lt;/p&gt;
&lt;h2&gt;¿Qué herramienta deberías elegir?&lt;/h2&gt;
&lt;p&gt;Elige Postman en lugar de JMeter para comprobaciones funcionales y de contrato, para un equipo que comparte colecciones en un espacio de trabajo y para una ejecución rápida de humo de una API que ya pruebas. Elige JMeter cuando la prueba de carga es el objetivo principal, o cuando necesitas varios protocolos, muchos usuarios o pruebas que viven en tu propio repositorio.&lt;/p&gt;
&lt;p&gt;Postman encaja en una comprobación corta en CI: &lt;code&gt;postman performance run&lt;/code&gt; termina con un código de salida distinto de cero cuando se incumple un umbral como el percentil 95, lo que hace fallar la compilación. JMeter es mejor para carga sobre bases de datos o mensajería, para pruebas de resistencia largas y para el panel HTML con tablas APDEX y de percentiles que describe &lt;a href=&quot;https://jmeter.apache.org/usermanual/generating-dashboard.html&quot;&gt;su documentación&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Muchos equipos usan ambas: Postman para construir y verificar las comprobaciones de la API, JMeter para dar volumen real a los flujos críticos.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Puede Postman sustituir a JMeter en pruebas de carga?&lt;/strong&gt;
Para comprobaciones pequeñas de APIs HTTP sí, porque la colección que ya tienes es la prueba. Con alta concurrencia, otros protocolos o ejecuciones largas, los límites documentados de las ejecuciones locales y el precio por uso de las ejecuciones en la nube hacen de JMeter la base más segura.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede Postman ejecutar un archivo .jmx de JMeter?&lt;/strong&gt;
No hemos encontrado nada en su documentación que importe un plan de prueba de JMeter. Las pruebas de rendimiento de Postman se construyen a partir de colecciones, así que habría que rehacer un archivo &lt;code&gt;.jmx&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Es gratis JMeter?&lt;/strong&gt;
Sí. La versión actual en la &lt;a href=&quot;https://jmeter.apache.org/download_jmeter.cgi&quot;&gt;página de descargas&lt;/a&gt; es la 5.6.3, que requiere Java 8 o posterior (comprobado el 13 de octubre de 2026). Pagas las máquinas que generan la carga, o un servicio en la nube que ejecute tus planes.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-source-load-testing-tools/&quot;&gt;Herramientas de pruebas de carga open source: seis opciones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter: ¿pruebas como código o un plan en GUI?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/locust-vs-jmeter/&quot;&gt;Locust vs JMeter: ¿scripts de Python o planes de JMeter?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/apdex-score/&quot;&gt;Puntuación Apdex: qué es y cómo se calcula&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>k6 vs Locust: ¿scripts JavaScript o usuarios Python?</title><link>https://loadtest.app/es/k6-vs-locust/</link><guid isPermaLink="true">https://loadtest.app/es/k6-vs-locust/</guid><description>k6 vs Locust comparados en licencia, lenguaje de scripts, modelos de carga, criterios de éxito, protocolos y escalado, con consejos para elegir.</description><pubDate>Tue, 13 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, que vende un servicio de pruebas de carga que aparece en este artículo.&lt;/p&gt;&lt;p&gt;k6 y Locust son dos herramientas de código abierto que mantienen una prueba de carga como código en tu repositorio, y cualquiera de las dos prueba bien una API HTTP bajo carga. Elige Locust si tu equipo escribe Python y quiere la lógica de la prueba en Python puro. Elige k6 si escribes JavaScript, quieres umbrales de éxito integrados o necesitas una prueba que mantenga una tasa de llegada.&lt;/p&gt;
&lt;p&gt;Los datos de esta comparación de k6 y Locust proceden de la documentación y del repositorio de cada proyecto, comprobados el 13 de octubre de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;k6&lt;/th&gt;
&lt;th&gt;Locust&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licencia&lt;/td&gt;
&lt;td&gt;AGPL-3.0 (&lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;repositorio&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;MIT (&lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;repositorio&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ejecución&lt;/td&gt;
&lt;td&gt;Un binario de Go con un motor JavaScript integrado (versión v2.3.0)&lt;/td&gt;
&lt;td&gt;Python 3.11 o posterior (versión 2.46.7)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scripts de prueba&lt;/td&gt;
&lt;td&gt;JavaScript, o TypeScript al que se le quitan los tipos&lt;/td&gt;
&lt;td&gt;Clases de Python en un locustfile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocolos integrados&lt;/td&gt;
&lt;td&gt;HTTP/1.1, HTTP/2, WebSockets, gRPC&lt;/td&gt;
&lt;td&gt;HTTP y HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modelo de carga&lt;/td&gt;
&lt;td&gt;Seis ejecutores, dos de ellos arrival-rate (modelo abierto)&lt;/td&gt;
&lt;td&gt;Un grupo de usuarios que esperan cada uno un tiempo (modelo cerrado)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Éxito o fallo&lt;/td&gt;
&lt;td&gt;Umbrales, que pueden abortar una ejecución antes&lt;/td&gt;
&lt;td&gt;Código de salida 1 si fallan peticiones; otros límites mediante un listener&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pruebas de navegador&lt;/td&gt;
&lt;td&gt;Módulo de navegador integrado&lt;/td&gt;
&lt;td&gt;Usuarios de navegador mediante el proyecto aparte &lt;a href=&quot;https://github.com/SvenskaSpel/locust-plugins&quot;&gt;locust-plugins&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escalado&lt;/td&gt;
&lt;td&gt;k6-operator en Kubernetes, o Grafana Cloud k6&lt;/td&gt;
&lt;td&gt;Master y workers, un operador de Kubernetes o Azure Load Testing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Cuál es la diferencia entre k6 y Locust?&lt;/h2&gt;
&lt;p&gt;La diferencia principal es el lenguaje en el que escribes las pruebas. k6 ejecuta JavaScript dentro de un programa de Go compilado, mientras que Locust ejecuta tu código Python y se apoya en gevent para muchos usuarios concurrentes.&lt;/p&gt;
&lt;p&gt;k6 se instala como &lt;a href=&quot;https://grafana.com/docs/k6/latest/set-up/install-k6/&quot;&gt;paquete o binario independiente&lt;/a&gt;, sin otro entorno de ejecución. También ejecuta archivos &lt;code&gt;.ts&lt;/code&gt;, aunque su &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/javascript-typescript-compatibility-mode/&quot;&gt;compatibilidad con TypeScript&lt;/a&gt; quita los tipos sin comprobarlos. Locust se instala con &lt;code&gt;pip install locust&lt;/code&gt;, y su página &lt;a href=&quot;https://docs.locust.io/en/stable/what-is-locust.html&quot;&gt;What is Locust&lt;/a&gt; dice que las pruebas son Python corriente que guardas en control de versiones como cualquier otro código (comprobado el 13 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo se escribe la misma prueba en cada herramienta?&lt;/h2&gt;
&lt;p&gt;Las dos expresan la prueba como un programa corto. Aquí va una prueba con 50 usuarios durante cinco minutos que falla si el percentil 95 supera los 500 ms o si más del 1 % de las peticiones fallan.&lt;/p&gt;
&lt;p&gt;En k6 los objetivos forman parte del script, como &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;umbrales&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;
import { sleep } from &amp;quot;k6&amp;quot;;

export const options = {
  vus: 50,
  duration: &amp;quot;5m&amp;quot;,
  thresholds: {
    http_req_duration: [&amp;quot;p(95)&amp;lt;500&amp;quot;],
    http_req_failed: [&amp;quot;rate&amp;lt;0.01&amp;quot;],
  },
};

export default function () {
  http.get(&amp;quot;https://staging.example.com/api/users&amp;quot;);
  sleep(1);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En Locust el usuario es una clase, y los mismos objetivos van en un listener, siguiendo el patrón de la &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;documentación del modo headless&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import logging
from locust import HttpUser, between, events, task


class ApiUser(HttpUser):
    wait_time = between(1, 2)

    @task
    def list_users(self):
        self.client.get(&amp;quot;/api/users&amp;quot;)


@events.quitting.add_listener
def _(environment, **kw):
    stats = environment.stats.total
    if stats.fail_ratio &amp;gt; 0.01:
        environment.process_exit_code = 1
    elif stats.get_response_time_percentile(0.95) &amp;gt; 500:
        environment.process_exit_code = 1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Se lanzan con &lt;code&gt;k6 run script.js&lt;/code&gt; y &lt;code&gt;locust -f locustfile.py --headless -u 50 -r 10 -t 5m --host https://staging.example.com&lt;/code&gt; (comprobado el 13 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo modelan la carga k6 y Locust?&lt;/h2&gt;
&lt;p&gt;k6 admite los dos modelos de carga, mientras que Locust describe la carga como un número fijo de usuarios. En k6 eliges el modelo con el ejecutor, y en Locust con el número de usuarios y el tiempo de espera.&lt;/p&gt;
&lt;p&gt;k6 tiene &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/&quot;&gt;seis ejecutores&lt;/a&gt;. Cuatro son cerrados: un usuario virtual empieza su siguiente iteración solo cuando termina la anterior. Los dos ejecutores arrival-rate siguen el &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/open-vs-closed/&quot;&gt;modelo abierto&lt;/a&gt;, en el que las iteraciones empiezan con independencia de lo que tarden las anteriores. La &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;guía del locustfile&lt;/a&gt; dice que el tiempo de espera solo puede limitar el rendimiento y no puede lanzar usuarios nuevos para alcanzar una tasa objetivo (comprobado el 13 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;Si tu objetivo es «300 peticiones llegan cada segundo, sea cual sea el tiempo de respuesta», k6 puede expresarlo directamente. Nuestra guía sobre el &lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;modelo de carga abierto y cerrado&lt;/a&gt; explica cuándo encaja cada uno.&lt;/p&gt;
&lt;h2&gt;¿Cómo deciden k6 y Locust si una prueba ha pasado?&lt;/h2&gt;
&lt;p&gt;k6 tiene los criterios de éxito como función central, y Locust deja la mayor parte a tu código. Un umbral de k6 incumplido termina la ejecución con un código de salida distinto de cero, y &lt;code&gt;abortOnFail&lt;/code&gt; detiene la prueba en cuanto falla.&lt;/p&gt;
&lt;p&gt;Locust termina con código 1 si alguna petición ha fallado. Para límites sobre la tasa de fallos, la media o el percentil 95, su documentación muestra un listener como el de arriba, que fija el código de salida por su cuenta (comprobado el 13 de octubre de 2026). Nuestra guía sobre los &lt;a href=&quot;https://loadtest.app/es/load-test-pass-fail-criteria/&quot;&gt;criterios de aprobación de una prueba de carga&lt;/a&gt; ayuda a elegir los límites.&lt;/p&gt;
&lt;h2&gt;¿Qué protocolos cubre cada herramienta?&lt;/h2&gt;
&lt;p&gt;k6 incluye cuatro protocolos y un módulo de navegador; Locust incluye HTTP y HTTPS y te deja envolver cualquier cliente de Python para el resto.&lt;/p&gt;
&lt;p&gt;k6 enumera HTTP/1.1, HTTP/2, WebSockets y gRPC como &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/protocols/&quot;&gt;protocolos integrados&lt;/a&gt;, con más mediante extensiones xk6, y un &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6-browser/&quot;&gt;módulo de navegador&lt;/a&gt; que maneja un navegador basado en Chromium. La página de Locust sobre &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;otros sistemas&lt;/a&gt; dice que solo trae soporte integrado para HTTP/HTTPS, pero que se puede extender para probar casi cualquier sistema, envolviendo una biblioteca de protocolo e informando de cada llamada como una petición. La biblioteca debe cooperar con gevent (comprobado el 13 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo se ejecuta una prueba mayor de lo que genera una máquina?&lt;/h2&gt;
&lt;p&gt;Locust escala con un master y workers, y k6 con un operador de Kubernetes o un servicio alojado. Ambos pueden repartir una prueba entre muchas máquinas.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;documentación del modo distribuido&lt;/a&gt; de Locust dice que un proceso puede hacer más de mil peticiones por segundo con un plan de prueba sencillo, así que las pruebas mayores usan un worker por núcleo de procesador en tantas máquinas como haga falta. El &lt;a href=&quot;https://grafana.com/docs/k6/latest/testing-guides/running-distributed-tests/&quot;&gt;k6-operator&lt;/a&gt; reparte una prueba entre varias instancias de k6 en un clúster de Kubernetes, y Grafana Cloud k6 es la vía alojada (comprobado el 13 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;Hay una tercera vía para los scripts de k6. LoadFocus, que publica este sitio, &lt;a href=&quot;https://loadfocus.com/es-es/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=k6-vs-locust&quot;&gt;ejecuta scripts de k6&lt;/a&gt; desde 25 regiones en la nube, con los usuarios y la duración tomados de los ajustes de la prueba. Su validador de scripts avisa de que los escenarios arrival-rate se ejecutan allí con un número fijo de usuarios, de modo que un script de modelo abierto no mantiene su tasa de llegada en LoadFocus. LoadFocus no ejecuta Locust: solo ejecuta scripts de k6 y planes de prueba de JMeter.&lt;/p&gt;
&lt;h2&gt;¿Qué informes se obtienen?&lt;/h2&gt;
&lt;p&gt;k6 imprime un resumen al final de la prueba y puede exportar un informe HTML desde su panel web. Locust muestra gráficos en vivo en su interfaz web y escribe archivos si se lo pides.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://grafana.com/docs/k6/latest/results-output/end-of-test/&quot;&gt;resumen de fin de prueba&lt;/a&gt; de k6 sale por la terminal, y su &lt;a href=&quot;https://grafana.com/docs/k6/latest/results-output/web-dashboard/&quot;&gt;panel web&lt;/a&gt; exporta un informe HTML autónomo cuando defines &lt;code&gt;K6_WEB_DASHBOARD_EXPORT&lt;/code&gt;. Locust ofrece una interfaz web en el puerto 8089 con gráficos en vivo, y su &lt;a href=&quot;https://docs.locust.io/en/stable/configuration.html&quot;&gt;referencia de configuración&lt;/a&gt; lista las salidas &lt;code&gt;--csv&lt;/code&gt;, &lt;code&gt;--html&lt;/code&gt; y &lt;code&gt;--json&lt;/code&gt; (comprobado el 13 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cuál deberías elegir?&lt;/h2&gt;
&lt;p&gt;Locust encaja con equipos de Python, y k6 con equipos que quieren umbrales integrados y un modelo de carga abierto. Los protocolos y el escalado deciden la mayoría de los demás casos.&lt;/p&gt;
&lt;p&gt;Elige Locust en lugar de k6 si tu equipo escribe Python y quiere bucles, ramas, datos generados y su propio cliente de API en Python puro, si quieres reutilizar bibliotecas de Python para un protocolo, o si quieres una interfaz web con gráficos en vivo para explorar un sistema. Elige k6 en lugar de Locust si tu equipo escribe JavaScript o TypeScript, si los umbrales deben hacer fallar una compilación de CI y detener pronto una mala ejecución, si necesitas una tasa de llegada constante, o si quieres gRPC y pruebas de navegador en la misma herramienta.&lt;/p&gt;
&lt;p&gt;Para una visión más amplia, consulta nuestra reseña de las &lt;a href=&quot;https://loadtest.app/es/locust-load-testing/&quot;&gt;pruebas de carga con Locust&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Es Locust más rápido que k6?&lt;/strong&gt;
No lo hemos medido nosotros, así que no nombramos un ganador. La prueba justa es el mismo escenario con ambas herramientas en tu propio hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede Locust ejecutar scripts de k6?&lt;/strong&gt;
No según la documentación de Locust, que describe las pruebas como código Python en un locustfile. Un script de k6 es JavaScript, así que hay que reescribirlo como una clase de usuario de Python, y los umbrales pasan a ser un listener.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede LoadFocus ejecutar pruebas de Locust?&lt;/strong&gt;
No. LoadFocus ejecuta scripts de k6 y planes de prueba de JMeter. Para escalar una prueba de Locust, usa su modo master y workers, el operador de Kubernetes o Azure Load Testing.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/locust-load-testing/&quot;&gt;Pruebas de carga con Locust: la herramienta de Python a fondo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/locust-vs-jmeter/&quot;&gt;Locust vs JMeter: ¿scripts de Python o planes de prueba de JMeter?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-vs-k6/&quot;&gt;Gatling vs k6: ¿simulaciones JVM o un binario de Go?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/k6-vs-artillery/&quot;&gt;k6 vs Artillery: qué herramienta de pruebas de carga elegir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;Modelo de carga abierto vs cerrado: ¿cuál usar?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/azure-load-testing/&quot;&gt;Azure Load Testing: análisis del servicio de Microsoft&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Coordinated omission: qué es y cómo evitarla</title><link>https://loadtest.app/es/coordinated-omission/</link><guid isPermaLink="true">https://loadtest.app/es/coordinated-omission/</guid><description>Coordinated omission explicada: por qué un generador que espera las respuestas lentas las oculta, cómo detectarla y cómo la evitan wrk2, k6 y JMeter.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, un servicio de pruebas de carga mencionado en este artículo.&lt;/p&gt;&lt;p&gt;La coordinated omission es un error de medición: un generador de carga espera cada respuesta lenta antes de enviar su siguiente petición, así que envía menos justo cuando el sistema va lento y registra muy pocos de los peores momentos. Los percentiles que lees después parecen mejores que lo que vivieron los usuarios. Se evita enviando las peticiones según una programación que ignora los tiempos de respuesta y midiendo cada petición desde el momento en que debía salir.&lt;/p&gt;
&lt;p&gt;Los datos sobre las herramientas salen de la documentación o el repositorio de cada proyecto, comprobados el 9 de octubre de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Herramienta&lt;/th&gt;
&lt;th&gt;Qué ofrece&lt;/th&gt;
&lt;th&gt;Qué revisar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;wrk2&lt;/td&gt;
&lt;td&gt;Una tasa constante (&lt;code&gt;-R&lt;/code&gt;), latencia medida desde el envío previsto&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--u_latency&lt;/code&gt; añade la vista sin corregir&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HdrHistogram&lt;/td&gt;
&lt;td&gt;Dos métodos que rellenan las muestras que faltan&lt;/td&gt;
&lt;td&gt;Aplicar solo uno, nunca los dos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;Los ejecutores arrival-rate&lt;/td&gt;
&lt;td&gt;El contador &lt;code&gt;dropped_iterations&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;Pasos de &lt;code&gt;injectOpen&lt;/code&gt; como &lt;code&gt;constantUsersPerSec&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Que los pasos estén dentro de &lt;code&gt;injectOpen&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;&lt;code&gt;constant_throughput&lt;/code&gt; marca el ritmo de cada usuario&lt;/td&gt;
&lt;td&gt;La tasa lograda frente al objetivo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;Open Model Thread Group (5.5 o posterior, experimental)&lt;/td&gt;
&lt;td&gt;Un Thread Group normal es un pool cerrado&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Qué es la coordinated omission?&lt;/h2&gt;
&lt;p&gt;Es el error que aparece cuando el lado que mide deja de tomar muestras porque el sistema va lento, de modo que las muestras que faltan son justo las lentas. Perder muestras al azar apenas mueve un percentil; perderlas al compás de una ralentización los distorsiona todos.&lt;/p&gt;
&lt;p&gt;El nombre viene de Gil Tene, cuyo &lt;a href=&quot;https://groups.google.com/g/mechanical-sympathy/c/icNZJejUHfE&quot;&gt;mensaje de 2013 en una lista de correo&lt;/a&gt; traza esa misma línea. Es el autor original de &lt;a href=&quot;https://hdrhistogram.github.io/HdrHistogram/&quot;&gt;HdrHistogram&lt;/a&gt;, wrk2 está en su cuenta de GitHub y la documentación de ambos proyectos explica el efecto (comprobado el 9 de octubre de 2026). La documentación de k6 usa el término para un modelo de carga cerrado que frena su propia carga, una causa frecuente. Nuestro artículo sobre el &lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;modelo de carga abierto vs cerrado&lt;/a&gt; trata esa elección; este se centra en la medición.&lt;/p&gt;
&lt;h2&gt;¿Cómo acaba una prueba de carga ocultando las respuestas lentas?&lt;/h2&gt;
&lt;p&gt;Un generador en bucle cerrado envía la siguiente petición por una conexión solo cuando llega la respuesta anterior. Si una respuesta tarda un segundo, esa conexión no envía nada durante un segundo, y las peticiones que habría enviado nunca obtienen un tiempo de respuesta.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://github.com/giltene/wrk2&quot;&gt;README de wrk2&lt;/a&gt; lo dice del modelo de wrk, que mide cada petición desde el primer byte enviado hasta la respuesta completa: como una conexión solo envía tras una respuesta, el generador se coordina con el servidor y evita medir durante los periodos de alta latencia (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://github.com/HdrHistogram/HdrHistogram&quot;&gt;README de HdrHistogram&lt;/a&gt; plantea un experimento mental. Un sistema muestreado cada 10 ms responde en 1 ms durante 100 segundos y luego se queda parado 100 segundos, lo que deja una única muestra de 100 segundos. El histograma en bruto sitúa cerca del 99,99 % de los resultados en 1 ms o menos; corregido por las muestras bloqueadas, solo la mitad aproximadamente.&lt;/p&gt;
&lt;h2&gt;¿Cómo saber si tus resultados tienen coordinated omission?&lt;/h2&gt;
&lt;p&gt;Compara la tasa enviada con la prevista. Si la tasa de peticiones bajó mientras subían los tiempos de respuesta, el generador aflojó y el periodo lento está infrarrepresentado.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;La carga se definió en usuarios o conexiones, sin tasa.&lt;/strong&gt; Cualquier bucle cerrado puede provocar el error.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;La tasa de peticiones cae donde suben los tiempos de respuesta.&lt;/strong&gt; Un bache en la tasa durante un pico significa que hubo peticiones que nunca salieron.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El máximo es muchísimo mayor que el percentil 99.&lt;/strong&gt; Unas pocas muestras enormes entre miles de rápidas son el ejemplo anterior en miniatura. Lee toda la &lt;a href=&quot;https://loadfocus.com/docs/es-es/guides/load-testing/response-time-distribution?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=coordinated-omission&quot;&gt;distribución de tiempos de respuesta&lt;/a&gt;, sabiendo que solo cuenta las peticiones enviadas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Al generador de carga le faltó CPU.&lt;/strong&gt; LoadFocus documenta que un motor cerca del 100 % de CPU no puede enviar a la tasa configurada, y sus resultados muestran un aviso de &lt;a href=&quot;https://loadfocus.com/docs/es-es/guides/load-testing/load-generator-saturation?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=coordinated-omission&quot;&gt;saturación del generador de carga&lt;/a&gt; cuando algún motor alcanzó o superó el 80 % de CPU en su pico.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;¿Cómo evita wrk2 la coordinated omission?&lt;/h2&gt;
&lt;p&gt;Envía a tasa constante y mide cada petición desde el momento en que el plan decía que debía salir. Una petición que sale tarde porque su conexión estaba ocupada carga con la espera.&lt;/p&gt;
&lt;p&gt;wrk2 añade a wrk un argumento de tasa (&lt;code&gt;-R&lt;/code&gt;, peticiones por segundo en total) y registra las latencias en un HdrHistogram. &lt;code&gt;--u_latency&lt;/code&gt; añade al informe el histograma sin corregir, marcado como CO, como en el ejemplo del propio README:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wrk -t2 -c100 -d30s -R2000 --u_latency http://127.0.0.1:80/index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En el segundo ejemplo del README, una pausa del servidor de 1,4 segundos durante una prueba de 30 segundos hizo que el percentil 99 corregido fuera 200 veces el no corregido. El README también califica el proyecto de experimental y advierte que las pruebas de menos de 10 a 20 segundos pueden no ser útiles (comprobado el 9 de octubre de 2026). Nuestra &lt;a href=&quot;https://loadtest.app/es/http-benchmarking-tools/&quot;&gt;comparativa de herramientas de benchmark HTTP&lt;/a&gt; compara wrk2 con hey, oha y otras.&lt;/p&gt;
&lt;h2&gt;¿Cómo corrige HdrHistogram las latencias registradas?&lt;/h2&gt;
&lt;p&gt;Si conoces el intervalo al que debían salir las peticiones, añade las muestras que una respuesta larga bloqueó. La corrección se aplica al registrar o después, sobre una copia.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;recordValueWithExpectedInterval&lt;/code&gt; registra un valor y, si supera el intervalo, añade valores que bajan en pasos de ese intervalo. &lt;code&gt;copyCorrectedForCoordinatedOmission&lt;/code&gt; devuelve una copia corregida de un histograma terminado. El &lt;a href=&quot;https://hdrhistogram.github.io/HdrHistogram/JavaDoc/org/HdrHistogram/AbstractHistogram.html&quot;&gt;JavaDoc&lt;/a&gt; describe los dos métodos como mutuamente excluyentes (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;// intervalo previsto: 10 ms, valores en microsegundos
Histogram h = new Histogram(3);
h.recordValueWithExpectedInterval(latencyUs, 10_000);

// o, tras la prueba, sobre un histograma en bruto:
Histogram fixed = raw.copyCorrectedForCoordinatedOmission(10_000);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La corrección vale lo que vale el intervalo que le pasas. Encaja, por tanto, con un generador que debía enviar a un ritmo constante.&lt;/p&gt;
&lt;h2&gt;¿Cómo lo resuelven k6, Gatling, Locust y JMeter?&lt;/h2&gt;
&lt;p&gt;k6, Gatling y JMeter pueden iniciar trabajo según una programación que no espera respuestas. Locust marca el ritmo de cada usuario, pero no puede lanzar usuarios extra para mantener una tasa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;k6.&lt;/strong&gt; En los ejecutores arrival-rate, &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/constant-arrival-rate/&quot;&gt;las iteraciones empiezan con independencia de la respuesta del sistema&lt;/a&gt; mientras haya un usuario virtual libre. Cuando no lo hay, k6 se salta la iteración y la cuenta en &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/dropped-iterations/&quot;&gt;&lt;code&gt;dropped_iterations&lt;/code&gt;&lt;/a&gt;, lo que, avanzada la prueba, puede indicar que el sistema se degrada (comprobado el 9 de octubre de 2026). Una iteración descartada no tiene tiempo de respuesta, así que lee ese contador junto a los percentiles. En LoadFocus, los escenarios de tasa de llegada de los &lt;a href=&quot;https://loadfocus.com/es-es/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=coordinated-omission&quot;&gt;scripts de k6&lt;/a&gt; se ejecutan con un número fijo de usuarios, es decir, como modelo cerrado. Ejecuta k6 por tu cuenta cuando la tasa de llegada sea lo que quieres probar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gatling.&lt;/strong&gt; Pasos como &lt;code&gt;constantUsersPerSec&lt;/code&gt; dentro de &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;&lt;code&gt;injectOpen&lt;/code&gt;&lt;/a&gt; inician nuevos usuarios virtuales a una tasa fija, hayan terminado o no los anteriores (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Locust.&lt;/strong&gt; &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;&lt;code&gt;constant_throughput&lt;/code&gt;&lt;/a&gt; ajusta la espera de cada usuario para que ejecute una tarea como mucho un número dado de veces por segundo. La documentación dice que el tiempo de espera solo puede limitar la tasa y no lanza usuarios nuevos, y la &lt;a href=&quot;https://docs.locust.io/en/stable/api.html&quot;&gt;referencia de la API&lt;/a&gt; añade que tras una tarea que se pasa de su intervalo no hay espera. Una respuesta lenta retrasa igualmente a ese usuario (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JMeter.&lt;/strong&gt; Un &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Thread_Group&quot;&gt;Thread Group&lt;/a&gt; es un pool de hilos que repiten el plan en bucle, es decir, un bucle cerrado. JMeter 5.5 añadió el &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Open_Model_Thread_Group&quot;&gt;Open Model Thread Group&lt;/a&gt;, experimental, que sigue una programación como &lt;code&gt;rate(1/sec) random_arrivals(2 min)&lt;/code&gt; y, según las &lt;a href=&quot;https://jmeter.apache.org/changes_history.html&quot;&gt;notas de versión&lt;/a&gt;, crea hilos según haga falta (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Elimina un modelo de carga abierto la coordinated omission?&lt;/h2&gt;
&lt;p&gt;Elimina la causa principal, un generador que espera antes de enviar. Quedan dos huecos: un generador sin usuarios o CPU suficientes se queda igualmente atrás respecto a su programación, y cada usuario de un recorrido de varios pasos sigue esperando sus propias respuestas.&lt;/p&gt;
&lt;p&gt;El primero se ve como iteraciones descartadas o como un motor saturado; en ambos casos, repite la prueba con más margen. El segundo viene con la mayoría de las pruebas HTTP: el README de wrk2 señala que enviar sin esperar solo sirve con protocolos no bloqueantes o con una petición por conexión, y por eso wrk2 corrige la medición del tiempo.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Quién le puso nombre a la coordinated omission?&lt;/strong&gt;
Gil Tene, el autor original de HdrHistogram, cuyo fork wrk2 de wrk está pensado para evitarla. Su mensaje de 2013 en la lista de correo mechanical-sympathy la describe como un problema al que él llama así.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Es la coordinated omission lo mismo que un modelo de carga cerrado?&lt;/strong&gt;
Están relacionados. Un modelo cerrado es una causa frecuente, porque cada usuario virtual espera su respuesta antes de volver a enviar, y el README de wrk2 también encuentra el efecto en código de monitorización.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Hay que corregir todos los histogramas de latencia?&lt;/strong&gt;
Solo si conoces el intervalo al que estaban previstas las peticiones, porque HdrHistogram lo necesita para rellenar las muestras que faltan. Aplica a un conjunto de datos uno de sus dos métodos de corrección, nunca los dos.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;Modelo de carga abierto vs cerrado: cuál usar y cuándo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/http-benchmarking-tools/&quot;&gt;Herramientas de benchmark HTTP: wrk, hey, oha, ab y más&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/load-test-pass-fail-criteria/&quot;&gt;Criterios de aprobación en pruebas de carga: cómo fijarlos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/throughput-vs-latency/&quot;&gt;Rendimiento vs latencia: cómo se relacionan bajo carga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/tail-latency/&quot;&gt;Latencia de cola: qué es y cómo medirla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/ycsb/&quot;&gt;YCSB: cargas de trabajo A-F, ejecución y límites&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Pruebas de carga con Gatling: la herramienta JVM a fondo</title><link>https://loadtest.app/es/gatling-load-testing/</link><guid isPermaLink="true">https://loadtest.app/es/gatling-load-testing/</guid><description>Pruebas de carga con Gatling: simulaciones, inyección abierta o cerrada, checks, aserciones, informe HTML, plugins de build, CI, límites y cuándo usar k6.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, que vende un servicio de pruebas de carga que aparece en este artículo.&lt;/p&gt;&lt;p&gt;Gatling es una herramienta gratuita de pruebas de carga con licencia Apache 2.0, en la que cada prueba es una simulación escrita como código que se ejecuta en la JVM y deja un informe HTML al terminar. Las pruebas de carga con Gatling encajan con equipos de desarrollo que quieren las pruebas en el repositorio, modelos de carga abiertos o cerrados y aserciones que hagan fallar el build. A los equipos que quieren un editor gráfico de pruebas o muchos protocolos les sirve mejor JMeter, y a los que quieren un único binario sin JVM, k6.&lt;/p&gt;
&lt;p&gt;No hemos ejecutado Gatling para este análisis. Los datos proceden de la documentación, el repositorio y las páginas de versiones de Gatling, comprobados el 9 de octubre de 2026, y las valoraciones son nuestras.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tema&lt;/th&gt;
&lt;th&gt;Gatling&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licencia&lt;/td&gt;
&lt;td&gt;Apache 2.0, salvo los plugins de gRPC, MQTT y GraphQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entorno&lt;/td&gt;
&lt;td&gt;JVM, OpenJDK LTS de 64 bits del 11 al 25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versión actual&lt;/td&gt;
&lt;td&gt;3.16.0 (29 de septiembre de 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pruebas escritas en&lt;/td&gt;
&lt;td&gt;Java, Kotlin, Scala, JavaScript, TypeScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocolos integrados&lt;/td&gt;
&lt;td&gt;HTTP/1.1, HTTP/2, WebSocket, SSE, JMS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resultados&lt;/td&gt;
&lt;td&gt;Informe HTML estático por ejecución&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build y CI&lt;/td&gt;
&lt;td&gt;Plugins para Maven, Gradle, sbt y npm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escalado&lt;/td&gt;
&lt;td&gt;Gatling Enterprise (comercial)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Quién desarrolla Gatling y sigue manteniéndose?&lt;/h2&gt;
&lt;p&gt;Gatling Corp, una empresa francesa, desarrolla Gatling y tiene sus derechos de autor. Se mantiene de forma activa, con tres versiones para la JVM en lo que va de 2026.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.gatling.io/project/licenses/project-licenses/&quot;&gt;página de licencias&lt;/a&gt; atribuye los derechos de autor a Gatling Corp. &lt;a href=&quot;https://repo1.maven.org/maven2/io/gatling/gatling-core/&quot;&gt;Maven Central&lt;/a&gt; recoge la 3.15.0 en febrero, la 3.15.1 en mayo y la 3.16.0 el 29 de septiembre de 2026, y el SDK de JavaScript llegó a la &lt;a href=&quot;https://github.com/gatling/gatling-js/releases/tag/v3.16.1&quot;&gt;3.16.1&lt;/a&gt; el 6 de octubre. Las &lt;a href=&quot;https://docs.gatling.io/release-notes/gatling/whats-new/3.16/&quot;&gt;notas de la versión 3.16&lt;/a&gt; añaden GraphQL y colas compartidas entre usuarios virtuales. El &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README&lt;/a&gt; presenta el repositorio como la Community Edition, de uso libre incluso comercial (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Qué necesitas para ejecutar Gatling?&lt;/h2&gt;
&lt;p&gt;Una JVM de 64 bits para Java, Kotlin o Scala, o Node.js para JavaScript y TypeScript. En ambos casos, la simulación en sí se ejecuta en una JVM.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.gatling.io/reference/deploy/install-local/&quot;&gt;página de instalación&lt;/a&gt; admite las versiones LTS de OpenJDK del 11 al 25 y excluye las JVM de 32 bits y OpenJ9. La &lt;a href=&quot;https://docs.gatling.io/integrations/build-tools/js-cli/&quot;&gt;CLI de JavaScript&lt;/a&gt; requiere Node.js 24 o posterior y descarga un paquete de ejecución de Gatling y, según el &lt;a href=&quot;https://github.com/gatling/gatling-js&quot;&gt;README de gatling-js&lt;/a&gt;, GraalVM (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo se estructura una simulación de Gatling?&lt;/h2&gt;
&lt;p&gt;Una simulación define escenarios, asigna a cada uno un perfil de inyección y les añade una configuración de protocolo, todo registrado en una sola llamada a &lt;code&gt;setUp&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;En la &lt;a href=&quot;https://docs.gatling.io/concepts/simulation/&quot;&gt;referencia de simulaciones&lt;/a&gt;, un escenario encadena peticiones con pausas, bucles y condiciones. Esta simulación en Java guarda el id de un producto obtenido en una búsqueda, hace una pausa de uno a tres segundos y abre el producto, mientras las llegadas suben a 20 usuarios por segundo y se mantienen diez minutos:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;public class ShopSimulation extends Simulation {

  HttpProtocolBuilder api =
      http.baseUrl(&amp;quot;https://staging.example.com&amp;quot;);

  ScenarioBuilder shoppers = scenario(&amp;quot;Shoppers&amp;quot;)
      .exec(http(&amp;quot;search&amp;quot;).get(&amp;quot;/api/products?q=lamp&amp;quot;)
          .check(jsonPath(&amp;quot;$[0].id&amp;quot;).saveAs(&amp;quot;id&amp;quot;)))
      .pause(1, 3)
      .exec(http(&amp;quot;product&amp;quot;).get(&amp;quot;/api/products/#{id}&amp;quot;));

  {
    setUp(shoppers.injectOpen(
        rampUsersPerSec(1).to(20).during(120),
        constantUsersPerSec(20).during(600)))
      .protocols(api)
      .assertions(
          global().responseTime().percentile(95.0).lt(800));
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Los imports se omiten, y &lt;code&gt;#{id}&lt;/code&gt; lee el valor guardado mediante el &lt;a href=&quot;https://docs.gatling.io/concepts/session/el/&quot;&gt;Expression Language&lt;/a&gt; de Gatling. &lt;a href=&quot;https://loadtest.app/es/gatling-vs-k6/&quot;&gt;Gatling vs k6&lt;/a&gt; muestra una simulación en JavaScript.&lt;/p&gt;
&lt;h2&gt;¿Conviene inyectar usuarios con un modelo abierto o cerrado?&lt;/h2&gt;
&lt;p&gt;Abierto, para la mayoría de sitios web y API, donde siguen llegando usuarios nuevos por mucho que se ralentice el sistema. El cerrado encaja con sistemas que limitan la concurrencia, como una cola de venta de entradas.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;referencia de inyección&lt;/a&gt; divide la API: &lt;code&gt;injectOpen&lt;/code&gt; recibe tasas de llegada como &lt;code&gt;rampUsersPerSec&lt;/code&gt;, e &lt;code&gt;injectClosed&lt;/code&gt;, objetivos de concurrencia como &lt;code&gt;constantConcurrentUsers&lt;/code&gt;. La &lt;a href=&quot;https://docs.gatling.io/testing-concepts/workload-models/&quot;&gt;página sobre modelos de carga&lt;/a&gt; dice que la mayoría de los sitios web se comportan como sistemas abiertos y que un perfil no puede mezclar ambos (comprobado el 9 de octubre de 2026). Nuestra guía sobre el &lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;modelo de carga abierto vs cerrado&lt;/a&gt; explica cómo elegir.&lt;/p&gt;
&lt;h2&gt;¿Cómo funcionan los checks, las aserciones y el informe?&lt;/h2&gt;
&lt;p&gt;Los checks verifican cada respuesta y pueden guardar valores de ella, mientras que las aserciones juzgan la ejecución completa cuando termina. Después, cada ejecución genera un informe HTML.&lt;/p&gt;
&lt;p&gt;Sin un check de estado explícito, Gatling &lt;a href=&quot;https://docs.gatling.io/reference/script/http/checks/&quot;&gt;comprueba&lt;/a&gt; que cada respuesta HTTP sea 2XX o 304. Las &lt;a href=&quot;https://docs.gatling.io/concepts/assertions/&quot;&gt;aserciones&lt;/a&gt; evalúan tiempos de respuesta, número de peticiones o peticiones por segundo, de forma global o por petición, y una sola aserción fallida hace fallar la simulación. El &lt;a href=&quot;https://docs.gatling.io/reference/stats/reports/oss/&quot;&gt;informe HTML&lt;/a&gt; muestra rangos de tiempo de respuesta y percentiles, usuarios iniciados por segundo, usuarios concurrentes y peticiones por segundo; sus percentiles a lo largo del tiempo solo cuentan peticiones correctas (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo encaja Gatling en el build y la CI?&lt;/h2&gt;
&lt;p&gt;A través de su plugin para Maven, Gradle, sbt o npm, que funciona en cualquier sistema de CI. Una aserción fallida hace fallar el build.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://docs.gatling.io/integrations/build-tools/maven-plugin/&quot;&gt;plugin de Maven&lt;/a&gt; vincula &lt;code&gt;gatling:test&lt;/code&gt; a la fase &lt;code&gt;integration-test&lt;/code&gt;, así que &lt;code&gt;mvn verify&lt;/code&gt; lo ejecuta, y con &lt;code&gt;CI=true&lt;/code&gt; deja de preguntar qué simulación lanzar (la ejecución falla entonces si el proyecto tiene más de una simulación y no se indica ninguna). El &lt;a href=&quot;https://docs.gatling.io/integrations/build-tools/gradle-plugin/&quot;&gt;plugin de Gradle&lt;/a&gt; usa &lt;code&gt;gatlingRun&lt;/code&gt;, y el &lt;a href=&quot;https://docs.gatling.io/integrations/build-tools/sbt-plugin/&quot;&gt;plugin de sbt&lt;/a&gt; solo admite simulaciones en Scala. Las &lt;a href=&quot;https://docs.gatling.io/integrations/ci-cd/&quot;&gt;integraciones de CI&lt;/a&gt; ya hechas de Gatling, como su GitHub Action, lanzan ejecuciones en Gatling Enterprise (comprobado el 9 de octubre de 2026). Nuestra &lt;a href=&quot;https://loadtest.app/es/load-testing-in-github-actions/&quot;&gt;guía de GitHub Actions&lt;/a&gt; cubre la parte del workflow.&lt;/p&gt;
&lt;h2&gt;¿Qué protocolos admite Gatling?&lt;/h2&gt;
&lt;p&gt;HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events y JMS vienen sin límites. gRPC, MQTT y GraphQL son plugins aparte, limitados a 5 usuarios y 5 minutos fuera de Gatling Enterprise.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README&lt;/a&gt; incluye los cinco primeros bajo Apache 2.0. Las páginas de configuración de &lt;a href=&quot;https://docs.gatling.io/reference/script/grpc/setup/&quot;&gt;gRPC&lt;/a&gt;, &lt;a href=&quot;https://docs.gatling.io/reference/script/mqtt/setup/&quot;&gt;MQTT&lt;/a&gt; y &lt;a href=&quot;https://docs.gatling.io/reference/script/graphql/setup/&quot;&gt;GraphQL&lt;/a&gt; ponen cada plugin bajo la Gatling Enterprise Component License: sin límites en Gatling Enterprise, mientras que una prueba con la Community Edition se detiene a los 5 usuarios o los 5 minutos. Esa &lt;a href=&quot;https://docs.gatling.io/project/licenses/enterprise-component/&quot;&gt;licencia&lt;/a&gt; concede un uso gratuito durante un año como máximo, solo para probar internamente tus propias aplicaciones web; termina en cuanto se alcanza un límite, y Gatling puede cambiar los límites. GraphQL requiere la 3.16.0 o posterior. Sus notas de versión y el README dicen que el SDK de JavaScript todavía no lo soporta, aunque la página de configuración ya muestra un paquete npm, así que compruébalo antes de planificar una prueba de GraphQL en JavaScript (comprobado el 9 de octubre de 2026). Nuestra guía sobre &lt;a href=&quot;https://loadtest.app/es/how-to-load-test-a-graphql-api/&quot;&gt;cómo hacer una prueba de carga a una API GraphQL&lt;/a&gt; sortea el límite con peticiones HTTP normales.&lt;/p&gt;
&lt;h2&gt;¿Qué añade Gatling Enterprise?&lt;/h2&gt;
&lt;p&gt;Gatling Enterprise es la edición comercial sobre el mismo motor. Genera carga desde infraestructura gestionada o privada, algo que la edición gratuita no hace.&lt;/p&gt;
&lt;p&gt;Según el README, Enterprise ejecuta las pruebas en generadores de carga gestionados o en tus propias cuentas de AWS, Azure, GCP o Kubernetes, y añade paneles en directo, tendencias, equipos con SSO e integraciones de CI/CD. Las &lt;a href=&quot;https://docs.gatling.io/tutorials/faq/&quot;&gt;preguntas frecuentes&lt;/a&gt; indican que la Community Edition no admite pruebas distribuidas y que las simulaciones pasan a Enterprise sin cambios (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;LoadFocus, que publica este sitio, no ejecuta simulaciones de Gatling. &lt;a href=&quot;https://loadfocus.com/es-es/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-load-testing&quot;&gt;Ejecuta planes de prueba de JMeter y scripts de k6&lt;/a&gt; desde 25 regiones cloud, así que para Gatling el camino hacia más máquinas es Gatling Enterprise.&lt;/p&gt;
&lt;h2&gt;¿Qué hace bien Gatling y dónde están sus límites?&lt;/h2&gt;
&lt;p&gt;Destaca en pruebas como código revisable, en modelos de carga y en informes sin configuración. Se queda corto en protocolos más allá de la web y la mensajería, y al escalar gratis más allá de una máquina.&lt;/p&gt;
&lt;p&gt;El README destaca su motor: no bloqueante, construido sobre Netty, donde cada usuario virtual es un mensaje ligero. Límites que la propia documentación reconoce (comprobado el 9 de octubre de 2026):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gatling no es un navegador: según la &lt;a href=&quot;https://docs.gatling.io/reference/script/http/protocol/&quot;&gt;página del protocolo HTTP&lt;/a&gt;, no ejecuta JavaScript.&lt;/li&gt;
&lt;li&gt;El SDK de JavaScript no tiene &lt;a href=&quot;https://docs.gatling.io/reference/script/jms/&quot;&gt;JMS&lt;/a&gt; y no puede usar librerías de npm que necesiten binarios nativos o API propias de Node.js.&lt;/li&gt;
&lt;li&gt;La caché HTTP está activada por defecto, lo que puede reducir el número de peticiones.&lt;/li&gt;
&lt;li&gt;El formato de &lt;code&gt;simulation.log&lt;/code&gt; no está documentado y puede cambiar en cualquier momento.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;¿Cuándo elegir k6, JMeter o Locust en lugar de Gatling?&lt;/h2&gt;
&lt;p&gt;Elige otra herramienta cuando su lenguaje, sus protocolos o su forma gratuita de escalar encajen mejor con tu equipo.&lt;/p&gt;
&lt;p&gt;Nuestro repaso de &lt;a href=&quot;https://loadtest.app/es/open-source-load-testing-tools/&quot;&gt;herramientas de pruebas de carga open source&lt;/a&gt; sitúa Gatling junto a otras cinco.&lt;/p&gt;
&lt;p&gt;Elige &lt;strong&gt;k6&lt;/strong&gt; si quieres en la CI &lt;a href=&quot;https://grafana.com/docs/k6/latest/set-up/install-k6/&quot;&gt;un único binario&lt;/a&gt; sin JVM, &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt; que puedan detener pronto una ejecución fallida o gRPC entre sus &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/protocols/&quot;&gt;protocolos integrados&lt;/a&gt; (comprobado el 9 de octubre de 2026). &lt;a href=&quot;https://loadtest.app/es/gatling-vs-k6/&quot;&gt;Gatling vs k6&lt;/a&gt; compara las dos.&lt;/p&gt;
&lt;p&gt;Elige &lt;strong&gt;JMeter&lt;/strong&gt; si tus testers crean las pruebas en una interfaz gráfica, o si necesitas JDBC, LDAP o FTP desde su &lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;núcleo&lt;/a&gt; (comprobado el 9 de octubre de 2026). LoadFocus &lt;a href=&quot;https://loadfocus.com/es-es/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-load-testing&quot;&gt;ejecuta tus planes de prueba de JMeter&lt;/a&gt; desde 25 regiones cloud, y &lt;a href=&quot;https://loadtest.app/es/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter&lt;/a&gt; profundiza más.&lt;/p&gt;
&lt;p&gt;Elige &lt;strong&gt;Locust&lt;/strong&gt; si tu equipo escribe Python y quiere un &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;modo distribuido&lt;/a&gt; en la herramienta gratuita (comprobado el 9 de octubre de 2026). Nuestro &lt;a href=&quot;https://loadtest.app/es/locust-load-testing/&quot;&gt;análisis de Locust&lt;/a&gt; lo cubre.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Gatling es gratuito para uso comercial?&lt;/strong&gt;
Sí. La Community Edition tiene licencia Apache 2.0. Los plugins de gRPC, MQTT y GraphQL tienen su propia licencia y se detienen a los 5 usuarios y 5 minutos fuera de Gatling Enterprise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Hace falta Java para usar Gatling?&lt;/strong&gt;
Para Java, Kotlin o Scala, sí: un OpenJDK LTS de 64 bits del 11 al 25. El SDK de JavaScript necesita Node.js 24 o posterior, y su CLI descarga por sí misma el entorno JVM.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede LoadFocus ejecutar pruebas de Gatling?&lt;/strong&gt;
No. LoadFocus ejecuta planes de prueba de JMeter y scripts de k6. Para repartir una simulación de Gatling entre varias máquinas, usa Gatling Enterprise.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter: ¿pruebas como código o un plan en GUI?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-vs-k6/&quot;&gt;Gatling vs k6: ¿simulaciones en la JVM o un binario Go?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-source-load-testing-tools/&quot;&gt;Herramientas de pruebas de carga open source: seis opciones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-vs-locust/&quot;&gt;Gatling vs Locust: ¿simulaciones JVM o locustfiles Python?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/nbomber-load-testing/&quot;&gt;Pruebas de carga con NBomber: análisis del framework .NET&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Gatling vs JMeter: ¿pruebas como código o un plan en GUI?</title><link>https://loadtest.app/es/gatling-vs-jmeter/</link><guid isPermaLink="true">https://loadtest.app/es/gatling-vs-jmeter/</guid><description>Gatling y JMeter comparados en licencia, scripts, protocolos, grabadores, modelos de carga, escalado, CI e informes, con consejos claros para elegir.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, que vende un servicio de pruebas de carga que aparece en este artículo.&lt;/p&gt;&lt;p&gt;Gatling y Apache JMeter son dos herramientas de pruebas de carga gratuitas y open source que funcionan sobre la JVM, y la elección depende sobre todo de cómo quiere construir las pruebas tu equipo. Elige Gatling si quieres las pruebas como código en Java, Kotlin, Scala, JavaScript o TypeScript, perfiles de inyección abiertos y un informe HTML después de cada ejecución. Elige JMeter si necesitas protocolos como JDBC, LDAP, FTP o correo sin añadir nada, prefieres montar las pruebas en una interfaz gráfica o ya tienes planes de prueba &lt;code&gt;.jmx&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Los datos de esta comparativa Gatling vs JMeter vienen de la documentación y el repositorio de cada proyecto, comprobados el 9 de octubre de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Gatling&lt;/th&gt;
&lt;th&gt;Apache JMeter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licencia&lt;/td&gt;
&lt;td&gt;Apache 2.0; gRPC, MQTT y GraphQL con una licencia de componentes aparte (&lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;repositorio&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;Apache 2.0 (&lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;repositorio&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entorno de ejecución&lt;/td&gt;
&lt;td&gt;JVM, OpenJDK LTS 11 a 25 (versión 3.16.0)&lt;/td&gt;
&lt;td&gt;JVM, Java 8 o posterior (versión 5.6.3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pruebas escritas como&lt;/td&gt;
&lt;td&gt;Código en Java, Kotlin, Scala, JavaScript o TypeScript&lt;/td&gt;
&lt;td&gt;Planes de prueba montados en una interfaz gráfica y guardados en XML (&lt;code&gt;.jmx&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocolos integrados&lt;/td&gt;
&lt;td&gt;HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events, JMS&lt;/td&gt;
&lt;td&gt;HTTP(S), SOAP/REST, FTP, JDBC, LDAP, JMS, correo, TCP, comandos de shell, objetos Java&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grabador&lt;/td&gt;
&lt;td&gt;Proxy HTTP o conversor de archivos HAR&lt;/td&gt;
&lt;td&gt;HTTP(S) Test Script Recorder (proxy)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modelo de carga&lt;/td&gt;
&lt;td&gt;Perfiles de inyección abiertos o cerrados&lt;/td&gt;
&lt;td&gt;Thread Groups; un Open Model Thread Group experimental&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escalado&lt;/td&gt;
&lt;td&gt;Una máquina; la ejecución distribuida requiere Gatling Enterprise&lt;/td&gt;
&lt;td&gt;Modo remoto integrado, un cliente que controla varios servidores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI y ejecución sin interfaz&lt;/td&gt;
&lt;td&gt;Plugins de Maven, Gradle, sbt y npm; una assertion fallida hace fallar la ejecución&lt;/td&gt;
&lt;td&gt;Modo CLI (&lt;code&gt;jmeter -n&lt;/code&gt;); plugins de terceros para Maven, Gradle y Jenkins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Informes&lt;/td&gt;
&lt;td&gt;Informe HTML después de cada ejecución&lt;/td&gt;
&lt;td&gt;Panel HTML; resultados en directo con un Backend Listener&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Cuál es la diferencia entre Gatling y JMeter?&lt;/h2&gt;
&lt;p&gt;En Gatling una prueba es un programa dentro de un proyecto de build. En JMeter una prueba es un árbol de elementos que montas en una interfaz gráfica de escritorio y guardas como archivo XML, y de ahí salen casi todas las demás diferencias.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README&lt;/a&gt; de Gatling llama simulaciones a las pruebas y las guarda en tu repositorio como el código de la aplicación, y se ejecutan con un plugin de Maven, Gradle, sbt o npm. El &lt;a href=&quot;https://github.com/gatling/gatling-js&quot;&gt;SDK de JavaScript y TypeScript&lt;/a&gt; se instala con npm y descarga su propio entorno GraalVM.&lt;/p&gt;
&lt;p&gt;Un plan de JMeter tiene un Thread Group para los usuarios, samplers para las peticiones y assertions y listeners para los resultados. JMeter 5.6.3, la versión actual en la &lt;a href=&quot;https://jmeter.apache.org/download_jmeter.cgi&quot;&gt;página de descarga&lt;/a&gt;, requiere Java 8 o posterior. El README de la &lt;a href=&quot;https://github.com/apache/jmeter/blob/master/README.md&quot;&gt;rama de desarrollo&lt;/a&gt; de JMeter ya exige Java 17 (comprobado el 10 de octubre de 2026). Por dentro, JMeter ejecuta cada usuario virtual como un hilo de Java, mientras que el README de Gatling describe los usuarios virtuales como mensajes ligeros sobre un motor no bloqueante construido con Netty.&lt;/p&gt;
&lt;h2&gt;¿Cómo se escribe una prueba en cada herramienta?&lt;/h2&gt;
&lt;p&gt;En Gatling escribes una clase de simulación que define un escenario, un perfil de inyección y assertions. En JMeter añades un Thread Group y samplers en la interfaz gráfica, guardas el plan y luego lo ejecutas desde la línea de comandos.&lt;/p&gt;
&lt;p&gt;Una simulación en Java basada en el &lt;a href=&quot;https://docs.gatling.io/tutorials/test-as-code/java-jvm/running-your-first-simulation/&quot;&gt;tutorial de la primera simulación&lt;/a&gt; de Gatling: los usuarios nuevos llegan primero a razón de uno por segundo, suben a diez por segundo en un minuto y se mantienen así durante cinco minutos. La ejecución falla si el percentil 95 supera los 500 ms o si falla más del 1 % de las peticiones:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;import static io.gatling.javaapi.core.CoreDsl.*;
import static io.gatling.javaapi.http.HttpDsl.*;

import io.gatling.javaapi.core.*;
import io.gatling.javaapi.http.*;

public class ApiSimulation extends Simulation {

  HttpProtocolBuilder httpProtocol =
      http.baseUrl(&amp;quot;https://staging.example.com&amp;quot;);

  ScenarioBuilder users = scenario(&amp;quot;API users&amp;quot;)
      .exec(http(&amp;quot;list users&amp;quot;).get(&amp;quot;/api/users&amp;quot;))
      .pause(1);

  {
    setUp(users.injectOpen(
            rampUsersPerSec(1).to(10).during(60),
            constantUsersPerSec(10).during(300)))
        .protocols(httpProtocol)
        .assertions(
            global().responseTime().percentile(95.0).lt(500),
            global().failedRequests().percent().lt(1.0));
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ejecútala con &lt;code&gt;./mvnw gatling:test&lt;/code&gt;; una simulación en JavaScript o TypeScript se ejecuta con &lt;code&gt;npx gatling run&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;En JMeter la misma prueba es un Thread Group con un sampler HTTP Request, y una Duration Assertion puede marcar como fallida cada respuesta lenta. La &lt;a href=&quot;https://jmeter.apache.org/usermanual/get-started.html&quot;&gt;guía de inicio&lt;/a&gt; monta el plan en modo GUI y lo ejecuta en modo CLI, y &lt;code&gt;-e -o&lt;/code&gt; añade el informe HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;jmeter -n -t api-users.jmx -l results.jtl -e -o report/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Las dos herramientas pueden grabar un primer borrador desde el navegador. El &lt;a href=&quot;https://docs.gatling.io/reference/script/http/recorder/&quot;&gt;Recorder&lt;/a&gt; de Gatling funciona como proxy HTTP o convierte un archivo HAR en una simulación, y el &lt;a href=&quot;https://jmeter.apache.org/usermanual/jmeter_proxy_step_by_step.html&quot;&gt;HTTP(S) Test Script Recorder&lt;/a&gt; de JMeter captura el tráfico del navegador en un plan (comprobado el 9 de octubre de 2026). La documentación de Gatling ya presenta este Recorder como legacy, y el más reciente &lt;a href=&quot;https://docs.gatling.io/tutorials/low-code/browser/studio/&quot;&gt;Gatling Studio&lt;/a&gt; exige una cuenta de Enterprise para iniciar sesión (comprobado el 10 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Qué protocolos puede probar cada herramienta?&lt;/h2&gt;
&lt;p&gt;JMeter cubre más protocolos de serie. Gatling trae los principales protocolos web más JMS y deja casi todo lo demás a componentes aparte o a plugins de la comunidad.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;README&lt;/a&gt; de JMeter recoge todos los protocolos de la tabla anterior, correo incluido. JDBC y JMS necesitan los JAR del driver de tu base de datos o de tu proveedor JMS, y el &lt;a href=&quot;https://jmeter-plugins.org/install/Install/&quot;&gt;Plugins Manager&lt;/a&gt; instala plugins de la comunidad desde la propia interfaz gráfica.&lt;/p&gt;
&lt;p&gt;Según el README de Gatling, gRPC, MQTT y GraphQL son componentes aparte con la Gatling Enterprise Component License, limitados sin Enterprise a cinco usuarios simultáneos y pruebas de cinco minutos. Kafka, AMQP, SFTP, FTP y JDBC llegan con &lt;a href=&quot;https://docs.gatling.io/reference/script/third-parties/&quot;&gt;plugins de terceros&lt;/a&gt; para Gatling 3.13 que Gatling no mantiene (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo modelan la carga Gatling y JMeter?&lt;/h2&gt;
&lt;p&gt;Gatling te hace elegir entre un modelo abierto y uno cerrado en el propio script. El Thread Group clásico de JMeter es un grupo cerrado de usuarios, y la carga basada en llegadas necesita el más reciente Open Model Thread Group.&lt;/p&gt;
&lt;p&gt;En Gatling, &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;&lt;code&gt;injectOpen&lt;/code&gt;&lt;/a&gt; recibe tasas de llegada como &lt;code&gt;constantUsersPerSec&lt;/code&gt; y &lt;code&gt;rampUsersPerSec&lt;/code&gt;, e &lt;code&gt;injectClosed&lt;/code&gt; objetivos de concurrencia como &lt;code&gt;constantConcurrentUsers&lt;/code&gt;. JMeter 5.5 añadió el &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Open_Model_Thread_Group&quot;&gt;Open Model Thread Group&lt;/a&gt;, que la referencia sigue marcando como experimental (comprobado el 9 de octubre de 2026). Nuestra guía sobre el &lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;modelo de carga abierto vs cerrado&lt;/a&gt; explica por qué importa esa elección.&lt;/p&gt;
&lt;h2&gt;¿Cómo se reparte una prueba entre varias máquinas?&lt;/h2&gt;
&lt;p&gt;JMeter trae un modo distribuido integrado. La edición open source de Gatling genera carga desde una sola máquina, y su documentación pide una cuenta de Gatling Enterprise para la ejecución distribuida.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://jmeter.apache.org/usermanual/remote-test.html&quot;&gt;modo de pruebas remotas&lt;/a&gt; de JMeter permite que un cliente controle cualquier número de servidores. Cada servidor ejecuta el plan completo, así que 1.000 hilos en seis servidores son 6.000 hilos. Todos los nodos deberían usar la misma versión de JMeter y de Java, RMI necesita un keystore salvo que desactives SSL, y los archivos de datos hay que copiarlos a cada servidor.&lt;/p&gt;
&lt;p&gt;Hay una tercera vía para los planes de prueba de JMeter. LoadFocus, que publica este sitio, &lt;a href=&quot;https://loadfocus.com/es-es/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-vs-jmeter&quot;&gt;ejecuta tus planes de prueba de JMeter&lt;/a&gt; sin cambios desde 25 regiones cloud, sin servidores remotos que configurar. LoadFocus no ejecuta simulaciones de Gatling.&lt;/p&gt;
&lt;h2&gt;¿Cómo encajan en CI y qué informes obtienes?&lt;/h2&gt;
&lt;p&gt;Las dos se ejecutan sin interfaz. Las assertions de Gatling pueden hacer fallar el build directamente, mientras que las de JMeter marcan muestras sueltas y la integración con CI llega con bibliotecas de terceros.&lt;/p&gt;
&lt;p&gt;Las &lt;a href=&quot;https://docs.gatling.io/concepts/assertions/&quot;&gt;assertions&lt;/a&gt; de Gatling se comprueban al terminar la ejecución, y una sola assertion fallida hace fallar la simulación y la tarea de build. El &lt;a href=&quot;https://docs.gatling.io/reference/stats/reports/oss/&quot;&gt;informe HTML&lt;/a&gt; muestra percentiles del tiempo de respuesta, usuarios iniciados por segundo, usuarios simultáneos y peticiones por segundo a lo largo del tiempo.&lt;/p&gt;
&lt;p&gt;El modo CLI de JMeter no tiene criterios de aprobación, así que un objetivo incumplido solo hace fallar el build mediante las bibliotecas para Maven, Gradle y Jenkins que cita su README, o con una comprobación propia. El &lt;a href=&quot;https://jmeter.apache.org/usermanual/generating-dashboard.html&quot;&gt;panel&lt;/a&gt; de JMeter añade una tabla APDEX, una tabla de estadísticas con tres percentiles configurables y resúmenes de errores, y un Backend Listener envía resultados en directo a InfluxDB o Graphite.&lt;/p&gt;
&lt;h2&gt;¿Cuál deberías elegir?&lt;/h2&gt;
&lt;p&gt;Elige Gatling si tu equipo escribe Java, Kotlin, Scala o TypeScript y quiere revisar las pruebas de carga como el resto de su código. Elige JMeter en su lugar si necesitas protocolos más allá de la web, si tus testers prefieren una interfaz gráfica o si ya tienes planes &lt;code&gt;.jmx&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Gatling encaja con equipos que describen el tráfico como tasas de llegada y quieren las reglas de aprobado o fallo junto al escenario, con un informe legible sin configuración extra.&lt;/p&gt;
&lt;p&gt;JMeter es la mejor opción para probar JDBC, LDAP, FTP o correo, para testers que refinan visualmente un flujo grabado y para ejecuciones distribuidas en tus propios servidores sin licencia comercial. Una empresa que ya usa JMeter conserva además sus planes, sus plugins y su experiencia.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Gatling es más rápido que JMeter?&lt;/strong&gt;
No lo hemos medido nosotros, así que no vamos a nombrar un ganador. La comparación justa es el mismo escenario con las dos herramientas en tu propio hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Gatling puede ejecutar archivos .jmx de JMeter?&lt;/strong&gt;
No directamente. Gatling ejecuta simulaciones escritas con sus SDK, así que un plan de JMeter hay que reescribirlo. El README de Gatling menciona extensiones de IA que convierten planes de prueba de JMeter, y requieren un token de API de Gatling Enterprise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿LoadFocus puede ejecutar pruebas de Gatling?&lt;/strong&gt;
No. LoadFocus ejecuta planes de prueba de JMeter y scripts de k6. Para repartir una simulación de Gatling entre varias máquinas, usa Gatling Enterprise.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-load-testing/&quot;&gt;Pruebas de carga con Gatling: la herramienta JVM a fondo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-vs-k6/&quot;&gt;Gatling vs k6: ¿simulaciones en la JVM o un binario Go?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/locust-vs-jmeter/&quot;&gt;Locust vs JMeter: ¿scripts de Python o planes de JMeter?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;Modelo de carga abierto vs cerrado: cuál usar y cuándo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/k6-vs-artillery/&quot;&gt;k6 vs Artillery: qué herramienta de pruebas de carga elegir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-vs-locust/&quot;&gt;Gatling vs Locust: ¿simulaciones JVM o locustfiles Python?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/jmeter-vs-postman/&quot;&gt;JMeter vs Postman: ¿qué herramienta para pruebas de carga?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Gatling vs k6: ¿simulaciones en la JVM o un binario Go?</title><link>https://loadtest.app/es/gatling-vs-k6/</link><guid isPermaLink="true">https://loadtest.app/es/gatling-vs-k6/</guid><description>Gatling vs k6 comparados en licencia, ejecución, lenguajes, protocolos, modelos de carga, criterios de éxito y escalado, con consejos para elegir.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, que vende un servicio de pruebas de carga que aparece en este artículo.&lt;/p&gt;&lt;p&gt;Gatling y k6 son herramientas open source que guardan las pruebas de carga como código en tu repositorio, y cualquiera de las dos prueba bien una API HTTP bajo carga. Elige Gatling si tu equipo trabaja en Java, Kotlin o Scala, o si quieres un informe HTML después de cada ejecución sin configurar nada. Elige k6 si quieres un único binario de Go sin JVM, gRPC y pruebas de navegador de serie, y umbrales capaces de detener antes de tiempo una ejecución que falla.&lt;/p&gt;
&lt;p&gt;Los datos de esta comparación Gatling vs k6 salen de la documentación y del repositorio de cada proyecto, comprobados el 9 de octubre de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Gatling&lt;/th&gt;
&lt;th&gt;k6&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licencia&lt;/td&gt;
&lt;td&gt;Apache 2.0; gRPC, MQTT y GraphQL con una licencia de componentes aparte (&lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;repositorio&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;AGPL-3.0 (&lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;repositorio&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entorno de ejecución&lt;/td&gt;
&lt;td&gt;JVM; el SDK de Java requiere OpenJDK LTS 11 a 25 (versión 3.16.0)&lt;/td&gt;
&lt;td&gt;Un binario de Go con un motor JavaScript integrado (versión v2.3.0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scripts de prueba&lt;/td&gt;
&lt;td&gt;Java, Kotlin, Scala, JavaScript o TypeScript&lt;/td&gt;
&lt;td&gt;JavaScript, o TypeScript sin comprobación de tipos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocolos principales&lt;/td&gt;
&lt;td&gt;HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events, JMS&lt;/td&gt;
&lt;td&gt;HTTP/1.1, HTTP/2, WebSockets, gRPC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modelo de carga&lt;/td&gt;
&lt;td&gt;Perfiles de inyección abiertos o cerrados&lt;/td&gt;
&lt;td&gt;Seis executors, dos de ellos con tasa de llegada (modelo abierto)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Criterios de éxito&lt;/td&gt;
&lt;td&gt;Assertions, comprobadas al terminar&lt;/td&gt;
&lt;td&gt;Thresholds, que también pueden abortar una ejecución&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Informes&lt;/td&gt;
&lt;td&gt;Informe HTML después de cada ejecución&lt;/td&gt;
&lt;td&gt;Resumen al final de la prueba; panel web con exportación HTML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pruebas de navegador&lt;/td&gt;
&lt;td&gt;Nada integrado; el Recorder convierte el tráfico del navegador en código&lt;/td&gt;
&lt;td&gt;Módulo de navegador integrado (controla un navegador basado en Chromium)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escalado&lt;/td&gt;
&lt;td&gt;Gatling Enterprise&lt;/td&gt;
&lt;td&gt;k6-operator en Kubernetes, o Grafana Cloud k6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Cuál es la diferencia entre Gatling y k6?&lt;/h2&gt;
&lt;p&gt;La mayor diferencia es el entorno de ejecución. Gatling corre en la JVM y escribes las pruebas con uno de sus SDK, mientras que k6 es un único programa compilado en Go que ejecuta JavaScript.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;README&lt;/a&gt; de Gatling menciona un SDK de Java para Java, Kotlin y Scala, que se ejecuta con un plugin de Maven, Gradle o sbt. Su &lt;a href=&quot;https://github.com/gatling/gatling-js&quot;&gt;SDK de JavaScript y TypeScript&lt;/a&gt; se instala con npm, y su herramienta de línea de comandos descarga GraalVM, así que incluso una simulación en JavaScript corre sobre una JVM.&lt;/p&gt;
&lt;p&gt;k6 se instala como &lt;a href=&quot;https://grafana.com/docs/k6/latest/set-up/install-k6/&quot;&gt;paquete o como binario independiente&lt;/a&gt;, sin ningún otro entorno de ejecución. También ejecuta directamente archivos &lt;code&gt;.ts&lt;/code&gt;, y su &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/javascript-typescript-compatibility-mode/&quot;&gt;soporte de TypeScript&lt;/a&gt; elimina los tipos sin comprobarlos (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo se escribe la misma prueba en cada herramienta?&lt;/h2&gt;
&lt;p&gt;Las dos herramientas pueden expresar la misma prueba en JavaScript. Gatling la llama simulación y describe la carga con un perfil de inyección, y k6 la llama script y describe la carga con un escenario y su executor.&lt;/p&gt;
&lt;p&gt;Esta es una prueba en la que llegan diez usuarios nuevos por segundo durante cinco minutos, y que falla si el percentil 95 supera los 500 ms o si falla más del 1 % de las peticiones. Con el SDK de JavaScript de Gatling, basada en su &lt;a href=&quot;https://docs.gatling.io/tutorials/test-as-code/javascript/running-your-first-simulation/&quot;&gt;tutorial de la primera simulación&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import {
  constantUsersPerSec, global, scenario, simulation,
} from &amp;quot;@gatling.io/core&amp;quot;;
import { http } from &amp;quot;@gatling.io/http&amp;quot;;

export default simulation((setUp) =&amp;gt; {
  const api = http.baseUrl(&amp;quot;https://staging.example.com&amp;quot;);

  const users = scenario(&amp;quot;API users&amp;quot;)
    .exec(http(&amp;quot;list users&amp;quot;).get(&amp;quot;/api/users&amp;quot;));

  setUp(users.injectOpen(constantUsersPerSec(10).during(300)))
    .protocols(api)
    .assertions(
      global().responseTime().percentile(95).lt(500),
      global().failedRequests().percent().lt(1),
    );
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La misma prueba en k6, con el &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/constant-arrival-rate/&quot;&gt;executor constant-arrival-rate&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;

export const options = {
  scenarios: {
    api_users: {
      executor: &amp;quot;constant-arrival-rate&amp;quot;,
      rate: 10,
      timeUnit: &amp;quot;1s&amp;quot;,
      duration: &amp;quot;5m&amp;quot;,
      preAllocatedVUs: 50,
    },
  },
  thresholds: {
    http_req_duration: [&amp;quot;p(95)&amp;lt;500&amp;quot;],
    http_req_failed: [&amp;quot;rate&amp;lt;0.01&amp;quot;],
  },
};

export default function () {
  http.get(&amp;quot;https://staging.example.com/api/users&amp;quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Se lanzan con &lt;code&gt;npx gatling run&lt;/code&gt; y &lt;code&gt;k6 run script.js&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;¿Cómo modelan la carga Gatling y k6?&lt;/h2&gt;
&lt;p&gt;Las dos admiten modelos de carga abiertos y cerrados. En Gatling eliges con el método de inyección que llamas, y en k6 con el executor que configuras.&lt;/p&gt;
&lt;p&gt;En Gatling, &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;&lt;code&gt;injectOpen&lt;/code&gt;&lt;/a&gt; recibe tasas de llegada como &lt;code&gt;constantUsersPerSec&lt;/code&gt;, e &lt;code&gt;injectClosed&lt;/code&gt; objetivos de concurrencia como &lt;code&gt;constantConcurrentUsers&lt;/code&gt;. k6 tiene &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/&quot;&gt;seis executors&lt;/a&gt;: los dos de tasa de llegada siguen el modelo abierto, y los otros cuatro el cerrado, en el que un usuario virtual solo empieza su siguiente iteración cuando termina la anterior.&lt;/p&gt;
&lt;p&gt;Un escenario de k6 con tasa de llegada inicia las iteraciones desde un grupo de usuarios virtuales reservados de antemano, y cuando ese grupo se agota, k6 se salta iteraciones y las cuenta como &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/dropped-iterations/&quot;&gt;iteraciones descartadas&lt;/a&gt; (comprobado el 9 de octubre de 2026). Nuestra guía sobre el &lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;modelo de carga abierto vs cerrado&lt;/a&gt; explica cuándo conviene cada uno.&lt;/p&gt;
&lt;h2&gt;¿Cómo deciden Gatling y k6 si una prueba ha pasado?&lt;/h2&gt;
&lt;p&gt;Las dos convierten los objetivos de rendimiento en un resultado de éxito o fallo con el que puede trabajar un pipeline de CI. Gatling comprueba sus objetivos cuando termina la ejecución, y k6 además puede detener una ejecución en cuanto se incumple un objetivo.&lt;/p&gt;
&lt;p&gt;Las &lt;a href=&quot;https://docs.gatling.io/concepts/assertions/&quot;&gt;assertions&lt;/a&gt; de Gatling se evalúan después de la simulación, y una sola assertion fallida hace fallar la simulación y el build. Los &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt; de k6 terminan una ejecución fallida con un código de salida distinto de cero, y un threshold con &lt;code&gt;abortOnFail&lt;/code&gt; detiene la prueba en el momento en que falla (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Qué protocolos y pruebas de navegador cubre cada herramienta?&lt;/h2&gt;
&lt;p&gt;Las dos cubren HTTP y WebSockets de serie. Gatling añade Server-Sent Events y JMS, y k6 añade gRPC y sesiones reales de navegador.&lt;/p&gt;
&lt;p&gt;Según el README de Gatling, gRPC, MQTT y GraphQL son componentes aparte con la Gatling Enterprise Component License, limitados sin Enterprise a cinco usuarios simultáneos y a pruebas de cinco minutos. k6 menciona HTTP/1.1, HTTP/2, WebSockets y gRPC como &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/protocols/&quot;&gt;protocolos integrados&lt;/a&gt;, y suma otros mediante extensiones xk6 como Kafka y Redis.&lt;/p&gt;
&lt;p&gt;Para pruebas de navegador, k6 tiene un &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6-browser/&quot;&gt;módulo de navegador&lt;/a&gt; que controla un navegador basado en Chromium y recoge métricas del frontend. La documentación de Gatling no describe ningún motor de navegador: el &lt;a href=&quot;https://docs.gatling.io/reference/script/http/recorder/&quot;&gt;Recorder&lt;/a&gt; de Gatling convierte una sesión de navegador o un archivo HAR en una simulación a nivel HTTP (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo se lanza una prueba más grande de lo que genera una máquina?&lt;/h2&gt;
&lt;p&gt;La edición open source de Gatling genera carga desde una sola máquina, y la ejecución distribuida requiere Gatling Enterprise. k6 puede repartir una prueba en un clúster de Kubernetes con el k6-operator, que es open source, o ejecutarla en Grafana Cloud k6.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.gatling.io/tutorials/test-as-code/java-jvm/installation-guide/&quot;&gt;guía de instalación&lt;/a&gt; de Gatling pide una cuenta de Enterprise para la ejecución distribuida, que usa generadores de carga gestionados o ubicaciones privadas en tu propia cuenta de AWS, Azure, GCP o Kubernetes. El &lt;a href=&quot;https://grafana.com/docs/k6/latest/testing-guides/running-distributed-tests/&quot;&gt;k6-operator&lt;/a&gt; reparte una prueba entre varias instancias de k6 dentro de un clúster (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;Hay un tercer camino para los scripts de k6. LoadFocus, que publica este sitio, &lt;a href=&quot;https://loadfocus.com/es-es/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=gatling-vs-k6&quot;&gt;ejecuta scripts de k6&lt;/a&gt; en su propia infraestructura en la nube desde 25 regiones, con los usuarios y la duración tomados de la configuración de la prueba. Su validador de scripts avisa de que los escenarios con tasa de llegada se ejecutan allí con un número fijo de usuarios, así que un script de modelo abierto como el de arriba no mantiene su tasa de llegada en LoadFocus. LoadFocus no ejecuta simulaciones de Gatling, de modo que para Gatling el camino hacia más máquinas es Gatling Enterprise.&lt;/p&gt;
&lt;h2&gt;¿Qué informes obtienes?&lt;/h2&gt;
&lt;p&gt;Gatling genera un informe HTML después de cada ejecución sin configurar nada. k6 muestra un resumen en la terminal y puede producir un informe HTML desde su panel web integrado.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://docs.gatling.io/reference/stats/reports/oss/&quot;&gt;informe HTML&lt;/a&gt; de Gatling muestra en gráficos los percentiles del tiempo de respuesta, los usuarios iniciados por segundo y las peticiones por segundo a lo largo de la prueba. k6 muestra un &lt;a href=&quot;https://grafana.com/docs/k6/latest/results-output/end-of-test/&quot;&gt;resumen al final de la prueba&lt;/a&gt;, y su &lt;a href=&quot;https://grafana.com/docs/k6/latest/results-output/web-dashboard/&quot;&gt;panel web&lt;/a&gt; enseña gráficos en directo y exporta un informe HTML autónomo cuando defines &lt;code&gt;K6_WEB_DASHBOARD_EXPORT&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;¿Cuál deberías elegir?&lt;/h2&gt;
&lt;p&gt;Gatling encaja con equipos que trabajan sobre la JVM, y k6 con equipos que quieren un único binario y JavaScript. Los protocolos, las pruebas de navegador y el escalado deciden casi todos los demás casos.&lt;/p&gt;
&lt;p&gt;Elige Gatling en lugar de k6 cuando tu equipo trabaje sobre la JVM y quiera pruebas en Java, Kotlin o Scala construidas con Maven, Gradle o sbt junto al código de la aplicación, cuando necesites JMS o Server-Sent Events, o cuando quieras un informe HTML después de cada ejecución sin configurar nada.&lt;/p&gt;
&lt;p&gt;Elige k6 en lugar de Gatling cuando quieras un único binario en CI sin JVM que instalar, cuando tus pruebas necesiten gRPC o sesiones reales de navegador, cuando los thresholds deban detener antes de tiempo una ejecución que falla, o cuando pienses escalar en Kubernetes con un operator open source.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Es Gatling más rápido que k6?&lt;/strong&gt;
No lo hemos medido nosotros, así que no vamos a nombrar un ganador. La comparación justa es el mismo escenario con las dos herramientas en tu propio hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede Gatling ejecutar scripts de k6?&lt;/strong&gt;
No según la documentación de Gatling, que no describe ninguna forma de ejecutar scripts de k6. Los dos SDK usan API distintas y los &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;conversores&lt;/a&gt; de Gatling cubren JMeter y LoadRunner, así que un script de k6 hay que reescribirlo como simulación de Gatling, incluso con el SDK de JavaScript.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede LoadFocus ejecutar pruebas de Gatling?&lt;/strong&gt;
No. LoadFocus ejecuta scripts de k6 y planes de prueba de JMeter. Para repartir una simulación de Gatling entre varias máquinas, usa Gatling Enterprise.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-load-testing/&quot;&gt;Pruebas de carga con Gatling: la herramienta JVM a fondo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/k6-vs-artillery/&quot;&gt;k6 vs Artillery: qué herramienta de pruebas de carga elegir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter: ¿pruebas como código o un plan en GUI?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-vs-locust/&quot;&gt;Gatling vs Locust: ¿simulaciones JVM o locustfiles Python?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/grpc-load-testing/&quot;&gt;Pruebas de carga gRPC: herramientas, configuración, métricas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Prueba de carga de una API GraphQL: guía práctica</title><link>https://loadtest.app/es/how-to-load-test-a-graphql-api/</link><guid isPermaLink="true">https://loadtest.app/es/how-to-load-test-a-graphql-api/</guid><description>Prueba de carga de una API GraphQL: nombra cada operación, mezcla consultas y mutaciones, detecta los errores tras un HTTP 200 y vigila la caché y el N+1.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, un servicio de pruebas de carga mencionado en este artículo.&lt;/p&gt;&lt;p&gt;Para hacer una prueba de carga de una API GraphQL, escribe un script con las operaciones que tus clientes envían de verdad, da a cada una su propio nombre en la herramienta de pruebas y mézclalas en las proporciones que ves en producción, con variables variadas. Revisa en cada cuerpo de respuesta si hay un array &lt;code&gt;errors&lt;/code&gt;, porque un servidor GraphQL suele responder con HTTP 200 aunque parte de la operación haya fallado. Después sube la carga y juzga cada operación por sus propios percentiles.&lt;/p&gt;
&lt;p&gt;Fuentes: graphql.org, el borrador de la especificación GraphQL over HTTP y la documentación de cada herramienta, todo comprobado el 9 de octubre de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Herramienta&lt;/th&gt;
&lt;th&gt;Nombrar cada operación con&lt;/th&gt;
&lt;th&gt;Hacer fallar una respuesta con &lt;code&gt;errors&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Alimentar variables desde&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tags: { name: &amp;quot;...&amp;quot; }&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Un &lt;code&gt;check()&lt;/code&gt; sobre el cuerpo parseado&lt;/td&gt;
&lt;td&gt;&lt;code&gt;SharedArray&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;El nombre del sampler&lt;/td&gt;
&lt;td&gt;JSON Assertion sobre &lt;code&gt;$.errors&lt;/code&gt;, invertida&lt;/td&gt;
&lt;td&gt;CSV Data Set Config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http(&amp;quot;...&amp;quot;)&lt;/code&gt; o el plugin de GraphQL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;jsonPath(&amp;quot;$.errors&amp;quot;).notExists()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Feeders&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artillery&lt;/td&gt;
&lt;td&gt;Un &lt;code&gt;name&lt;/code&gt; en la petición&lt;/td&gt;
&lt;td&gt;&lt;code&gt;notHasProperty: &amp;quot;errors&amp;quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;config.payload&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Por qué una API GraphQL necesita una prueba de carga distinta?&lt;/h2&gt;
&lt;p&gt;Porque todas las operaciones van a una sola URL y el trabajo que hay detrás depende de la consulta y de sus variables. Un informe agrupado por URL mete en el mismo saco una lectura barata y una búsqueda cara.&lt;/p&gt;
&lt;p&gt;La guía &lt;a href=&quot;https://graphql.org/learn/serving-over-http/&quot;&gt;Serving over HTTP&lt;/a&gt; de graphql.org dice que un servidor GraphQL funciona sobre un único endpoint, normalmente &lt;code&gt;/graphql&lt;/code&gt;. Las operaciones llegan ahí por POST, con un cuerpo JSON que lleva &lt;code&gt;query&lt;/code&gt;, un &lt;code&gt;operationName&lt;/code&gt; opcional y &lt;code&gt;variables&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;¿Cómo se obtienen resultados por operación?&lt;/h2&gt;
&lt;p&gt;Pon a cada petición el nombre de su operación GraphQL y haz que la herramienta agrupe sus estadísticas por ese nombre. Cada herramienta tiene su propio ajuste para esto (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;k6&lt;/strong&gt;: la &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/tags-and-groups/&quot;&gt;guía de tags y grupos&lt;/a&gt; indica que se defina &lt;code&gt;tags.name&lt;/code&gt; para dar a una petición un nombre con sentido, y los &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt; pueden apuntar a un solo tag, como &lt;code&gt;http_req_duration{name:GetProduct}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JMeter&lt;/strong&gt;: el &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Aggregate_Report&quot;&gt;Aggregate Report&lt;/a&gt; crea una fila por cada petición con un nombre distinto. Desde JMeter 5.4, el sampler &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#HTTP_Request&quot;&gt;GraphQL HTTP Request&lt;/a&gt; tiene campos para Query, Variables y Operation Name.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gatling&lt;/strong&gt;: el &lt;a href=&quot;https://docs.gatling.io/reference/script/http/request/&quot;&gt;nombre de la petición&lt;/a&gt; es la clave de sus estadísticas, y el &lt;a href=&quot;https://docs.gatling.io/reference/script/graphql/requests/&quot;&gt;plugin de GraphQL&lt;/a&gt; nombra las peticiones según la operación, por ejemplo &lt;code&gt;query GetUser&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Artillery&lt;/strong&gt;: el &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/metrics-by-endpoint&quot;&gt;plugin metrics-by-endpoint&lt;/a&gt; informa por URL y añade a cada entrada el &lt;code&gt;name&lt;/code&gt; de la petición, así que las operaciones con nombre aparecen por separado; &lt;code&gt;useOnlyRequestNames: true&lt;/code&gt; quita la URL y deja solo el nombre.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;¿Qué operaciones debe enviar la prueba?&lt;/h2&gt;
&lt;p&gt;Las que recibe producción, en las mismas proporciones. Saca el recuento de cada operación de los logs del servidor o de tu monitorización de GraphQL y conviértelo en una mezcla ponderada de lecturas y mutaciones.&lt;/p&gt;
&lt;p&gt;Usa los documentos que envían tus clientes, con su profundidad real, en lugar de una consulta simplificada. Alimenta las variables desde un archivo de datos, para que el servidor busque muchos registros distintos en vez de devolver un único resultado en caché. Mantén también realista el número de operaciones distintas: la &lt;a href=&quot;https://www.apollographql.com/docs/technotes/TN0035-load-testing-graphql&quot;&gt;nota técnica de Apollo sobre pruebas de carga de GraphQL&lt;/a&gt;, un documento del propio fabricante, explica que cada operación nueva se analiza y se valida antes de ejecutarse, y desaconseja generar muchas más operaciones únicas de las que envían los clientes reales.&lt;/p&gt;
&lt;p&gt;Las mutaciones cambian datos, así que ejecútalas donde puedas restaurarlos. La &lt;a href=&quot;https://loadtest.app/es/how-to-run-a-load-test/&quot;&gt;guía paso a paso de pruebas de carga&lt;/a&gt; explica los objetivos y la rampa de subida.&lt;/p&gt;
&lt;h2&gt;¿Por qué una respuesta HTTP 200 puede ser un fallo?&lt;/h2&gt;
&lt;p&gt;Porque GraphQL informa de los errores dentro del cuerpo de la respuesta. Una petición puede devolver el estado 200 con un array &lt;code&gt;errors&lt;/code&gt; y datos parciales, y una comprobación del estado la da por buena.&lt;/p&gt;
&lt;p&gt;La página &lt;a href=&quot;https://graphql.org/learn/response/&quot;&gt;Response&lt;/a&gt; de graphql.org explica que, cuando falla un resolver, la ejecución sigue y la respuesta trae &lt;code&gt;data&lt;/code&gt; junto a &lt;code&gt;errors&lt;/code&gt;. Su guía de HTTP añade que esa respuesta debe recibir aun así un estado 2xx, porque HTTP no tiene un código para el éxito parcial, y que algunos servidores antiguos responden 2xx incluso ante errores de validación. El &lt;a href=&quot;https://graphql.github.io/graphql-over-http/draft/&quot;&gt;borrador GraphQL over HTTP&lt;/a&gt; propone un estado propio, el 294, para el éxito parcial con el tipo de medio más reciente &lt;code&gt;application/graphql-response+json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;En una prueba de carga esto perjudica dos veces. Los errores no se cuentan, y las peticiones que fallan rápido, como operaciones rechazadas por un límite de profundidad, rebajan los tiempos de respuesta.&lt;/p&gt;
&lt;h2&gt;¿Cómo se comprueba el array errors en cada herramienta?&lt;/h2&gt;
&lt;p&gt;Parsea el cuerpo JSON y haz fallar la petición cuando haya &lt;code&gt;errors&lt;/code&gt;. Cada herramienta tiene una forma integrada de hacerlo.&lt;/p&gt;
&lt;p&gt;En k6 basta con un check sobre el cuerpo parseado, y un threshold sobre la métrica &lt;code&gt;checks&lt;/code&gt; hace fallar la ejecución, porque &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;los checks por sí solos no cambian el código de salida de k6&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;
import { check, sleep } from &amp;quot;k6&amp;quot;;
import { SharedArray } from &amp;quot;k6/data&amp;quot;;

const URL = &amp;quot;https://staging.example.com/graphql&amp;quot;;
const ids = new SharedArray(&amp;quot;ids&amp;quot;, () =&amp;gt;
  JSON.parse(open(&amp;quot;./product-ids.json&amp;quot;)));
const QUERY = `query GetProduct($id: ID!) {
  product(id: $id) { id name price }
}`;

export const options = {
  vus: 20,
  duration: &amp;quot;5m&amp;quot;,
  thresholds: {
    checks: [&amp;quot;rate&amp;gt;0.99&amp;quot;],
    &amp;quot;http_req_duration{name:GetProduct}&amp;quot;: [&amp;quot;p(95)&amp;lt;400&amp;quot;],
  },
};

function parse(res) {
  try { return res.json(); } catch (e) { return null; }
}

export default function () {
  const id = ids[Math.floor(Math.random() * ids.length)];
  const payload = JSON.stringify({
    query: QUERY,
    operationName: &amp;quot;GetProduct&amp;quot;,
    variables: { id: id },
  });
  const res = http.post(URL, payload, {
    headers: { &amp;quot;Content-Type&amp;quot;: &amp;quot;application/json&amp;quot; },
    tags: { name: &amp;quot;GetProduct&amp;quot; },
  });
  const body = parse(res);
  check(res, {
    &amp;quot;status is 2xx&amp;quot;: (r) =&amp;gt; r.status &amp;gt;= 200 &amp;amp;&amp;amp; r.status &amp;lt; 300,
    &amp;quot;no GraphQL errors&amp;quot;: () =&amp;gt; body !== null &amp;amp;&amp;amp; !body.errors,
  });
  sleep(1);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-data/sharedarray/&quot;&gt;&lt;code&gt;SharedArray&lt;/code&gt;&lt;/a&gt; carga los ID una sola vez para todos los usuarios virtuales. El &lt;code&gt;try&lt;/code&gt; evita que un cuerpo que no es JSON, como la página de error de un proxy, corte la iteración.&lt;/p&gt;
&lt;p&gt;En &lt;strong&gt;JMeter&lt;/strong&gt;, añade una &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#JSON_Assertion&quot;&gt;JSON Assertion&lt;/a&gt; con la ruta &lt;code&gt;$.errors&lt;/code&gt; y marca &amp;quot;Invert assertion&amp;quot;, para que la muestra falle cuando la ruta exista. Un &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#JSON_Extractor&quot;&gt;JSON Extractor&lt;/a&gt; copia ID en variables para la siguiente operación.&lt;/p&gt;
&lt;p&gt;En &lt;strong&gt;Gatling&lt;/strong&gt;, añade &lt;code&gt;.check(jsonPath(&amp;quot;$.errors&amp;quot;).notExists())&lt;/code&gt;, ambos de su &lt;a href=&quot;https://docs.gatling.io/concepts/checks/&quot;&gt;referencia de checks&lt;/a&gt;. El plugin de GraphQL comprueba el estado y los errores por defecto, pero su &lt;a href=&quot;https://docs.gatling.io/reference/script/graphql/setup/&quot;&gt;página de instalación&lt;/a&gt; limita las ejecuciones con la Community Edition a 5 usuarios y 5 minutos (comprobado el 9 de octubre de 2026). Para pruebas más grandes sin Gatling Enterprise, usa peticiones HTTP normales con ese check.&lt;/p&gt;
&lt;p&gt;En &lt;strong&gt;Artillery&lt;/strong&gt;, el &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/expect&quot;&gt;plugin expect&lt;/a&gt; ofrece &lt;code&gt;notHasProperty: &amp;quot;errors&amp;quot;&lt;/code&gt;, y &lt;code&gt;reportFailuresAsErrors: true&lt;/code&gt; lleva las expectativas fallidas al informe. Un &lt;a href=&quot;https://www.artillery.io/docs/reference/engines/http&quot;&gt;&lt;code&gt;capture&lt;/code&gt;&lt;/a&gt; con una ruta &lt;code&gt;json&lt;/code&gt; pasa un valor a la siguiente petición.&lt;/p&gt;
&lt;h2&gt;¿Qué vigilar además de los tiempos de respuesta?&lt;/h2&gt;
&lt;p&gt;La caché, las consultas persistidas y la carga de la base de datos por petición. Cualquiera de ellas puede hacer que una prueba vaya más rápido o más lento que producción por motivos ajenos a la capacidad.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://graphql.org/learn/performance/&quot;&gt;guía de rendimiento&lt;/a&gt; de graphql.org señala que las consultas enviadas por GET pueden aprovechar la caché HTTP y las CDN, y que las consultas persistidas permiten al cliente enviar un hash en lugar del documento completo. Si tus clientes lo hacen, la prueba también debe hacerlo. Si no, una prueba que repite una consulta con las mismas variables mide una caché que el tráfico real no encuentra. La nota técnica de Apollo añade que Apollo Server, Gateway y el GraphOS Router activan por defecto las consultas persistidas automáticas.&lt;/p&gt;
&lt;p&gt;La misma guía describe el problema N+1: una lista cuyo resolver carga cada elemento por separado convierte una petición en muchas consultas a la base de datos, algo que suele resolverse agrupándolas con una herramienta como DataLoader. Vigila las consultas a la base de datos por segundo junto a las peticiones por segundo; si suben mucho más rápido al crecer la carga, sospecha de un resolver. Los límites de profundidad, de complejidad y de tasa también pueden saltar durante una prueba.&lt;/p&gt;
&lt;h2&gt;¿Desde dónde debe llegar la carga?&lt;/h2&gt;
&lt;p&gt;Desde una sola máquina mientras escribes el script y haces una prueba de humo, y desde la nube cuando necesitas más carga o tráfico desde varias regiones.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://loadfocus.com/es-es/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=how-to-load-test-a-graphql-api&quot;&gt;LoadFocus ejecuta scripts de k6&lt;/a&gt; desde 25 regiones de la nube. Allí, el número de usuarios y la duración salen de la configuración de la prueba y no de las &lt;code&gt;options&lt;/code&gt; del script, y los escenarios con tasa de llegada funcionan con un número fijo de usuarios en lugar de una tasa fija de peticiones, la diferencia que explica el artículo sobre el &lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;modelo de carga abierto y cerrado&lt;/a&gt;. LoadFocus también publica una &lt;a href=&quot;https://loadfocus.com/templates/load-testing-for-graphql-endpoints-with-complex-queries?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=how-to-load-test-a-graphql-api&quot;&gt;plantilla para endpoints GraphQL con consultas complejas&lt;/a&gt; (en inglés).&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Una prueba de carga de GraphQL debe enviar las consultas por GET o por POST?&lt;/strong&gt;
Como lo hagan tus clientes. graphql.org solo permite GET para operaciones de tipo query, y las mutaciones deben usar POST. Si producción envía consultas persistidas por GET a través de una CDN, prueba también ese camino.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿El mismo script sirve para probar la carga de las suscripciones de GraphQL?&lt;/strong&gt;
Normalmente no. graphql.org explica que las suscripciones son de larga duración y suelen ir por WebSockets o server-sent events, así que necesitan su propio escenario en una herramienta que soporte ese transporte.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Una respuesta parcial debe contar como petición fallida?&lt;/strong&gt;
En la mayoría de las pruebas, sí, porque el cliente recibió un error en parte de lo que pidió. Si algunos errores son esperables, como resultados no encontrados para registros borrados, comprueba esos códigos de error concretos y haz fallar el resto.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/how-to-run-a-load-test/&quot;&gt;Cómo hacer una prueba de carga: guía paso a paso&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/load-testing-in-github-actions/&quot;&gt;Pruebas de carga en GitHub Actions: guía práctica&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/websocket-load-testing-tools/&quot;&gt;Herramientas de pruebas de carga WebSocket: seis opciones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/grpc-load-testing/&quot;&gt;Pruebas de carga gRPC: herramientas, configuración, métricas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Herramientas de benchmark HTTP: wrk, hey, oha, ab y más</title><link>https://loadtest.app/es/http-benchmarking-tools/</link><guid isPermaLink="true">https://loadtest.app/es/http-benchmarking-tools/</guid><description>wrk, wrk2, hey, oha, ab, bombardier, autocannon y h2load comparadas: control del ritmo, HTTP/2, salida de latencia, licencia y últimas versiones.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, que vende un servicio de pruebas de carga que aparece en este artículo.&lt;/p&gt;&lt;p&gt;Las herramientas de benchmark HTTP de línea de comandos que usan la mayoría de los equipos son wrk, wrk2, hey, oha, ab (Apache Bench), bombardier, autocannon y h2load. Usa wrk2 cuando necesites un ritmo de peticiones constante y latencias de cola fiables, hey u oha para una comprobación rápida que también hable HTTP/2, h2load cuando lo que pruebas es el propio HTTP/2 o HTTP/3, y autocannon si tu equipo trabaja con Node.js.&lt;/p&gt;
&lt;p&gt;No hemos enfrentado estas herramientas entre sí, así que aquí no hay cifras de velocidad ni veredictos sobre cuál es la más «rápida». Los datos salen del repositorio, el manual o la página de versiones de cada proyecto (comprobados el 9 de octubre de 2026); los consejos sobre cuándo elegir cada una son nuestra opinión.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Herramienta&lt;/th&gt;
&lt;th&gt;Escrita en&lt;/th&gt;
&lt;th&gt;Licencia&lt;/th&gt;
&lt;th&gt;Control del ritmo&lt;/th&gt;
&lt;th&gt;HTTP/2&lt;/th&gt;
&lt;th&gt;Última versión&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;wrk&lt;/td&gt;
&lt;td&gt;C, scripts LuaJIT&lt;/td&gt;
&lt;td&gt;Modified Apache 2.0&lt;/td&gt;
&lt;td&gt;Ninguno&lt;/td&gt;
&lt;td&gt;No documentado&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/wg/wrk/tags&quot;&gt;Tag 4.2.0, feb. 2021&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;wrk2&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Ritmo fijo (&lt;code&gt;-R&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;No documentado&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/giltene/wrk2/commits/master&quot;&gt;Ninguna, último commit sep. 2019&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hey&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Límite por worker (&lt;code&gt;-q&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/rakyll/hey/releases&quot;&gt;v0.1.5, ene. 2026&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;oha&lt;/td&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Límite global (&lt;code&gt;-q&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Sí, y HTTP/3&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/hatoo/oha/releases&quot;&gt;v1.16.0, ago. 2026&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ab&lt;/td&gt;
&lt;td&gt;C (Apache httpd)&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Ninguno&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://httpd.apache.org/download.cgi&quot;&gt;httpd 2.4.69, oct. 2026&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;bombardier&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Límite (&lt;code&gt;-r&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/codesenberg/bombardier/releases&quot;&gt;v2.0.2, mar. 2025&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;autocannon&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Límite (&lt;code&gt;-R&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/mcollina/autocannon/releases&quot;&gt;v8.0.0, oct. 2024&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;h2load&lt;/td&gt;
&lt;td&gt;C++ (nghttp2)&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Por cliente (&lt;code&gt;--rps&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Sí, y HTTP/3&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/nghttp2/nghttp2/releases&quot;&gt;nghttp2 v1.70.0, jul. 2026&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vegeta&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Ritmo fijo (&lt;code&gt;-rate&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/tsenart/vegeta/releases&quot;&gt;v12.13.0, oct. 2025&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Por qué importa que una herramienta fije el ritmo?&lt;/h2&gt;
&lt;p&gt;Una herramienta que mantiene un número fijo de conexiones envía menos en cuanto el servidor se ralentiza, y sus cifras de latencia dejan fuera el tiempo que las peticiones pasaron esperando. Una herramienta de ritmo fijo sigue enviando según lo previsto, y la ralentización aparece en los percentiles.&lt;/p&gt;
&lt;p&gt;Casi todas las herramientas de esta lista trabajan con un número dado de conexiones o workers (&lt;code&gt;-c&lt;/code&gt;), y cada uno espera una respuesta antes de enviar más. El &lt;a href=&quot;https://github.com/giltene/wrk2&quot;&gt;README de wrk2&lt;/a&gt; llama a este punto ciego Coordinated Omission y cronometra cada petición desde el momento en que debería haberse enviado. &lt;a href=&quot;https://github.com/tsenart/vegeta&quot;&gt;Vegeta&lt;/a&gt; también mantiene un ritmo constante; lo verás en nuestro repaso de &lt;a href=&quot;https://loadtest.app/es/open-source-load-testing-tools/&quot;&gt;herramientas de pruebas de carga open source&lt;/a&gt;. oha y autocannon pueden corregir su latencia por ese mismo efecto cuando fijas un ritmo, mientras que hey y bombardier documentan sus opciones de ritmo solo como límites.&lt;/p&gt;
&lt;h2&gt;¿Sigue valiendo la pena wrk?&lt;/h2&gt;
&lt;p&gt;Sí, para ver rápido cuánta carga puede lanzar una sola máquina contra un endpoint, siempre con la salvedad anterior. Su tag más reciente es de febrero de 2021.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/wg/wrk&quot;&gt;wrk&lt;/a&gt; está escrito en C y mantiene un número fijo de conexiones abiertas repartidas entre varios hilos. Los scripts LuaJIT opcionales pueden construir peticiones, procesar respuestas y generar informes propios, y &lt;code&gt;make&lt;/code&gt; lo compila junto con las versiones de LuaJIT y OpenSSL que incluye. Muestra la latencia media, la desviación estándar y el máximo; &lt;code&gt;--latency&lt;/code&gt; añade los percentiles 50, 75, 90 y 99.&lt;/p&gt;
&lt;p&gt;Elige wrk2 en su lugar si necesitas un ritmo de peticiones fijo o latencias de cola en las que puedas confiar durante una ralentización.&lt;/p&gt;
&lt;h2&gt;¿Cuándo necesitas wrk2 en lugar de wrk?&lt;/h2&gt;
&lt;p&gt;Cuando la pregunta es cómo se comporta la latencia a un ritmo de peticiones concreto. wrk2 mantiene ese ritmo constante y registra cada latencia en un HdrHistogram.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/giltene/wrk2&quot;&gt;wrk2&lt;/a&gt; añade a wrk un argumento de rendimiento (&lt;code&gt;-R&lt;/code&gt;, peticiones por segundo). &lt;code&gt;--latency&lt;/code&gt; muestra el espectro completo de percentiles y &lt;code&gt;--u_latency&lt;/code&gt; añade las cifras sin corregir para comparar. Su README avisa de que las ejecuciones de menos de 10 a 20 segundos pueden no dar información útil por un periodo de calibración de 10 segundos, y describe el proyecto como experimental. No tiene versiones publicadas, y su Makefile genera un binario que también se llama &lt;code&gt;wrk&lt;/code&gt;, así que conviene mantener los dos separados.&lt;/p&gt;
&lt;p&gt;Elige oha o autocannon en su lugar si quieres un ajuste de ritmo con corrección de latencia en un proyecto que todavía se mantenga.&lt;/p&gt;
&lt;h2&gt;¿Son intercambiables hey y oha?&lt;/h2&gt;
&lt;p&gt;Para comprobaciones rápidas, en buena medida: las dos ejecutan un grupo de workers durante un número de peticiones o un tiempo, y las dos hablan HTTP/2. Se diferencian en cómo limitan el ritmo y en lo que ves mientras se ejecutan.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/rakyll/hey&quot;&gt;hey&lt;/a&gt; es un pequeño programa en Go con binarios listos para Linux, macOS y Windows y una fórmula de Homebrew. &lt;code&gt;-q&lt;/code&gt; limita las peticiones por segundo de cada worker, &lt;code&gt;-h2&lt;/code&gt; activa HTTP/2, y el resumen incluye un histograma de tiempos de respuesta y una distribución de latencias, o CSV con &lt;code&gt;-o csv&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/hatoo/oha&quot;&gt;oha&lt;/a&gt; está escrito en Rust, se inspira en hey y muestra una interfaz en directo en la terminal. Su &lt;code&gt;-q&lt;/code&gt; fija un ritmo global, &lt;code&gt;--latency-correction&lt;/code&gt; corrige la Coordinated Omission y &lt;code&gt;--http-version&lt;/code&gt; acepta 1.1, 2 y, en una compilación experimental, 3. Se instala con cargo, Homebrew, winget o pacman, y puede escribir JSON o CSV.&lt;/p&gt;
&lt;p&gt;Elige hey en su lugar si un límite por worker encaja con tu forma de pensar la carga; elige oha para HTTP/3, JSON o corrección de latencia.&lt;/p&gt;
&lt;h2&gt;¿Conviene seguir usando ab?&lt;/h2&gt;
&lt;p&gt;Para una comprobación rápida en una máquina donde ya está instalado, sí. ab viene con Apache HTTP Server, y su propio manual enumera limitaciones conocidas.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://httpd.apache.org/docs/2.4/programs/ab.html&quot;&gt;ab&lt;/a&gt; recibe un número de peticiones (&lt;code&gt;-n&lt;/code&gt;) y un nivel de concurrencia (&lt;code&gt;-c&lt;/code&gt;), no tiene opción de ritmo ni de HTTP/2, y solo usa KeepAlive con &lt;code&gt;-k&lt;/code&gt;. Su salida termina con el porcentaje de peticiones servidas dentro de un tiempo dado, y puede escribir esos porcentajes en CSV (&lt;code&gt;-e&lt;/code&gt;) o cada medición en un archivo para gnuplot (&lt;code&gt;-g&lt;/code&gt;). La sección de errores del manual dice que ab no implementa HTTP/1.x por completo y advierte de que su análisis intensivo de cadenas puede hacer que acabes midiendo el rendimiento del propio ab.&lt;/p&gt;
&lt;p&gt;Elige hey u oha en su lugar si necesitas HTTP/2, un límite de ritmo o keep-alive por defecto.&lt;/p&gt;
&lt;h2&gt;¿Para qué sirven bombardier y autocannon?&lt;/h2&gt;
&lt;p&gt;bombardier es una herramienta en Go con HTTP/2 opcional y límite de ritmo. autocannon encaja con equipos de Node.js, porque también funciona como biblioteca dentro de un script de Node.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/codesenberg/bombardier&quot;&gt;bombardier&lt;/a&gt; usa por defecto el cliente fasthttp y cambia al cliente net/http de Go con &lt;code&gt;--http1&lt;/code&gt; o &lt;code&gt;--http2&lt;/code&gt;. &lt;code&gt;-r&lt;/code&gt; fija un límite de ritmo, &lt;code&gt;-l&lt;/code&gt; muestra los percentiles 50, 75, 90 y 99, y &lt;code&gt;-o json&lt;/code&gt; deja el resultado listo para procesarlo con otras herramientas.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/mcollina/autocannon&quot;&gt;autocannon&lt;/a&gt; se describe como una herramienta HTTP/1.1 con pipelining y HTTPS, y se instala con &lt;code&gt;npm i autocannon -g&lt;/code&gt;. &lt;code&gt;-R&lt;/code&gt; limita el ritmo global y &lt;code&gt;-r&lt;/code&gt; el de cada conexión, y en cuanto fijas uno de los dos, la latencia se corrige por Coordinated Omission. Su tabla muestra los percentiles 2,5, 50, 97,5 y 99, &lt;code&gt;-l&lt;/code&gt; los muestra todos y &lt;code&gt;-j&lt;/code&gt; escribe JSON.&lt;/p&gt;
&lt;p&gt;Elige autocannon en lugar de bombardier si tus benchmarks viven en una suite de pruebas de Node.js, y bombardier si necesitas HTTP/2.&lt;/p&gt;
&lt;h2&gt;¿Qué herramienta está pensada para HTTP/2 y HTTP/3?&lt;/h2&gt;
&lt;p&gt;h2load. Viene del proyecto nghttp2, prefiere HTTP/2 y puede forzar HTTP/1.1 o, si se compiló con soporte, HTTP/3.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nghttp2.org/documentation/h2load-howto.html&quot;&gt;h2load&lt;/a&gt; se compila junto con nghttp2 pasando &lt;code&gt;--enable-app&lt;/code&gt; a &lt;code&gt;./configure&lt;/code&gt;. Además del número de clientes (&lt;code&gt;-c&lt;/code&gt;), fija los flujos simultáneos por cliente (&lt;code&gt;-m&lt;/code&gt;) para poner a prueba la multiplexación bajo carga, y &lt;code&gt;--rps&lt;/code&gt; fija las peticiones por segundo de cada cliente. El &lt;a href=&quot;https://nghttp2.org/documentation/h2load.1.html&quot;&gt;manual&lt;/a&gt; da el mínimo, el máximo, la media, la mediana, el p95 y el p99 del tiempo de petición, del tiempo de conexión y del tiempo hasta el primer byte. El soporte de HTTP/3 figura como experimental.&lt;/p&gt;
&lt;p&gt;Elige oha en su lugar si quieres HTTP/2 con menos opciones y una vista en directo.&lt;/p&gt;
&lt;h2&gt;¿Cuándo pasar de un benchmark a una prueba de carga de verdad?&lt;/h2&gt;
&lt;p&gt;Cuando la pregunta tiene que ver con recorridos de usuario, con más carga de la que puede generar una máquina o con tráfico que llegue desde donde están tus usuarios.&lt;/p&gt;
&lt;p&gt;Todas estas herramientas envían peticiones sencillas desde una sola máquina, y la guía de h2load recuerda que el propio cliente puede convertirse en el cuello de botella. Pasa a una herramienta de pruebas de carga si necesitas inicios de sesión, recorridos de varios pasos o tiempo de reflexión, si el tráfico tiene que llegar desde varias regiones o si una prueba debe aprobar o fallar en la CI. Nuestra guía &lt;a href=&quot;https://loadtest.app/es/how-to-run-a-load-test/&quot;&gt;Cómo hacer una prueba de carga&lt;/a&gt; lo explica paso a paso, y &lt;a href=&quot;https://loadtest.app/es/k6-vs-artillery/&quot;&gt;k6 vs Artillery&lt;/a&gt; compara dos herramientas con scripts.&lt;/p&gt;
&lt;p&gt;LoadFocus, el editor de este sitio, &lt;a href=&quot;https://loadfocus.com/es-es/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=http-benchmarking-tools&quot;&gt;ejecuta pruebas de carga&lt;/a&gt; para webs y API desde 25 regiones en la nube, con JMeter, k6 o pruebas sin código. Si tu benchmark es una petición que ya envías con curl, su &lt;a href=&quot;https://loadfocus.com/es-es/curl-to-k6?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=http-benchmarking-tools&quot;&gt;conversor de cURL a k6&lt;/a&gt; gratuito la convierte en un script de k6 en tu propio navegador.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Qué diferencia hay entre wrk y wrk2?&lt;/strong&gt;
wrk2 es un fork de wrk que envía peticiones a un ritmo constante fijado con &lt;code&gt;-R&lt;/code&gt; y cronometra cada petición desde el momento en que debería haberse enviado. wrk mantiene ocupado un número fijo de conexiones y no tiene ajuste de ritmo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué herramientas de benchmark HTTP admiten HTTP/2?&lt;/strong&gt;
Según su documentación, hey, oha, bombardier, h2load y Vegeta. wrk y wrk2 no lo documentan, autocannon se describe como una herramienta HTTP/1.1 y ab no tiene opción de HTTP/2.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-source-load-testing-tools/&quot;&gt;Herramientas de pruebas de carga open source: seis opciones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/coordinated-omission/&quot;&gt;Coordinated omission: qué es y cómo evitarla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/websocket-load-testing-tools/&quot;&gt;Herramientas de pruebas de carga WebSocket: seis opciones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/tail-latency/&quot;&gt;Latencia de cola: qué es y cómo medirla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/redis-benchmark/&quot;&gt;redis-benchmark: cómo usarlo y leer sus resultados&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Ley de Little en pruebas de carga: dimensionar y comprobar</title><link>https://loadtest.app/es/littles-law-load-testing/</link><guid isPermaLink="true">https://loadtest.app/es/littles-law-load-testing/</guid><description>La ley de Little en pruebas de carga explicada: cómo se relacionan usuarios, peticiones por segundo y tiempo de respuesta, y cómo dimensionar una prueba.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, un servicio de pruebas de carga mencionado en este artículo.&lt;/p&gt;&lt;p&gt;La ley de Little en pruebas de carga dice que el número medio de usuarios o peticiones dentro de un sistema es igual al ritmo al que lo atraviesan multiplicado por el tiempo medio que cada uno pasa en él: L = λW. Con un número fijo de usuarios virtuales, eso se convierte en usuarios = vueltas por segundo × (tiempo de respuesta + tiempo de reflexión), lo que te dice antes de una prueba si el plan puede alcanzar su tasa objetivo y, después, si los resultados cuadran. Trabaja con medias sobre un tramo estable de la prueba, así que no dice nada de los percentiles.&lt;/p&gt;
&lt;p&gt;Los ejemplos de abajo son aritmética, sin ninguna prueba detrás. Los datos sobre herramientas salen de la documentación de cada proyecto, comprobada el 9 de octubre de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Término&lt;/th&gt;
&lt;th&gt;Definición de Little&lt;/th&gt;
&lt;th&gt;Usuarios virtuales fijos (modelo cerrado)&lt;/th&gt;
&lt;th&gt;Tasa de llegada (modelo abierto)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;L&lt;/td&gt;
&lt;td&gt;Número medio de elementos en el sistema&lt;/td&gt;
&lt;td&gt;Usuarios virtuales, esperando o en pausa&lt;/td&gt;
&lt;td&gt;Iteraciones en curso&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;λ&lt;/td&gt;
&lt;td&gt;Tasa media de llegada&lt;/td&gt;
&lt;td&gt;Vueltas completadas por segundo&lt;/td&gt;
&lt;td&gt;La tasa que fijas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;W&lt;/td&gt;
&lt;td&gt;Tiempo medio dentro del sistema&lt;/td&gt;
&lt;td&gt;Tiempo de respuesta + tiempo de reflexión por vuelta&lt;/td&gt;
&lt;td&gt;Duración de una iteración&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Qué dice la ley de Little?&lt;/h2&gt;
&lt;p&gt;A largo plazo, el número medio de elementos en un sistema de colas es igual a su tasa media de llegada multiplicada por el tiempo medio que cada uno pasa en él. Si conoces dos de las tres magnitudes, puedes calcular la tercera.&lt;/p&gt;
&lt;p&gt;John D. C. Little publicó la demostración en 1961 en Operations Research con el título &lt;a href=&quot;https://doi.org/10.1287/opre.9.3.383&quot;&gt;A Proof for the Queuing Formula: L = λW&lt;/a&gt;. En su &lt;a href=&quot;https://doi.org/10.1287/opre.1110.0940&quot;&gt;revisión por el 50.º aniversario&lt;/a&gt;, de 2011, escribe que se cumple en condiciones notablemente generales: para una sola cola o una red entera, para una subclase de elementos o para todos, y sea cual sea el orden de servicio. El mismo artículo traslada los términos a un servidor: peticiones en proceso, peticiones por segundo y tiempo de respuesta medio.&lt;/p&gt;
&lt;h2&gt;¿Qué significan L, λ y W en una prueba de carga?&lt;/h2&gt;
&lt;p&gt;Depende de dónde trazas el límite del sistema. Alrededor del servidor, L son las peticiones en curso y W el tiempo de respuesta; alrededor de la vuelta completa de un usuario virtual, L son todos los usuarios virtuales y W el tiempo de respuesta más el tiempo de reflexión.&lt;/p&gt;
&lt;p&gt;En una prueba con modelo cerrado, cada usuario está siempre en algún punto de su vuelta: esperando una respuesta o haciendo una pausa entre dos pasos. Con el límite alrededor de la vuelta, todos cuentan como «dentro», λ es el ritmo al que terminan las vueltas y W la duración media de una vuelta, incluido el &lt;a href=&quot;https://loadtest.app/es/think-time-in-load-testing/&quot;&gt;tiempo de reflexión&lt;/a&gt; que añade el script:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;usuarios = vueltas por segundo × (respuesta + reflexión)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alrededor del servidor, la misma ley da las peticiones en vuelo: peticiones por segundo × tiempo de respuesta medio, la cifra que tienen que absorber tus pools de conexiones y tus hilos de trabajo. Mantén los tres valores en el mismo límite y el mismo tramo de tiempo; mezclarlos da resultados plausibles y equivocados.&lt;/p&gt;
&lt;h2&gt;¿Cómo se dimensiona una prueba con modelo cerrado usando la ley de Little?&lt;/h2&gt;
&lt;p&gt;Convierte la tasa de peticiones objetivo en vueltas por segundo y multiplícala por la duración esperada de una vuelta: el resultado es el número de usuarios virtuales que necesita el plan. Usa el tiempo de respuesta que esperas con la carga objetivo, que suele ser mayor que el que ves con pocos usuarios.&lt;/p&gt;
&lt;p&gt;Un ejemplo, solo aritmética. El objetivo son 100 peticiones por segundo, cada vuelta envía 4 peticiones que deberían tardar 0,5 segundos cada una, y el script hace 3 pausas de 2 segundos de media:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;vueltas por segundo = 100 peticiones/s ÷ 4 peticiones = 25
duración por vuelta = 4 × 0,5 s + 3 × 2 s             = 8 s
usuarios virtuales  = 25 vueltas/s × 8 s              = 200
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Toma 200 como mínimo. Si las respuestas tardan 1 segundo con esa carga, una vuelta dura 10 segundos y el mismo objetivo necesita 250 usuarios.&lt;/p&gt;
&lt;h2&gt;¿Por qué los mismos usuarios envían menos peticiones cuando el sistema se ralentiza?&lt;/h2&gt;
&lt;p&gt;El número de usuarios es fijo, así que cuando una vuelta se alarga, las vueltas por segundo tienen que bajar. La carga cae justo cuando el sistema empieza a sufrir.&lt;/p&gt;
&lt;p&gt;Mantén los 200 usuarios y haz que cada petición tarde 2 segundos. Una vuelta dura ahora 4 × 2 + 6 = 14 segundos, y 200 ÷ 14 da unas 14,3 vueltas, o unas 57 peticiones por segundo. La prueba sigue mostrando 200 usuarios mientras funciona a poco más de la mitad de la tasa prevista. El artículo sobre el &lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;modelo de carga abierto vs cerrado&lt;/a&gt; explica por qué eso oculta la saturación; la ley de Little predice el tamaño de la caída.&lt;/p&gt;
&lt;p&gt;También muestra cómo se ve un límite de capacidad. Cuando la tasa de peticiones ya no puede subir, cada usuario extra solo añade espera: con un techo de 25 vueltas por segundo, 300 usuarios suponen 12 segundos por vuelta y 400 usuarios, 16. El gráfico de LoadFocus &lt;a href=&quot;https://loadfocus.com/docs/es-es/guides/load-testing/response-time-vs-virtual-users?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=littles-law-load-testing&quot;&gt;tiempo de respuesta vs usuarios virtuales&lt;/a&gt; representa el tiempo de respuesta medio y máximo frente al número de usuarios virtuales activos, un punto por cada nivel alcanzado, y ahí es donde aparece esa subida constante.&lt;/p&gt;
&lt;h2&gt;¿Cómo se comprueba una prueba terminada con la ley de Little?&lt;/h2&gt;
&lt;p&gt;Toma la tasa de peticiones y el tiempo de respuesta medios de un tramo en el que el número de usuarios se mantuvo estable, reconstruye a partir de ellos el número de usuarios y compáralo con lo que configuraste. Una diferencia grande significa que parte del tiempo se escapa de tus cifras.&lt;/p&gt;
&lt;p&gt;Otro ejemplo aritmético. Una prueba mantiene 200 usuarios y registra 80 peticiones por segundo con una media de 0,6 segundos, con las mismas 4 peticiones y 6 segundos de pausas por vuelta. Son 20 vueltas por segundo de 4 × 0,6 + 6 = 8,4 segundos cada una, suficiente para 168 usuarios. Los 32 restantes significan que cada vuelta duró en realidad 10 segundos, así que hay unos 1,6 segundos por vuelta sin explicar. Dónde buscar:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;El establecimiento de conexiones. En k6, &lt;code&gt;http_req_duration&lt;/code&gt; deja fuera la resolución DNS y la conexión (&lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/metrics/reference/&quot;&gt;referencia de métricas&lt;/a&gt;, comprobada el 9 de octubre de 2026).&lt;/li&gt;
&lt;li&gt;El generador de carga. Un generador saturado retrasa el script entre peticiones.&lt;/li&gt;
&lt;li&gt;El tiempo de reflexión. Las pausas aleatorias pueden durar de media más de lo previsto.&lt;/li&gt;
&lt;li&gt;La ventana. Si se solapa con una rampa, hubo de media menos usuarios activos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;k6 también mide la vuelta directamente: &lt;code&gt;vus&lt;/code&gt; cuenta los usuarios virtuales activos e &lt;code&gt;iteration_duration&lt;/code&gt; la duración de una iteración completa, así que los usuarios activos deberían quedar cerca de las iteraciones por segundo × la duración media de una iteración.&lt;/p&gt;
&lt;h2&gt;¿Qué pasa con las pruebas por tasa de llegada?&lt;/h2&gt;
&lt;p&gt;La ley se cumple con el límite alrededor de cada iteración: las iteraciones en curso son iguales a la tasa de llegada por la duración de una iteración. Ese es el número de usuarios virtuales que la herramienta tiene que tener listos.&lt;/p&gt;
&lt;p&gt;La guía de k6 sobre la &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/arrival-rate-vu-allocation/&quot;&gt;asignación de VU para los ejecutores de tasa de llegada&lt;/a&gt; los estima como la duración mediana de una iteración × la tasa, más una constante para la variabilidad (comprobado el 9 de octubre de 2026). Es la ley de Little con la mediana en lugar de la media; unas pocas iteraciones lentas suben la media por encima de la mediana, por eso importa el margen.&lt;/p&gt;
&lt;p&gt;LoadFocus ejecuta &lt;a href=&quot;https://loadfocus.com/es-es/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=littles-law-load-testing&quot;&gt;scripts de k6&lt;/a&gt; en su nube, y allí los escenarios de tasa de llegada se ejecutan con un número fijo de usuarios; el validador de scripts lo avisa cuando añades un script así. Dimensiona esas pruebas con el cálculo del modelo cerrado de arriba y cuenta con que la tasa baje si las respuestas se ralentizan.&lt;/p&gt;
&lt;h2&gt;¿Dónde deja de funcionar la ley de Little?&lt;/h2&gt;
&lt;p&gt;Relaciona medias sobre un tramo en el que el sistema está en equilibrio. Los percentiles, las ventanas cortas y las rampas quedan fuera.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Solo medias. Una prueba puede cumplir la ley mientras una de cada veinte peticiones espera diez veces la media; juzga también los resultados por percentiles.&lt;/li&gt;
&lt;li&gt;Un tramo estable. La demostración de 1961 supone un proceso estacionario, y la revisión de 2011 muestra que la fórmula también es exacta en una ventana finita que empieza y termina vacía. Una meseta de prueba no es ninguna de las dos cosas, así que elige una larga, en la que tantos usuarios terminen vueltas como las empiecen.&lt;/li&gt;
&lt;li&gt;Rampas. Mientras se añaden usuarios, el pico configurado no es L: usa la media temporal de usuarios de la ventana o deja la rampa fuera.&lt;/li&gt;
&lt;li&gt;Errores. Los fallos rápidos cuentan como peticiones completadas con tiempos cortos, así que un sistema que falla puede seguir cuadrando la ecuación. Revisa primero la tasa de errores.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿La ley de Little necesita llegadas de Poisson o un tipo de cola concreto?&lt;/strong&gt;
No. Las demostraciones de la revisión de Little no suponen nada sobre el patrón de llegadas ni sobre los tiempos de servicio, y el resultado se cumple sea cual sea el orden de servicio. Solo hace falta que las medias existan en el periodo que mides.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede la ley de Little predecir el tiempo de respuesta p95?&lt;/strong&gt;
No. Relaciona tres medias, así que puede comprobar un tiempo de respuesta medio, pero no dice nada sobre la forma de la distribución ni sobre el pequeño porcentaje más lento.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;Modelo de carga abierto vs cerrado: cuál usar y cuándo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/think-time-in-load-testing/&quot;&gt;Tiempo de reflexión en pruebas de carga: cómo fijarlo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/how-to-run-a-load-test/&quot;&gt;Cómo hacer una prueba de carga: guía paso a paso&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/throughput-vs-latency/&quot;&gt;Rendimiento vs latencia: cómo se relacionan bajo carga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/redis-benchmark/&quot;&gt;redis-benchmark: cómo usarlo y leer sus resultados&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/amdahls-law/&quot;&gt;Ley de Amdahl: fórmula, ejemplos y límites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/queueing-theory/&quot;&gt;Teoría de colas: qué es y por qué se dispara la latencia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Criterios de aprobación en pruebas de carga: cómo fijarlos</title><link>https://loadtest.app/es/load-test-pass-fail-criteria/</link><guid isPermaLink="true">https://loadtest.app/es/load-test-pass-fail-criteria/</guid><description>Cómo fijar criterios de aprobación en pruebas de carga: partir de un SLO, elegir límites de latencia, errores y tasa, y separar los fallos de los avisos.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, un servicio de pruebas de carga mencionado en este artículo.&lt;/p&gt;&lt;p&gt;Los criterios de aprobación en pruebas de carga son los pocos límites que una ejecución debe cumplir para darse por aprobada: un percentil de latencia para las peticiones que esperan los usuarios, una tasa de errores y una tasa mínima de peticiones, todo con una carga determinada. Saca los límites de un objetivo de nivel de servicio (SLO), coloca dentro de ellos límites de regresión tomados de ejecuciones anteriores y deja que el código de salida de la herramienta haga fallar la ejecución solo por esos límites estrictos. Todo lo demás es un aviso que lee una persona.&lt;/p&gt;
&lt;p&gt;Los datos sobre las herramientas se comprobaron el 9 de octubre de 2026 en la documentación de cada proyecto, y cada límite que aparece es un ejemplo.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterio&lt;/th&gt;
&lt;th&gt;Límite de ejemplo&lt;/th&gt;
&lt;th&gt;De dónde sale el número&lt;/th&gt;
&lt;th&gt;Si no se cumple&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;p95 de latencia, pago&lt;/td&gt;
&lt;td&gt;Menos de 400 ms&lt;/td&gt;
&lt;td&gt;SLO de latencia menos un margen&lt;/td&gt;
&lt;td&gt;Fallo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;p99 de latencia, pago&lt;/td&gt;
&lt;td&gt;Menos de 1200 ms&lt;/td&gt;
&lt;td&gt;Ejecuciones anteriores de esta prueba&lt;/td&gt;
&lt;td&gt;Aviso&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tasa de errores&lt;/td&gt;
&lt;td&gt;Menos del 0,5 %&lt;/td&gt;
&lt;td&gt;SLO de disponibilidad&lt;/td&gt;
&lt;td&gt;Fallo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peticiones por segundo&lt;/td&gt;
&lt;td&gt;Al menos el 95 % del plan&lt;/td&gt;
&lt;td&gt;La carga prevista&lt;/td&gt;
&lt;td&gt;Fallo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU del generador de carga&lt;/td&gt;
&lt;td&gt;Menos del 80 %&lt;/td&gt;
&lt;td&gt;Herramienta o plataforma&lt;/td&gt;
&lt;td&gt;Ejecución no válida&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Qué hace que una prueba de carga se apruebe o falle?&lt;/h2&gt;
&lt;p&gt;Una ejecución se aprueba cuando todos los límites estrictos se cumplen con la carga prevista, y falla en cuanto uno no se cumple. No es válida cuando la propia prueba no hizo su trabajo, digan lo que digan los números.&lt;/p&gt;
&lt;p&gt;Un generador de carga saturado, una carga que nunca llegó a su objetivo o un script con errores producen números sobre el montaje de la prueba. LoadFocus, por ejemplo, muestra un aviso de &lt;a href=&quot;https://loadfocus.com/docs/es-es/guides/load-testing/load-generator-saturation?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=load-test-pass-fail-criteria&quot;&gt;saturación del generador de carga&lt;/a&gt; cuando algún motor alcanzó o superó el 80 % de CPU en su pico. Los &lt;a href=&quot;https://github.com/grafana/k6/blob/master/errext/exitcodes/codes.go&quot;&gt;códigos de salida de k6&lt;/a&gt; separan los casos para la CI: 99 indica umbrales incumplidos y 107 una excepción en el script (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo se convierte un SLO en criterios de prueba de carga?&lt;/h2&gt;
&lt;p&gt;Reformula cada SLO que la carga puede romper, normalmente latencia y disponibilidad, como un límite sobre lo que mide la prueba, y hazlo más estricto que el SLO para que aprobar deje margen.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://sre.google/sre-book/service-level-objectives/&quot;&gt;libro de SRE de Google&lt;/a&gt; define un SLO como un valor objetivo o un rango de valores para un nivel de servicio medido por un indicador (SLI), con ejemplos como: el 99 % de las llamadas &lt;code&gt;Get&lt;/code&gt; terminan en menos de 100 ms. Pide que un SLO diga cómo se mide y en qué condiciones es válido, y recomienda un margen de seguridad: un objetivo interno más estricto que el que se promete a los usuarios.&lt;/p&gt;
&lt;p&gt;En una prueba de carga, esas condiciones son la carga y la mezcla de peticiones. «El 95 % de las llamadas de pago en menos de 500 ms» podría convertirse, por ejemplo, en «p95 del pago por debajo de 400 ms con 300 peticiones por segundo durante 15 minutos». Si aún no hay SLO, acuerda uno provisional con el responsable de producto.&lt;/p&gt;
&lt;h2&gt;¿Qué métricas deben cubrir los criterios?&lt;/h2&gt;
&lt;p&gt;La latencia de las peticiones que esperan los usuarios, una tasa de errores, la tasa de peticiones alcanzada y, sobre todo como avisos, los recursos de los servidores.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Latencia por tipo de petición.&lt;/strong&gt; Un percentil global mezcla un health check rápido con una búsqueda lenta. En k6, las &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;peticiones etiquetadas crean submétricas&lt;/a&gt; con sus propios límites; en Gatling, &lt;code&gt;details()&lt;/code&gt; apunta a una petición o un grupo. Una prueba que frenó su propia carga da percentiles demasiado favorables (&lt;a href=&quot;https://loadtest.app/es/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Errores, en sentido amplio.&lt;/strong&gt; Un 200 rápido con una página de error sigue siendo un fallo, así que comprueba el contenido. Una &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Response_Assertion&quot;&gt;Response Assertion&lt;/a&gt; de JMeter que falla marca su muestra como no exitosa; los checks de k6 solo afectan al código de salida a través de un umbral.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Un mínimo de tasa de peticiones.&lt;/strong&gt; En un modelo de carga cerrado, un sistema lento recibe menos peticiones, de modo que una ejecución puede cumplir sus límites de latencia con una fracción de la carga prevista (&lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;modelo de carga abierto vs cerrado&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recursos de los servidores.&lt;/strong&gt; CPU, memoria y uso de pools salen de tu monitorización. Trátalos como avisos salvo que un plan de capacidad fije un techo estricto.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;¿Cómo se eligen los números?&lt;/h2&gt;
&lt;p&gt;El techo sale del SLO y el límite de regresión, de ejecuciones anteriores de la misma prueba. El SLO dice lo que toleran los usuarios; las ejecuciones anteriores, lo que este build hace normalmente.&lt;/p&gt;
&lt;p&gt;El libro de SRE desaconseja fijar un SLO a partir del comportamiento actual. Un límite de regresión existe para detectar cambios, así que el comportamiento actual es justo su materia prima. Ejecuta varias veces el build sin cambios con el mismo entorno y la misma carga, anota cuánto varía cada métrica y pon el límite por encima de la peor ejecución con algo de margen, siempre por debajo del techo derivado del SLO cuando lo haya.&lt;/p&gt;
&lt;p&gt;Si las ejecuciones de un mismo build varían más que la regresión que quieres detectar, la prueba es demasiado ruidosa para bloquear builds: alarga primero la fase estable o aísla el entorno. Registra nuevas ejecuciones de referencia tras cualquier cambio deliberado.&lt;/p&gt;
&lt;h2&gt;¿Qué criterios deben hacer fallar el build y cuáles solo avisar?&lt;/h2&gt;
&lt;p&gt;Haz fallar el build con los límites que vienen de un SLO o que comprueban que las respuestas son correctas. Avisa con los percentiles de cola, el uso de recursos y las derivas lentas, que piden criterio; una barrera que falla por ruido acaba desactivada pronto.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/ensure&quot;&gt;plugin &lt;code&gt;ensure&lt;/code&gt;&lt;/a&gt; de Artillery tiene un nivel de aviso: una condición con &lt;code&gt;strict: false&lt;/code&gt; es opcional, así que incumplirla no cambia el código de salida (comprobado el 9 de octubre de 2026). En k6, un check sin umbral nunca hace fallar la ejecución. En el resto de herramientas, deja los avisos fuera de las aserciones.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;config:
  plugins:
    ensure:
      thresholds:
        - &amp;quot;http.response_time.p95&amp;quot;: 400
      conditions:
        - expression: &amp;quot;http.response_time.p99 &amp;lt; 1200&amp;quot;
          strict: false
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;¿Cuándo debe detenerse antes de tiempo una prueba de carga?&lt;/h2&gt;
&lt;p&gt;Cuando seguir solo puede hacer daño o ya no demuestra nada: errores muy por encima del límite, un sistema ya caído o un generador que no da abasto. Dale a la regla un periodo de gracia para que el ruido del arranque no la dispare.&lt;/p&gt;
&lt;p&gt;Haz las reglas de parada más laxas que los límites de aprobación: protegen un entorno compartido. En k6, &lt;code&gt;abortOnFail&lt;/code&gt; detiene la prueba en cuanto falla un umbral, tras un &lt;code&gt;delayAbortEval&lt;/code&gt; opcional. La &lt;a href=&quot;https://docs.locust.io/en/stable/extending-locust.html&quot;&gt;documentación de Locust sobre extensiones&lt;/a&gt; muestra un greenlet en segundo plano que detiene la ejecución cuando la proporción de fallos supera un umbral. En Gatling, &lt;a href=&quot;https://docs.gatling.io/concepts/scenario/&quot;&gt;&lt;code&gt;crashLoadGeneratorIf&lt;/code&gt;&lt;/a&gt; detiene el generador con un código de fallo cuando se cumple una condición en la sesión de un usuario virtual. Un &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Thread_Group&quot;&gt;Thread Group&lt;/a&gt; de JMeter puede detener la prueba ante un error de sampler, algo adecuado para una comprobación de corrección (todo comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo codifica cada herramienta los criterios?&lt;/h2&gt;
&lt;p&gt;k6 y Artillery convierten un límite estricto incumplido en un código de salida distinto de cero, Locust lo hace ante cualquier petición fallida o con los límites que programes tú, y las aserciones de Gatling hacen fallar el build. JMeter deja el veredicto a un paso posterior a la ejecución.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;k6&lt;/strong&gt;: los &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;umbrales&lt;/a&gt; van en las opciones del script. Este ejemplo falla por el p95 de las peticiones etiquetadas &lt;code&gt;name: checkout&lt;/code&gt; o por un 0,5 % de errores, y se detiene pasado un minuto si los errores superan el 5 %:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;export const options = {
  thresholds: {
    &amp;quot;http_req_duration{name:checkout}&amp;quot;: [&amp;quot;p(95)&amp;lt;400&amp;quot;],
    http_req_failed: [
      &amp;quot;rate&amp;lt;0.005&amp;quot;,
      { threshold: &amp;quot;rate&amp;lt;0.05&amp;quot;, abortOnFail: true,
        delayAbortEval: &amp;quot;1m&amp;quot; },
    ],
  },
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Gatling&lt;/strong&gt;: las &lt;a href=&quot;https://docs.gatling.io/concepts/assertions/&quot;&gt;aserciones&lt;/a&gt; combinan un ámbito (&lt;code&gt;global&lt;/code&gt;, &lt;code&gt;forAll&lt;/code&gt;, &lt;code&gt;details&lt;/code&gt;), una estadística como un percentil o &lt;code&gt;requestsPerSec&lt;/code&gt;, y una condición. Se evalúan al terminar la ejecución, y una sola aserción fallida hace fallar la simulación.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Locust&lt;/strong&gt; &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;termina con código 1 si alguna petición falló&lt;/a&gt;, y &lt;code&gt;--exit-code-on-error&lt;/code&gt; cambia ese código. Para una proporción o un percentil, asigna &lt;code&gt;environment.process_exit_code&lt;/code&gt; en un listener de &lt;code&gt;quitting&lt;/code&gt;; el &lt;a href=&quot;https://github.com/locustio/locust/blob/master/locust/main.py&quot;&gt;código fuente de Locust&lt;/a&gt; da prioridad a ese valor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JMeter&lt;/strong&gt; juzga cada muestra con sus aserciones, y sus &lt;a href=&quot;https://jmeter.apache.org/usermanual/get-started.html&quot;&gt;opciones de línea de comandos&lt;/a&gt; no incluyen ningún límite para la ejecución completa. Decide la CI: con un script corto sobre el archivo de resultados, como en nuestra &lt;a href=&quot;https://loadtest.app/es/load-testing-in-github-actions/&quot;&gt;guía de GitHub Actions&lt;/a&gt;, o con el &lt;a href=&quot;https://github.com/jmeter-maven-plugin/jmeter-maven-plugin/wiki/Test-Results-File-Format&quot;&gt;jmeter-maven-plugin&lt;/a&gt;, un plugin de terceros cuyo goal &lt;code&gt;results&lt;/code&gt; hace fallar el build si falla una sola muestra, salvo que &lt;code&gt;errorRateThresholdInPercent&lt;/code&gt; fije una tasa (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LoadFocus&lt;/strong&gt; evalúa las ejecuciones según &lt;a href=&quot;https://loadfocus.com/docs/es-es/guides/load-testing/pass-fail-thresholds?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=load-test-pass-fail-criteria&quot;&gt;umbrales de aprobado o fallo&lt;/a&gt; guardados en la prueba: tiempos de respuesta p95 y p99 máximos, tasa de errores máxima y tasa mínima de peticiones, cada uno opcional. Cada ejecución recibe una insignia PASS o FAIL con los valores reales y los objetivos, y una API entrega el veredicto a un pipeline. LoadFocus ejecuta los escenarios de k6 con tasa de llegada con un número fijo de usuarios, así que ahí un mínimo de tasa comprueba lo que lograron esos usuarios.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Debe ser el tiempo de respuesta medio un criterio de aprobación?&lt;/strong&gt;
Rara vez. El libro de SRE prefiere los percentiles: una media oculta la cola larga y puede quedarse plana mientras las peticiones más lentas se vuelven mucho más lentas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuántos criterios de aprobación debe tener una prueba de carga?&lt;/strong&gt;
Un puñado de límites estrictos, más avisos. El libro de SRE aconseja tener los menos SLO posibles y dice que, si citar uno nunca permite ganar una discusión sobre prioridades, probablemente no merece la pena tenerlo. Aplica la misma regla a cada límite de una prueba de carga.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede aprobarse una prueba de carga con algunas peticiones fallidas?&lt;/strong&gt;
Sí, si la tasa de errores se mantiene por debajo de su límite. Revisa el comportamiento por defecto de tu herramienta: Locust hace fallar la ejecución con una sola petición fallida.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/load-testing-in-github-actions/&quot;&gt;Pruebas de carga en GitHub Actions: guía práctica&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/coordinated-omission/&quot;&gt;Coordinated omission: qué es y cómo evitarla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/how-to-run-a-load-test/&quot;&gt;Cómo hacer una prueba de carga: guía paso a paso&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/apdex-score/&quot;&gt;Puntuación Apdex: qué es y cómo se calcula&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/slo-vs-sla/&quot;&gt;SLO vs SLA: diferencia, SLI y presupuesto de error&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Pruebas de carga en GitHub Actions: guía práctica</title><link>https://loadtest.app/es/load-testing-in-github-actions/</link><guid isPermaLink="true">https://loadtest.app/es/load-testing-in-github-actions/</guid><description>Cómo montar pruebas de carga en GitHub Actions con k6, Artillery, Locust o JMeter: umbrales que hacen fallar el job, artefactos y límites de un runner.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, un servicio de pruebas de carga mencionado en este artículo.&lt;/p&gt;&lt;p&gt;Para hacer pruebas de carga en GitHub Actions basta un archivo de workflow: instalar la herramienta, lanzar una prueba corta contra una URL de staging y dejar que el código de salida de la herramienta haga fallar el job cuando no se cumple un umbral. Sube los resultados como artefacto para que cada ejecución deje constancia. Mantén la prueba pequeña, porque un runner estándar alojado por GitHub es una sola máquina virtual con pocos núcleos de CPU.&lt;/p&gt;
&lt;p&gt;Los datos sobre las herramientas y sobre GitHub salen de la documentación de cada proveedor, comprobados el 9 de octubre de 2026, y los workflows siguen ese uso documentado.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Herramienta&lt;/th&gt;
&lt;th&gt;Se instala con&lt;/th&gt;
&lt;th&gt;Qué hace fallar el job&lt;/th&gt;
&lt;th&gt;Resultados que conservar&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;setup-k6-action&lt;/code&gt; de Grafana&lt;/td&gt;
&lt;td&gt;Un umbral incumplido&lt;/td&gt;
&lt;td&gt;Salida JSON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artillery&lt;/td&gt;
&lt;td&gt;&lt;code&gt;artilleryio/action-cli&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Una comprobación &lt;code&gt;ensure&lt;/code&gt; fallida&lt;/td&gt;
&lt;td&gt;&lt;code&gt;report.json&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pip install locust&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cualquier petición fallida o una regla propia&lt;/td&gt;
&lt;td&gt;Archivos CSV y HTML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;El archivo de la versión&lt;/td&gt;
&lt;td&gt;Nada integrado: añade un paso de control&lt;/td&gt;
&lt;td&gt;Archivo &lt;code&gt;.jtl&lt;/code&gt; e informe HTML&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Qué necesita un workflow de pruebas de carga?&lt;/h2&gt;
&lt;p&gt;Un disparador, un runner, un paso que instale la herramienta, un paso que ejecute la prueba con umbrales y un paso que suba los resultados. Todo lo demás es opcional.&lt;/p&gt;
&lt;p&gt;Guarda el script de prueba en el repositorio, por ejemplo en &lt;code&gt;tests/load/&lt;/code&gt;. Lee la URL de staging de una variable del repositorio mediante el &lt;a href=&quot;https://docs.github.com/en/actions/reference/workflows-and-actions/contexts&quot;&gt;contexto &lt;code&gt;vars&lt;/code&gt;&lt;/a&gt; y fija &lt;code&gt;timeout-minutes&lt;/code&gt; en el job: &lt;a href=&quot;https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax&quot;&gt;el valor por defecto es de 360 minutos&lt;/a&gt; (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Qué eventos deberían lanzar una prueba de carga?&lt;/h2&gt;
&lt;p&gt;Ejecuta una prueba corta en los pull requests y otra más larga de forma programada o a mano.&lt;/p&gt;
&lt;p&gt;Usa &lt;code&gt;pull_request&lt;/code&gt; para detectar una regresión antes del merge, &lt;code&gt;workflow_dispatch&lt;/code&gt; para ejecuciones manuales y &lt;code&gt;schedule&lt;/code&gt; para ejecuciones cron (en UTC, salvo que indiques una zona horaria). La &lt;a href=&quot;https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows&quot;&gt;referencia de eventos&lt;/a&gt; de GitHub añade algunos límites (comprobado el 9 de octubre de 2026): las programaciones solo se ejecutan en la rama por defecto, como mucho cada cinco minutos, y pueden retrasarse al comienzo de cada hora. Los pull requests desde forks no reciben secretos, salvo &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;¿Cómo se ejecuta k6 en GitHub Actions?&lt;/h2&gt;
&lt;p&gt;Usa las dos acciones oficiales de Grafana, una para instalar k6 y otra para ejecutar el script. El paso falla en cuanto k6 termina con un código de salida distinto de cero, que es lo que provoca un umbral incumplido.&lt;/p&gt;
&lt;p&gt;Tanto &lt;a href=&quot;https://github.com/grafana/setup-k6-action&quot;&gt;setup-k6-action&lt;/a&gt; como &lt;a href=&quot;https://github.com/grafana/run-k6-action&quot;&gt;run-k6-action&lt;/a&gt; están en &lt;code&gt;v1&lt;/code&gt; (comprobado el 9 de octubre de 2026):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;name: load-test
on:
  pull_request:
  workflow_dispatch:

jobs:
  k6:
    runs-on: ubuntu-latest
    timeout-minutes: 15
    env:
      BASE_URL: ${{ vars.STAGING_URL }}
    steps:
      - uses: actions/checkout@v7
      - uses: grafana/setup-k6-action@v1
      - uses: grafana/run-k6-action@v1
        with:
          path: tests/load/smoke.js
          flags: --out json=results.json
      - uses: actions/upload-artifact@v7
        if: always()
        with:
          name: k6-results
          path: results.json
          retention-days: 14
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Los umbrales viven en el script, que lee &lt;code&gt;BASE_URL&lt;/code&gt; del entorno:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;

export const options = {
  vus: 10,
  duration: &amp;quot;1m&amp;quot;,
  thresholds: {
    http_req_failed: [&amp;quot;rate&amp;lt;0.01&amp;quot;],
    http_req_duration: [&amp;quot;p(95)&amp;lt;500&amp;quot;],
  },
};

export default function () {
  http.get(`${__ENV.BASE_URL}/health`);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La documentación de k6 aclara que &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;los checks no afectan al código de salida&lt;/a&gt;, así que la decisión de aprobar o suspender tiene que venir de los umbrales.&lt;/p&gt;
&lt;h2&gt;¿Cómo se ejecutan Artillery, Locust o JMeter en su lugar?&lt;/h2&gt;
&lt;p&gt;Cambia los pasos de instalación y ejecución, conserva el resto del workflow y usa el mecanismo propio de cada herramienta para fallar cuando no se alcanza un objetivo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artillery&lt;/strong&gt; tiene una &lt;a href=&quot;https://www.artillery.io/docs/cicd/github-actions&quot;&gt;GitHub Action oficial&lt;/a&gt; cuyo &lt;a href=&quot;https://github.com/artilleryio/action-cli&quot;&gt;README&lt;/a&gt; indica que &lt;code&gt;@v2&lt;/code&gt; sigue la última versión 2.x (comprobado el 9 de octubre de 2026). El paso es &lt;code&gt;uses: artilleryio/action-cli@v2&lt;/code&gt; con &lt;code&gt;command: run --target ${{ vars.STAGING_URL }} tests/load/api.yml --output report.json&lt;/code&gt;, y el &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/ensure&quot;&gt;plugin ensure&lt;/a&gt; hace que Artillery termine con un código distinto de cero cuando no se alcanza un objetivo. La sección &lt;code&gt;config&lt;/code&gt; del script:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;config:
  target: &amp;quot;https://staging.example.com&amp;quot;
  phases:
    - duration: 60
      arrivalRate: 5
  plugins:
    ensure:
      thresholds:
        - &amp;quot;http.response_time.p95&amp;quot;: 500
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Locust&lt;/strong&gt; &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;termina con código 1 si alguna petición falló&lt;/a&gt;, y para reglas de latencia fijas &lt;code&gt;environment.process_exit_code&lt;/code&gt; en un listener del evento &lt;code&gt;quitting&lt;/code&gt;, como muestra esa misma página (comprobado el 9 de octubre de 2026). Después de &lt;code&gt;actions/setup-python@v7&lt;/code&gt; con &lt;code&gt;python-version: &amp;quot;3.13&amp;quot;&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;      - run: pip install locust
      - run: &amp;gt;
          locust -f tests/load/locustfile.py --headless
          -u 20 -r 5 -t 2m -H &amp;quot;$BASE_URL&amp;quot;
          --csv results --html report.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;JMeter&lt;/strong&gt; se ejecuta sin interfaz gráfica con &lt;code&gt;-n&lt;/code&gt;, y las &lt;a href=&quot;https://jmeter.apache.org/usermanual/get-started.html&quot;&gt;opciones de línea de comandos de su manual&lt;/a&gt; no incluyen ningún umbral de aprobado o suspenso (comprobado el 9 de octubre de 2026). Un paso corto puede leer el archivo de resultados, en CSV con una columna &lt;code&gt;success&lt;/code&gt; por defecto, y hacer fallar el job por su cuenta:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;      - uses: actions/setup-java@v6
        with:
          distribution: temurin
          java-version: &amp;quot;21&amp;quot;
      - name: Install JMeter 5.6.3
        env:
          JM_BASE: https://archive.apache.org/dist/jmeter/binaries
        run: curl -sSL &amp;quot;$JM_BASE/apache-jmeter-5.6.3.tgz&amp;quot; | tar -xzf -
      - name: Run the test plan
        run: &amp;gt;
          apache-jmeter-5.6.3/bin/jmeter -n -t tests/load/plan.jmx
          -l results.jtl -e -o report
      - name: Fail above 1% errors
        run: |
          python3 - &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
          import csv, sys
          rows = list(csv.DictReader(open(&amp;quot;results.jtl&amp;quot;)))
          bad = sum(r[&amp;quot;success&amp;quot;] != &amp;quot;true&amp;quot; for r in rows)
          print(f&amp;quot;{bad} of {len(rows)} samples failed&amp;quot;)
          sys.exit(1 if not rows or bad &amp;gt; 0.01 * len(rows) else 0)
          EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;¿Cómo se hace fallar el job cuando la prueba no alcanza un objetivo?&lt;/h2&gt;
&lt;p&gt;Escribe los objetivos en la prueba como umbrales y deja que el código de salida haga el resto. GitHub marca un paso como fallido cuando su comando termina con un código distinto de cero, y el job falla con él.&lt;/p&gt;
&lt;p&gt;Empieza con una tasa de errores estricta y un percentil de latencia generoso, y ajusta el límite de latencia cuando sepas cuánto varían tus cifras entre ejecuciones. La &lt;a href=&quot;https://loadtest.app/es/how-to-run-a-load-test/&quot;&gt;guía paso a paso de pruebas de carga&lt;/a&gt; explica cómo elegir esos objetivos.&lt;/p&gt;
&lt;h2&gt;¿Dónde deben quedar los resultados de cada ejecución?&lt;/h2&gt;
&lt;p&gt;Súbelos como artefacto del workflow, con &lt;code&gt;if: always()&lt;/code&gt; para que una prueba fallida conserve igualmente su informe. Los artefactos se guardan 90 días por defecto, y &lt;code&gt;retention-days&lt;/code&gt; acorta ese plazo.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://github.com/actions/upload-artifact&quot;&gt;README de upload-artifact&lt;/a&gt; documenta los 90 días por defecto (comprobado el 9 de octubre de 2026). Fija &lt;code&gt;if-no-files-found: error&lt;/code&gt; para que un informe ausente haga fallar el paso de forma visible.&lt;/p&gt;
&lt;h2&gt;¿Cuánta carga puede generar un runner alojado por GitHub?&lt;/h2&gt;
&lt;p&gt;Suficiente para una prueba de humo o un pequeño control de regresiones. Un runner Linux estándar tiene 4 CPU y 16 GB de RAM en repositorios públicos, 2 CPU y 8 GB en privados, y un job se detiene a las 6 horas.&lt;/p&gt;
&lt;p&gt;Esas cifras salen de la &lt;a href=&quot;https://docs.github.com/en/actions/reference/runners/github-hosted-runners&quot;&gt;referencia de runners&lt;/a&gt; y de los &lt;a href=&quot;https://docs.github.com/en/actions/reference/limits&quot;&gt;límites de Actions&lt;/a&gt; de GitHub (comprobado el 9 de octubre de 2026), que no dan ninguna cifra de ancho de banda de red.&lt;/p&gt;
&lt;p&gt;Un job corre en una sola máquina, así que es un único generador de carga: si su CPU se satura, los tiempos de respuesta incluyen el tiempo de espera en el propio runner. Además, todas las peticiones salen de esa máquina, de modo que los limitadores de tasa que cuentan por dirección de cliente ven un único cliente muy activo. GitHub desaconseja usar en listas de permitidos los rangos de IP de Azure de sus runners Ubuntu; los runners más grandes (larger runners) de los planes Team y Enterprise Cloud añaden CPU, memoria y direcciones IP estáticas.&lt;/p&gt;
&lt;h2&gt;¿Cuándo debe venir la carga de otro sitio?&lt;/h2&gt;
&lt;p&gt;Cuando necesitas más carga de la que produce una máquina, tráfico desde varias regiones o ejecuciones más largas que el límite de un job.&lt;/p&gt;
&lt;p&gt;Con k6, &lt;a href=&quot;https://github.com/grafana/run-k6-action&quot;&gt;&lt;code&gt;run-k6-action&lt;/code&gt;&lt;/a&gt; ejecuta la prueba en Grafana Cloud k6 si fijas &lt;code&gt;cloud-run-locally: false&lt;/code&gt; y pasas &lt;code&gt;K6_CLOUD_TOKEN&lt;/code&gt;, &lt;code&gt;K6_CLOUD_PROJECT_ID&lt;/code&gt; y, con k6 v2, &lt;code&gt;K6_CLOUD_STACK_ID&lt;/code&gt;. Una &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/environment-variables/&quot;&gt;ejecución en la nube&lt;/a&gt; ignora por defecto el entorno del runner, así que añade &lt;code&gt;-e BASE_URL=${{ vars.STAGING_URL }}&lt;/code&gt; a &lt;code&gt;flags&lt;/code&gt; (comprobado el 10 de octubre de 2026). &lt;a href=&quot;https://www.artillery.io/docs/cicd/github-actions&quot;&gt;La acción de Artillery&lt;/a&gt; puede llamar a &lt;code&gt;run-fargate&lt;/code&gt; o &lt;code&gt;run-lambda&lt;/code&gt; para generar la carga desde tu propia cuenta de AWS (ambos comprobados el 9 de octubre de 2026). La &lt;a href=&quot;https://loadtest.app/es/k6-vs-artillery/&quot;&gt;comparativa k6 vs Artillery&lt;/a&gt; cubre ambas.&lt;/p&gt;
&lt;p&gt;Para JMeter, LoadFocus documenta una &lt;a href=&quot;https://loadfocus.com/docs/es-es/guides/jmeter-load-testing/jmeter-integration-ci-cd/github-actions?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=load-testing-in-github-actions&quot;&gt;integración con GitHub Actions&lt;/a&gt; basada en su cliente npm. Guardas la prueba en tu cuenta de LoadFocus, añades la clave de API y el ID de equipo como secretos y llamas a &lt;code&gt;run-test&lt;/code&gt;. Las opciones de abajo siguen la ayuda del cliente:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;      - run: npm install -g @loadfocus/loadfocus-api-client
      - env:
          LF_KEY: ${{ secrets.LOADFOCUS_API_KEY }}
          LF_TEAM: ${{ secrets.LOADFOCUS_TEAM_ID }}
        run: |
          test -n &amp;quot;$LF_KEY&amp;quot;
          test -n &amp;quot;$LF_TEAM&amp;quot;
          loadfocus-api config set \
            --apikey &amp;quot;$LF_KEY&amp;quot; --teamid &amp;quot;$LF_TEAM&amp;quot;
          loadfocus-api jmeter run-test --name checkout-api \
            --thresholds &amp;quot;avgresponse&amp;lt;=200,errors==0,p95&amp;lt;=250&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El cliente espera hasta 1.800 segundos por defecto (&lt;code&gt;--wait-timeout&lt;/code&gt; lo cambia), así que da al job un &lt;code&gt;timeout-minutes&lt;/code&gt; de más de 30, por ejemplo 40. Termina con código 1 cuando no se cumple un umbral y con 0 cuando falta la clave de API o el ID de equipo, por eso las líneas &lt;code&gt;test -n&lt;/code&gt; hacen fallar el paso antes si un secreto está vacío. La carga sale de LoadFocus, que &lt;a href=&quot;https://loadfocus.com/es-es/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=load-testing-in-github-actions&quot;&gt;ejecuta scripts de JMeter desde 25 regiones en la nube&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Cuánto debe durar una prueba de carga en un pull request?&lt;/strong&gt;
Unos pocos minutos: lo bastante para superar la rampa de subida y obtener un percentil estable, y lo bastante poco para que nadie tenga que esperarla.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Está permitido hacer pruebas de carga desde runners alojados por GitHub?&lt;/strong&gt;
Las &lt;a href=&quot;https://docs.github.com/en/site-policy/github-terms/github-terms-for-additional-products-and-features&quot;&gt;condiciones de GitHub para Actions&lt;/a&gt; prohíben perturbar cualquier servicio y limitan los runners alojados al trabajo sobre el propio proyecto del repositorio (comprobado el 9 de octubre de 2026). Probar el entorno de staging de ese mismo proyecto, sin sobrecargar los servidores de GitHub, es el tipo de prueba que describen esas condiciones.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puedo usar un runner autoalojado en su lugar?&lt;/strong&gt;
Sí. Funciona en tu propio hardware y en tu red, y la página de límites de GitHub permite que un job dure ahí hasta 5 días. Sigue siendo un único generador de carga.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/load-test-pass-fail-criteria/&quot;&gt;Criterios de aprobación en pruebas de carga: cómo fijarlos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/how-to-run-a-load-test/&quot;&gt;Cómo hacer una prueba de carga: guía paso a paso&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/k6-vs-artillery/&quot;&gt;k6 vs Artillery: qué herramienta de pruebas de carga elegir&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Pruebas de carga con Locust: análisis de la herramienta</title><link>https://loadtest.app/es/locust-load-testing/</link><guid isPermaLink="true">https://loadtest.app/es/locust-load-testing/</guid><description>Pruebas de carga con Locust: locustfiles en Python, interfaz web, modo headless y distribuido, CI, límites, otras herramientas Python y cuándo usar k6.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, que vende un servicio de pruebas de carga que aparece en este artículo.&lt;/p&gt;&lt;p&gt;Locust es una herramienta de pruebas de carga en Python, gratuita y con licencia MIT, en la que cada prueba es un programa de Python, ejecutado por usuarios ligeros desde una interfaz web o la línea de comandos. Las pruebas de carga con Locust encajan con equipos que escriben Python y prueban sobre todo servicios HTTP. A quien necesite muchos protocolos de serie o un editor gráfico de pruebas le irá mejor JMeter, y a quien escriba JavaScript, k6.&lt;/p&gt;
&lt;p&gt;No hemos ejecutado Locust para este análisis. Los datos salen de la documentación, el repositorio y la página de PyPI de Locust, comprobados el 9 de octubre de 2026, y las valoraciones son nuestras.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tema&lt;/th&gt;
&lt;th&gt;Locust&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licencia&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entorno&lt;/td&gt;
&lt;td&gt;Python 3.11 o posterior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versión actual&lt;/td&gt;
&lt;td&gt;2.46.7 (4 de octubre de 2026)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Formato de las pruebas&lt;/td&gt;
&lt;td&gt;Clases de Python en un locustfile&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ejecución&lt;/td&gt;
&lt;td&gt;Interfaz web en el puerto 8089, o headless&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocolos integrados&lt;/td&gt;
&lt;td&gt;HTTP y HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Escalado&lt;/td&gt;
&lt;td&gt;Un master y tantos workers como quieras&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resultados&lt;/td&gt;
&lt;td&gt;Gráficos en vivo, CSV, HTML, JSON, OpenTelemetry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI&lt;/td&gt;
&lt;td&gt;Código de salida 1 si falla alguna petición&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Quién desarrolla Locust y sigue manteniéndose?&lt;/h2&gt;
&lt;p&gt;Lars Holmberg mantiene Locust y Microsoft patrocina ese trabajo. Las versiones salen a menudo: 17 en lo que va de 2026.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;README de Locust&lt;/a&gt; nombra a ambos. &lt;a href=&quot;https://pypi.org/project/locust/&quot;&gt;PyPI&lt;/a&gt; muestra la 2.46.7, publicada el 4 de octubre de 2026, como última versión, y exige Python 3.11 o posterior (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cómo funciona un locustfile?&lt;/h2&gt;
&lt;p&gt;Un locustfile es un módulo de Python normal con al menos una clase de usuario. Cada usuario simulado ejecuta sus tareas una tras otra y hace una pausa entre ellas según su &lt;code&gt;wait_time&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Según la &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;guía del locustfile&lt;/a&gt;, &lt;code&gt;HttpUser&lt;/code&gt; da a cada usuario un &lt;code&gt;client&lt;/code&gt; que envuelve python-requests, conserva las cookies y registra cada petición. Los métodos marcados con &lt;code&gt;@task&lt;/code&gt; se eligen al azar, ponderados por el número del decorador, y &lt;code&gt;on_start&lt;/code&gt; se ejecuta una vez por usuario. Este usuario inicia sesión, navega por el catálogo cuatro veces más de lo que compra y lanza como mucho una tarea cada 10 segundos:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from locust import HttpUser, task, constant_pacing


class Shopper(HttpUser):
    wait_time = constant_pacing(10)

    def on_start(self):
        self.client.post(&amp;quot;/login&amp;quot;, json={&amp;quot;user&amp;quot;: &amp;quot;demo&amp;quot;})

    @task(4)
    def browse(self):
        self.client.get(&amp;quot;/products?page=2&amp;quot;, name=&amp;quot;/products&amp;quot;)

    @task
    def checkout(self):
        with self.client.post(
            &amp;quot;/checkout&amp;quot;, catch_response=True
        ) as resp:
            if &amp;quot;order_id&amp;quot; not in resp.text:
                resp.failure(&amp;quot;no order id&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;catch_response&lt;/code&gt; te permite dar por fallida una petición según su contenido, y &lt;code&gt;name&lt;/code&gt; agrupa las URL variables en una sola fila de estadísticas. Las demás funciones de espera son &lt;code&gt;constant&lt;/code&gt;, &lt;code&gt;between&lt;/code&gt;, &lt;code&gt;constant_throughput&lt;/code&gt; y, desde la &lt;a href=&quot;https://github.com/locustio/locust/releases/tag/2.46.6&quot;&gt;versión 2.46.6&lt;/a&gt;, &lt;code&gt;poisson&lt;/code&gt;; nuestra guía sobre el &lt;a href=&quot;https://loadtest.app/es/think-time-in-load-testing/&quot;&gt;tiempo de reflexión en pruebas de carga&lt;/a&gt; explica cómo esas pausas dan forma a la carga. La documentación añade que el tiempo de espera solo puede limitar el rendimiento y no lanza usuarios nuevos para alcanzar un ritmo objetivo. Una prueba de Locust es, por tanto, un grupo fijo de usuarios: un &lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;modelo de carga cerrado&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;¿Conviene usar la interfaz web o el modo headless?&lt;/h2&gt;
&lt;p&gt;La interfaz web mientras exploras y el modo headless para ejecuciones repetibles.&lt;/p&gt;
&lt;p&gt;El comando &lt;code&gt;locust&lt;/code&gt; arranca una &lt;a href=&quot;https://docs.locust.io/en/stable/quickstart.html&quot;&gt;interfaz web&lt;/a&gt; en el puerto 8089. Allí indicas el host, los usuarios y la rampa de subida, sigues gráficos en vivo y cambias la carga a mitad de prueba. El &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;modo headless&lt;/a&gt; recibe los mismos ajustes como opciones:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;locust -f locustfile.py --headless -u 200 -r 10 -t 10m \
  --host https://staging.example.com \
  --csv results --html report.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;-u&lt;/code&gt; fija los usuarios, &lt;code&gt;-r&lt;/code&gt; cuántos arrancan por segundo y &lt;code&gt;-t&lt;/code&gt; la duración, con la rampa de subida incluida. Los mismos ajustes funcionan también en &lt;code&gt;locust.conf&lt;/code&gt; o &lt;code&gt;pyproject.toml&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;¿Cómo funciona el modo distribuido?&lt;/h2&gt;
&lt;p&gt;Un proceso master gestiona la interfaz web y coordina, mientras los procesos worker ejecutan los usuarios y le envían sus estadísticas. Necesitas un worker por núcleo de CPU, porque un proceso de Python no puede aprovechar del todo más de un núcleo.&lt;/p&gt;
&lt;p&gt;Según la &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;documentación de carga distribuida&lt;/a&gt;, un solo proceso supera las mil peticiones por segundo con un plan de prueba sencillo, así que las pruebas más grandes se reparten:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# en la máquina master
locust -f locustfile.py --master
# en cada máquina worker, un worker por núcleo
locust -f - --worker --master-host 10.0.0.5 --processes -1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;-f -&lt;/code&gt; descarga el locustfile desde el master. &lt;code&gt;--processes&lt;/code&gt; depende de &lt;code&gt;fork()&lt;/code&gt;, así que no funciona en Windows, y cada cambio en el locustfile obliga a reiniciar todos los procesos. La documentación cubre además un &lt;a href=&quot;https://docs.locust.io/en/stable/kubernetes-operator.html&quot;&gt;operador de Kubernetes&lt;/a&gt; y &lt;a href=&quot;https://docs.locust.io/en/stable/hosted-load-testing.html&quot;&gt;Azure Load Testing&lt;/a&gt; (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;LoadFocus, el editor de este sitio, no ejecuta pruebas de Locust. &lt;a href=&quot;https://loadfocus.com/es-es/load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=locust-load-testing&quot;&gt;Ejecuta planes de prueba de JMeter y scripts de k6&lt;/a&gt; desde 25 regiones en la nube, así que para Locust las vías de arriba siguen siendo las formas de escalar.&lt;/p&gt;
&lt;h2&gt;¿Puede Locust probar protocolos distintos de HTTP?&lt;/h2&gt;
&lt;p&gt;Sí, si aportas un cliente de Python para el protocolo. Solo HTTP y HTTPS vienen integrados.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;página sobre otros protocolos&lt;/a&gt; muestra cómo envolver un cliente para que cada llamada quede registrada, con ejemplos para XML-RPC y gRPC y clases de usuario experimentales para MQTT, Socket.IO y OpenAI. El proyecto aparte &lt;a href=&quot;https://github.com/SvenskaSpel/locust-plugins&quot;&gt;locust-plugins&lt;/a&gt; añade usuarios para Kafka, FTP, Selenium y Playwright (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;Para HTTP existe también &lt;a href=&quot;https://docs.locust.io/en/stable/increase-performance.html&quot;&gt;&lt;code&gt;FastHttpUser&lt;/code&gt;&lt;/a&gt;, que usa geventhttpclient y consume mucha menos CPU. En el mejor caso, según la documentación, un proceso llega a unas 16.000 peticiones por segundo, frente a 4.000 con &lt;code&gt;HttpUser&lt;/code&gt;. &lt;code&gt;FastHttpUser&lt;/code&gt; no hace más rápida cada petición, y por defecto no verifica los certificados TLS.&lt;/p&gt;
&lt;h2&gt;¿Qué informes da Locust y cómo encaja en la CI?&lt;/h2&gt;
&lt;p&gt;Obtienes gráficos en vivo en la interfaz web y, si los pides, archivos de resultados. En la CI, Locust termina con código 1 si alguna petición falló.&lt;/p&gt;
&lt;p&gt;Según la &lt;a href=&quot;https://docs.locust.io/en/stable/configuration.html&quot;&gt;referencia de configuración&lt;/a&gt;, &lt;code&gt;--csv&lt;/code&gt; escribe archivos de estadísticas, historial y fallos, &lt;code&gt;--html&lt;/code&gt; guarda un informe y &lt;code&gt;--json&lt;/code&gt; imprime las estadísticas finales. &lt;code&gt;--otel&lt;/code&gt; exporta a un backend de &lt;a href=&quot;https://docs.locust.io/en/stable/telemetry.html&quot;&gt;OpenTelemetry&lt;/a&gt;. La documentación del modo headless muestra un listener que hace fallar la ejecución según la tasa de fallos, el tiempo de respuesta medio o el percentil 95, y nuestra guía de &lt;a href=&quot;https://loadtest.app/es/load-testing-in-github-actions/&quot;&gt;pruebas de carga en GitHub Actions&lt;/a&gt; lo integra en un workflow.&lt;/p&gt;
&lt;h2&gt;¿Qué hace bien Locust y dónde están sus límites?&lt;/h2&gt;
&lt;p&gt;Destaca en la lógica de las pruebas y con muchos usuarios simultáneos que pasan casi todo el tiempo esperando. Es más flojo en peticiones por proceso y en los protocolos que tienes que conectar por tu cuenta.&lt;/p&gt;
&lt;p&gt;Como las pruebas son Python puro, los bucles, las condiciones, los datos generados y tu propio cliente de API funcionan sin más, y las pruebas viven en el control de versiones. La página &lt;a href=&quot;https://docs.locust.io/en/stable/what-is-locust.html&quot;&gt;What is Locust&lt;/a&gt; explica que el bajo coste de cada usuario encaja con cargas muy concurrentes, aunque admite que otras herramientas pueden enviar más peticiones por segundo con el mismo hardware.&lt;/p&gt;
&lt;p&gt;Los límites que reconoce la propia documentación:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un proceso de Python usa un solo núcleo de CPU.&lt;/li&gt;
&lt;li&gt;Las bibliotecas que hacen E/S en C bloquean el proceso, salvo que gevent pueda parchearlas.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HttpUser&lt;/code&gt; no analiza HTML ni carga los recursos de la página.&lt;/li&gt;
&lt;li&gt;El tiempo de espera no puede añadir usuarios para sostener un ritmo de peticiones.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;¿Qué otras herramientas de Python hay para pruebas de carga?&lt;/h2&gt;
&lt;p&gt;Locust es el motor de Python con desarrollo activo. Molotov, la principal alternativa, no publica ninguna versión en PyPI desde 2022, y Taurus ejecuta Locust con uno de sus ejecutores.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/tarekziade/molotov&quot;&gt;Molotov&lt;/a&gt; es una herramienta para Python 3.8+ construida sobre asyncio y aiohttp; su &lt;a href=&quot;https://pypi.org/project/molotov/&quot;&gt;última versión en PyPI&lt;/a&gt; es la 2.6, del 21 de octubre de 2022, y el último commit de su rama principal es de noviembre de 2023 (comprobado el 21 de octubre de 2026). &lt;a href=&quot;https://gettaurus.org/docs/Locust/&quot;&gt;Taurus&lt;/a&gt; ejecuta un locustfile, o peticiones GET y POST sencillas escritas en YAML, con su ejecutor &lt;code&gt;locust&lt;/code&gt;. Locust lo instalas tú, en modo distribuido Taurus solo arranca el master y su ajuste &lt;code&gt;throughput&lt;/code&gt; no tiene efecto con este ejecutor (comprobado el 21 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Cuándo elegir k6, JMeter o Gatling en lugar de Locust?&lt;/h2&gt;
&lt;p&gt;Elige otra herramienta cuando su lenguaje, sus protocolos o su modelo de carga encajen mejor con tu equipo.&lt;/p&gt;
&lt;p&gt;Nuestro repaso de &lt;a href=&quot;https://loadtest.app/es/open-source-load-testing-tools/&quot;&gt;herramientas de pruebas de carga open source&lt;/a&gt; pone Locust junto a otras cinco.&lt;/p&gt;
&lt;p&gt;Elige &lt;strong&gt;k6&lt;/strong&gt; en lugar de Locust si tu equipo escribe JavaScript, quiere criterios de aprobado o suspenso como &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt; en el script, o necesita un modelo de carga abierto, que es lo que ofrecen los &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/open-vs-closed/&quot;&gt;ejecutores arrival-rate&lt;/a&gt; de k6 (comprobado el 9 de octubre de 2026). LoadFocus &lt;a href=&quot;https://loadfocus.com/es-es/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=locust-load-testing&quot;&gt;ejecuta scripts de k6&lt;/a&gt; desde 25 regiones en la nube, pero lanza los escenarios arrival-rate con un número fijo de usuarios; para sostener un ritmo de peticiones, ejecútalos con k6 directamente.&lt;/p&gt;
&lt;p&gt;Elige &lt;strong&gt;JMeter&lt;/strong&gt; en lugar de Locust si necesitas JDBC, JMS, LDAP o FTP de serie, como enumera su &lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;README&lt;/a&gt;, o si tus testers montan las pruebas en una interfaz gráfica. &lt;a href=&quot;https://loadtest.app/es/locust-vs-jmeter/&quot;&gt;Locust vs JMeter&lt;/a&gt; compara ambas a fondo.&lt;/p&gt;
&lt;p&gt;Elige &lt;strong&gt;Gatling&lt;/strong&gt; en lugar de Locust si tu equipo trabaja sobre la JVM y quiere &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;perfiles de inyección&lt;/a&gt; abiertos y cerrados en una misma API (comprobado el 9 de octubre de 2026). &lt;a href=&quot;https://loadtest.app/es/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter&lt;/a&gt; lo trata con más detalle.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Locust es gratis para uso comercial?&lt;/strong&gt;
Sí. Locust se publica con licencia MIT, que permite el uso comercial, la modificación y la redistribución.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué versión de Python necesita Locust?&lt;/strong&gt;
Python 3.11 o posterior, según sus metadatos en PyPI. Instálalo con &lt;code&gt;pip install locust&lt;/code&gt;, o ejecútalo en un entorno temporal con &lt;code&gt;uvx locust&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿LoadFocus puede ejecutar pruebas de Locust?&lt;/strong&gt;
No. LoadFocus ejecuta planes de prueba de JMeter y scripts de k6. Para escalar una prueba de Locust, usa su modo master y workers, el operador de Kubernetes o Azure Load Testing.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/locust-vs-jmeter/&quot;&gt;Locust vs JMeter: ¿scripts de Python o planes de JMeter?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-source-load-testing-tools/&quot;&gt;Herramientas de pruebas de carga open source: seis opciones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/k6-vs-locust/&quot;&gt;k6 vs Locust: ¿scripts JavaScript o usuarios Python?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-vs-locust/&quot;&gt;Gatling vs Locust: ¿simulaciones JVM o locustfiles Python?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Locust vs JMeter: ¿scripts de Python o planes de JMeter?</title><link>https://loadtest.app/es/locust-vs-jmeter/</link><guid isPermaLink="true">https://loadtest.app/es/locust-vs-jmeter/</guid><description>Locust y JMeter comparados en licencia, scripts, protocolos, ejecución distribuida, CI e informes, con consejos claros sobre cuándo elegir cada uno.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, que vende un servicio de pruebas de carga que aparece en este artículo.&lt;/p&gt;&lt;p&gt;Locust y Apache JMeter son dos herramientas de pruebas de carga gratuitas y open source, y cuál encaja mejor depende sobre todo de cómo quiere construir las pruebas tu equipo. Elige Locust si tu equipo escribe Python y quiere la lógica de prueba como código normal, ejecutada por usuarios ligeros basados en eventos. Elige JMeter si necesitas protocolos más allá de HTTP como JDBC, JMS o LDAP, prefieres montar las pruebas en una interfaz gráfica o ya tienes una colección de planes de prueba &lt;code&gt;.jmx&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Los datos de esta comparación de Locust vs JMeter salen de la documentación y del repositorio de cada proyecto, comprobados el 9 de octubre de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Locust&lt;/th&gt;
&lt;th&gt;Apache JMeter&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licencia&lt;/td&gt;
&lt;td&gt;MIT (&lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;repositorio&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;Apache 2.0 (&lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;repositorio&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entorno de ejecución&lt;/td&gt;
&lt;td&gt;Python 3.11 o posterior&lt;/td&gt;
&lt;td&gt;Java 8 o posterior (versión 5.6.3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pruebas escritas como&lt;/td&gt;
&lt;td&gt;Código Python en un locustfile&lt;/td&gt;
&lt;td&gt;Planes de prueba creados en una interfaz gráfica y guardados como XML (&lt;code&gt;.jmx&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interfaz gráfica&lt;/td&gt;
&lt;td&gt;Interfaz web para lanzar, ajustar y seguir una prueba en marcha&lt;/td&gt;
&lt;td&gt;IDE de escritorio para grabar, construir y depurar planes de prueba&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocolos integrados&lt;/td&gt;
&lt;td&gt;HTTP y HTTPS; el resto mediante un cliente Python&lt;/td&gt;
&lt;td&gt;HTTP(S), SOAP/REST, FTP, JDBC, LDAP, JMS, correo, TCP, comandos de shell, objetos Java&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usuarios virtuales&lt;/td&gt;
&lt;td&gt;Un greenlet por usuario sobre gevent (basado en eventos)&lt;/td&gt;
&lt;td&gt;Un hilo de Java por usuario&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modo distribuido&lt;/td&gt;
&lt;td&gt;Un master y los workers que quieras&lt;/td&gt;
&lt;td&gt;Un cliente que controla servidores JMeter remotos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI y ejecución sin interfaz&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--headless&lt;/code&gt;, código de salida 1 si fallan peticiones&lt;/td&gt;
&lt;td&gt;Modo CLI (&lt;code&gt;jmeter -n&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Informes&lt;/td&gt;
&lt;td&gt;Gráficos en vivo en la interfaz web, archivos CSV, informe HTML&lt;/td&gt;
&lt;td&gt;Panel HTML, resultados en vivo con un Backend Listener&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Cuál es la diferencia entre Locust y JMeter?&lt;/h2&gt;
&lt;p&gt;En Locust una prueba es un programa en Python. En JMeter una prueba es un plan que montas en una interfaz gráfica de escritorio y guardas en un archivo, y de ahí salen casi todas las demás diferencias.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;README&lt;/a&gt; de Locust describe pruebas escritas con bucles, condiciones y bibliotecas de Python normales. Se instala con &lt;code&gt;pip install locust&lt;/code&gt; y necesita Python 3.11 o posterior, según sus &lt;a href=&quot;https://github.com/locustio/locust/blob/master/pyproject.toml&quot;&gt;metadatos de paquete&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Una prueba de JMeter es un árbol de elementos: un Thread Group para los usuarios, samplers para las peticiones y assertions y listeners para los resultados. JMeter 5.6.3, la versión actual en la &lt;a href=&quot;https://jmeter.apache.org/download_jmeter.cgi&quot;&gt;página de descargas&lt;/a&gt;, requiere Java 8 o posterior. El README de la &lt;a href=&quot;https://github.com/apache/jmeter/blob/master/README.md&quot;&gt;rama de desarrollo&lt;/a&gt; de JMeter ya exige Java 17 (comprobado el 10 de octubre de 2026). Cuando un paso necesita lógica de verdad, un sampler JSR223 ejecuta un script de Groovy dentro del plan.&lt;/p&gt;
&lt;h2&gt;¿Cómo se escribe una prueba en cada herramienta?&lt;/h2&gt;
&lt;p&gt;En Locust escribes una clase de Python por cada tipo de usuario, con métodos marcados como tareas. En JMeter añades un Thread Group y samplers en la interfaz gráfica, guardas el plan y lo ejecutas desde la línea de comandos.&lt;/p&gt;
&lt;p&gt;Un usuario de Locust que espera entre uno y tres segundos entre tareas y consulta la lista de usuarios tres veces más a menudo que la ficha de un usuario concreto:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;from locust import HttpUser, task, between


class ApiUser(HttpUser):
    wait_time = between(1, 3)

    @task(3)
    def list_users(self):
        self.client.get(&amp;quot;/api/users&amp;quot;)

    @task
    def view_user(self):
        self.client.get(&amp;quot;/api/users/42&amp;quot;, name=&amp;quot;/api/users/[id]&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Para lanzarlo sin interfaz con 50 usuarios, cinco nuevos por segundo, durante cinco minutos:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;locust -f locustfile.py --headless -u 50 -r 5 \
  --run-time 5m --host https://staging.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En JMeter la misma prueba es un Thread Group con 50 hilos y un periodo de rampa de subida, que contiene dos samplers HTTP Request. La &lt;a href=&quot;https://jmeter.apache.org/usermanual/get-started.html&quot;&gt;guía de inicio&lt;/a&gt; ejecuta un plan guardado en modo CLI, y &lt;code&gt;-e -o&lt;/code&gt; añade el informe HTML al final:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;jmeter -n -t api-users.jmx -l results.jtl -e -o report/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;El archivo &lt;code&gt;.jmx&lt;/code&gt; es XML, como muestran los &lt;a href=&quot;https://raw.githubusercontent.com/apache/jmeter/master/bin/examples/CSVSample.jmx&quot;&gt;ejemplos que incluye JMeter&lt;/a&gt;, y cuesta más revisarlo en un pull request que un archivo Python. JMeter también puede grabar un plan desde el navegador; lo más parecido en Locust es &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;har2locust&lt;/a&gt;, un conversor de grabaciones HAR a locustfile que sigue en beta (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Qué protocolos puede probar cada herramienta?&lt;/h2&gt;
&lt;p&gt;JMeter cubre muchos más protocolos de serie. Locust trae HTTP y HTTPS y espera que aportes un cliente Python para todo lo demás.&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;README&lt;/a&gt; de JMeter enumera HTTP y HTTPS, SOAP y REST, FTP, bases de datos mediante JDBC, LDAP, mensajería JMS, correo por SMTP, POP3 e IMAP, TCP, comandos nativos y objetos Java. JDBC y JMS necesitan los JAR del controlador que proporciona tu proveedor de base de datos o de JMS.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;página sobre otros protocolos&lt;/a&gt; de la documentación de Locust muestra cómo envolver una biblioteca de protocolo, con ejemplos para gRPC, XML-RPC y MQTT, y remite a locust-plugins para Kafka, Selenium y Playwright (comprobado el 9 de octubre de 2026). La biblioteca tiene que funcionar con gevent, porque la E/S hecha en código C compilado bloquea todo el proceso; la documentación cita el controlador de PostgreSQL psycopg2, que necesita un paquete adicional. Para pruebas de carga contra bases de datos, el sampler JDBC de JMeter es el camino más corto.&lt;/p&gt;
&lt;h2&gt;¿Cómo funcionan los usuarios virtuales en Locust y JMeter?&lt;/h2&gt;
&lt;p&gt;JMeter ejecuta cada usuario virtual como un hilo de Java. Locust ejecuta cada usuario como un greenlet en el bucle de eventos de gevent, lo que mantiene bajo el coste de cada usuario.&lt;/p&gt;
&lt;p&gt;Cada hilo de un &lt;a href=&quot;https://jmeter.apache.org/usermanual/test_plan.html&quot;&gt;Thread Group&lt;/a&gt; de JMeter recorre el plan completo de forma independiente. JMeter arranca por defecto con un heap de 1 GB, que según su guía puede quedarse corto en planes grandes y con muchos hilos.&lt;/p&gt;
&lt;p&gt;Según su README, un solo proceso de Locust puede manejar muchos miles de usuarios concurrentes. La &lt;a href=&quot;https://docs.locust.io/en/stable/running-distributed.html&quot;&gt;documentación de carga distribuida&lt;/a&gt; añade que un proceso de Python no puede aprovechar del todo más de un núcleo de CPU, así que se lanza un worker por núcleo, algo que &lt;code&gt;--processes&lt;/code&gt; prepara por ti en una sola máquina.&lt;/p&gt;
&lt;h2&gt;¿Cómo se reparte una prueba entre varias máquinas?&lt;/h2&gt;
&lt;p&gt;Las dos tienen un modo distribuido integrado. En Locust un master dirige a los workers que ejecutan los usuarios, y en JMeter el cliente lanza el plan de prueba completo en cada servidor remoto.&lt;/p&gt;
&lt;p&gt;En Locust, un proceso iniciado con &lt;code&gt;--master&lt;/code&gt; ejecuta la interfaz web y les indica a los procesos &lt;code&gt;--worker&lt;/code&gt; cuándo arrancar y detener usuarios. La documentación de Locust también cubre un &lt;a href=&quot;https://docs.locust.io/en/stable/kubernetes-operator.html&quot;&gt;operador de Kubernetes&lt;/a&gt; y &lt;a href=&quot;https://docs.locust.io/en/stable/hosted-load-testing.html&quot;&gt;Azure Load Testing&lt;/a&gt;, un servicio de Microsoft que ejecuta pruebas de Locust en la nube (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;El &lt;a href=&quot;https://jmeter.apache.org/usermanual/remote-test.html&quot;&gt;modo de pruebas remotas&lt;/a&gt; de JMeter permite que un cliente controle tantos servidores como quieras mediante RMI. Cada servidor ejecuta el plan completo, así que 1.000 hilos en seis servidores son 6.000 hilos. Todos los nodos deberían usar la misma versión de JMeter y de Java, RMI necesita un keystore salvo que desactives SSL, y los archivos de datos hay que copiarlos a cada servidor.&lt;/p&gt;
&lt;p&gt;Hay una tercera vía para los planes de prueba de JMeter. LoadFocus, el editor de este sitio, &lt;a href=&quot;https://loadfocus.com/es-es/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=locust-vs-jmeter&quot;&gt;ejecuta tus planes de prueba de JMeter existentes&lt;/a&gt; sin cambios desde 25 regiones en la nube, sin servidores remotos que configurar. LoadFocus no ejecuta pruebas de Locust, así que para Locust siguen valiendo las opciones de arriba para escalar.&lt;/p&gt;
&lt;h2&gt;¿Cómo encajan en la CI y qué informes obtienes?&lt;/h2&gt;
&lt;p&gt;Las dos se ejecutan sin interfaz desde la línea de comandos. Locust además termina con el código de salida 1 cuando fallan peticiones, y JMeter genera el informe HTML más completo.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.locust.io/en/stable/running-without-web-ui.html&quot;&gt;documentación del modo headless&lt;/a&gt; de Locust muestra un listener de eventos corto que fija el código de salida según la tasa de fallos, el tiempo de respuesta medio o el percentil 95, además de un ejemplo para GitHub Actions. Las opciones &lt;code&gt;--csv&lt;/code&gt; y &lt;code&gt;--html&lt;/code&gt; guardan los resultados y un informe al terminar.&lt;/p&gt;
&lt;p&gt;La documentación de JMeter es tajante: las pruebas de carga se ejecutan en modo CLI y la interfaz gráfica queda para construir y depurar. Su README remite a bibliotecas de terceros para Maven, Gradle y Jenkins. El &lt;a href=&quot;https://jmeter.apache.org/usermanual/generating-dashboard.html&quot;&gt;panel de JMeter&lt;/a&gt; incluye una tabla APDEX, una tabla de estadísticas con tres percentiles configurables, resúmenes de errores y gráficos del tiempo de respuesta.&lt;/p&gt;
&lt;h2&gt;¿Cuál deberías elegir?&lt;/h2&gt;
&lt;p&gt;Elige Locust si tu equipo escribe Python y quiere revisar las pruebas de carga como el resto de su código. Elige JMeter en su lugar si necesitas protocolos más allá de HTTP, si tus testers prefieren una interfaz gráfica o si ya tienes planes &lt;code&gt;.jmx&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Locust encaja con escenarios que tienen bucles, ramificaciones y datos generados, con pruebas que reutilizan un cliente Python interno de tu API y con mucha concurrencia de usuarios que pasan la mayor parte del tiempo esperando.&lt;/p&gt;
&lt;p&gt;JMeter es la mejor opción para probar JDBC, JMS, LDAP, FTP o correo, donde Locust necesitaría un cliente que tendrías que mantener tú, y para testers que graban un recorrido en el navegador y lo afinan de forma visual. Una empresa que ya usa JMeter conserva además sus planes y su experiencia.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Locust es más rápido que JMeter?&lt;/strong&gt;
No lo hemos medido nosotros, así que no nombramos un ganador. La comparación justa es ejecutar el mismo escenario con las dos herramientas en tu propio hardware.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Locust puede ejecutar archivos .jmx de JMeter?&lt;/strong&gt;
No según su documentación, que describe las pruebas solo como locustfiles de Python. Pasar un plan de prueba de JMeter a Locust significa reescribirlo en Python.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿LoadFocus puede ejecutar pruebas de Locust?&lt;/strong&gt;
No. LoadFocus ejecuta scripts de JMeter y k6. Para escalar una prueba de Locust más allá de una máquina, usa el modo master y workers de Locust, su operador de Kubernetes o Azure Load Testing.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/locust-load-testing/&quot;&gt;Pruebas de carga con Locust: análisis de la herramienta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-vs-jmeter/&quot;&gt;Gatling vs JMeter: ¿pruebas como código o un plan en GUI?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/k6-vs-artillery/&quot;&gt;k6 vs Artillery: qué herramienta de pruebas de carga elegir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/k6-vs-locust/&quot;&gt;k6 vs Locust: ¿scripts JavaScript o usuarios Python?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-vs-locust/&quot;&gt;Gatling vs Locust: ¿simulaciones JVM o locustfiles Python?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/jmeter-vs-postman/&quot;&gt;JMeter vs Postman: ¿qué herramienta para pruebas de carga?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Modelo de carga abierto vs cerrado: cuál usar y cuándo</title><link>https://loadtest.app/es/open-vs-closed-workload-model/</link><guid isPermaLink="true">https://loadtest.app/es/open-vs-closed-workload-model/</guid><description>Modelo de carga abierto vs cerrado: tasa de llegada o usuarios fijos, por qué el cerrado oculta la saturación y qué hacen k6, Gatling, Locust y JMeter.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, un servicio de pruebas de carga mencionado en este artículo.&lt;/p&gt;&lt;p&gt;Elegir un modelo de carga abierto vs cerrado depende sobre todo de cómo llegan los usuarios a tu sistema. Usa un modelo abierto, que inicia nuevas iteraciones a una tasa de llegada fija, para sitios web y API públicos donde los usuarios siguen llegando por lento que respondas, y un modelo cerrado, un número fijo de usuarios virtuales que esperan a que termine su iteración anterior, solo donde el propio sistema limita la concurrencia. La elección pesa sobre todo en saturación, cuando una prueba cerrada frena su propia carga y hace que el sistema parezca más sano de lo que está.&lt;/p&gt;
&lt;p&gt;Los datos sobre las herramientas salen de la documentación de cada proyecto, comprobada el 9 de octubre de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Modelo abierto&lt;/th&gt;
&lt;th&gt;Modelo cerrado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Lo que fijas&lt;/td&gt;
&lt;td&gt;Nuevas iteraciones o usuarios por segundo&lt;/td&gt;
&lt;td&gt;Usuarios virtuales concurrentes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cuando las respuestas se ralentizan&lt;/td&gt;
&lt;td&gt;El trabajo sigue llegando y las colas crecen&lt;/td&gt;
&lt;td&gt;Los usuarios esperan y se envía menos carga&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sistemas reales así&lt;/td&gt;
&lt;td&gt;La mayoría de sitios web y API públicos&lt;/td&gt;
&lt;td&gt;Centros de llamadas, colas de venta de entradas, pools de workers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;constant-arrival-rate&lt;/code&gt;, &lt;code&gt;ramping-arrival-rate&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;constant-vus&lt;/code&gt;, &lt;code&gt;ramping-vus&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;&lt;code&gt;injectOpen&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;injectClosed&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;Aproximado con &lt;code&gt;constant_throughput&lt;/code&gt; o &lt;code&gt;poisson&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Usuarios con un &lt;code&gt;wait_time&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;Open Model Thread Group, plugin Arrivals&lt;/td&gt;
&lt;td&gt;Thread Group&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Cuál es la diferencia entre un modelo de carga abierto y uno cerrado?&lt;/h2&gt;
&lt;p&gt;En un modelo abierto, el generador de carga decide cuándo llega el trabajo, y en uno cerrado lo decide el tiempo de respuesta del sistema.&lt;/p&gt;
&lt;p&gt;La documentación de k6 lo explica sin rodeos: en el &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/open-vs-closed/&quot;&gt;modelo cerrado&lt;/a&gt;, la siguiente iteración de un usuario virtual solo empieza cuando termina la anterior, mientras que en el modelo abierto las nuevas iteraciones llegan sin depender de que terminen las anteriores (comprobado el 9 de octubre de 2026). Una prueba cerrada con 50 &lt;a href=&quot;https://loadfocus.com/docs/es-es/guides/load-testing/what-are-virtual-users-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=open-vs-closed-workload-model&quot;&gt;usuarios virtuales&lt;/a&gt; nunca tiene más de 50 iteraciones en curso. Una prueba abierta a 50 iteraciones por segundo lanza 50 más cada segundo, y si cada una tarda más, se solapan más.&lt;/p&gt;
&lt;h2&gt;¿Por qué un modelo cerrado oculta la latencia cuando el sistema se satura?&lt;/h2&gt;
&lt;p&gt;Porque la prueba se ralentiza junto con el sistema. Cuando las respuestas tardan más, cada usuario de un modelo cerrado envía menos peticiones, y la carga baja justo cuando querías verla subir.&lt;/p&gt;
&lt;p&gt;La documentación de k6 describe el efecto: respuestas más lentas significan iteraciones más largas y una tasa de llegada menor de iteraciones nuevas. La &lt;a href=&quot;https://docs.gatling.io/testing-concepts/workload-models/&quot;&gt;página de Gatling sobre modelos de carga&lt;/a&gt; va más allá y dice que usar un modelo cerrado contra un sistema que en realidad es abierto es una prueba rota que mide un comportamiento imaginario (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;Por eso una prueba cerrada muestra tiempos de respuesta que se estabilizan, ya que nunca puede haber más peticiones en curso que usuarios. Una prueba abierta muestra la cola creciendo, con tiempos de respuesta que suben mientras las llegadas superen lo que el sistema procesa. Esa segunda imagen es la que verían tus usuarios, y los &lt;a href=&quot;https://loadfocus.com/docs/es-es/guides/load-testing/response-time-distribution?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=open-vs-closed-workload-model&quot;&gt;tiempos de respuesta p95 y p99&lt;/a&gt; que lees al final solo son tan fiables como el modelo de carga que los produjo.&lt;/p&gt;
&lt;p&gt;La documentación de k6 señala que parte de la literatura sobre pruebas llama a este problema &lt;a href=&quot;https://loadtest.app/es/coordinated-omission/&quot;&gt;coordinated omission&lt;/a&gt;. Un artículo de USENIX de 2006 que cita la documentación de Gatling, &lt;a href=&quot;https://www.usenix.org/legacy/event/nsdi06/tech/full_papers/schroeder/schroeder.pdf&quot;&gt;Open Versus Closed: A Cautionary Tale&lt;/a&gt;, concluyó que los dos modelos dan resultados muy distintos incluso con la misma carga y las mismas demandas de servicio.&lt;/p&gt;
&lt;h2&gt;¿Qué modelo encaja con tu tráfico real?&lt;/h2&gt;
&lt;p&gt;Elige un modelo abierto para todo lo que el público puede alcanzar, y uno cerrado solo donde el propio sistema limita cuántos usuarios están activos a la vez.&lt;/p&gt;
&lt;p&gt;La documentación de Gatling pone como ejemplos de sistemas cerrados los centros de llamadas con todos los operadores ocupados y los sitios de venta de entradas que ponen a los usuarios en cola cuando están al máximo, y dice que la mayoría de los sitios web se comportan como abiertos. Un proceso por lotes con un número fijo de workers, o un consumidor de colas con una concurrencia fija, también es cerrado. Las API públicas, las páginas web y los webhooks son abiertos: nada frena la siguiente petición porque la anterior haya ido lenta.&lt;/p&gt;
&lt;p&gt;Muchos sistemas quedan en medio: una compradora llega a su propio ritmo y luego espera cada página dentro de la visita. El artículo citado lo llama modelo parcialmente abierto. En k6 o Gatling, fija la tasa de llegada de las sesiones y haz que cada iteración sea un recorrido de usuario completo, con sus propias pausas.&lt;/p&gt;
&lt;h2&gt;¿Cómo se configura cada modelo en k6?&lt;/h2&gt;
&lt;p&gt;Con el executor. &lt;code&gt;constant-vus&lt;/code&gt; y &lt;code&gt;ramping-vus&lt;/code&gt; dan un modelo cerrado, y &lt;code&gt;constant-arrival-rate&lt;/code&gt; y &lt;code&gt;ramping-arrival-rate&lt;/code&gt;, uno abierto.&lt;/p&gt;
&lt;p&gt;Un escenario cerrado define &lt;code&gt;executor: &amp;quot;constant-vus&amp;quot;&lt;/code&gt; con un número de &lt;code&gt;vus&lt;/code&gt; y una &lt;code&gt;duration&lt;/code&gt;. Un escenario abierto fija una tasa, y reservas por adelantado suficientes usuarios virtuales para mantenerla:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;export const options = {
  scenarios: {
    open_model: {
      executor: &amp;quot;constant-arrival-rate&amp;quot;,
      rate: 50,
      timeUnit: &amp;quot;1s&amp;quot;,
      duration: &amp;quot;5m&amp;quot;,
      preAllocatedVUs: 100,
    },
  },
  thresholds: {
    dropped_iterations: [&amp;quot;count&amp;lt;10&amp;quot;],
  },
};
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;k6 &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/arrival-rate-vu-allocation/&quot;&gt;solo inicia una iteración si tiene un usuario virtual libre&lt;/a&gt;, y su documentación desaconseja apoyarse en &lt;code&gt;maxVUs&lt;/code&gt;, porque añadir usuarios a mitad de la prueba puede sobrecargar el generador de carga. Cuando no hay ningún usuario libre, k6 registra una &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/dropped-iterations/&quot;&gt;iteración descartada&lt;/a&gt;, lo que, avanzada la prueba, suele indicar que el sistema se está ralentizando. El umbral de arriba hace fallar la ejecución al llegar a diez. No pongas &lt;code&gt;sleep()&lt;/code&gt; al final de una iteración con tasa de llegada, porque el executor ya marca el ritmo de los inicios (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;Si ejecutas scripts de k6 en LoadFocus, su &lt;a href=&quot;https://loadfocus.com/es-es/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=open-vs-closed-workload-model&quot;&gt;ejecución de k6 en la nube&lt;/a&gt; toma la carga de la configuración de la prueba, y su validador de scripts avisa de que los escenarios con tasa de llegada se ejecutan allí con un número fijo de usuarios, así que la tasa de peticiones no se mantiene. Para una prueba de verdad con modelo abierto, ejecuta los executors de tasa de llegada con el propio k6, o en un servicio que los ejecute tal como están escritos.&lt;/p&gt;
&lt;h2&gt;¿Cómo expresan cada modelo Gatling, Locust y JMeter?&lt;/h2&gt;
&lt;p&gt;Gatling separa los dos modelos en su API, JMeter ofrece ambos mediante thread groups distintos y Locust está construido en torno a un número fijo de usuarios.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gatling.&lt;/strong&gt; Un escenario usa &lt;a href=&quot;https://docs.gatling.io/concepts/injection/&quot;&gt;&lt;code&gt;injectOpen&lt;/code&gt; o &lt;code&gt;injectClosed&lt;/code&gt;&lt;/a&gt;. Los pasos abiertos como &lt;code&gt;constantUsersPerSec&lt;/code&gt; y &lt;code&gt;rampUsersPerSec&lt;/code&gt; fijan tasas de llegada, y los cerrados como &lt;code&gt;constantConcurrentUsers&lt;/code&gt; y &lt;code&gt;rampConcurrentUsers&lt;/code&gt; fijan la concurrencia. &lt;a href=&quot;https://docs.gatling.io/testing-concepts/workload-models/&quot;&gt;Un mismo perfil de inyección no puede mezclar los dos&lt;/a&gt; (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Locust.&lt;/strong&gt; Fijas un número de usuarios, y el &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;&lt;code&gt;wait_time&lt;/code&gt;&lt;/a&gt; de cada usuario controla la pausa entre tareas. &lt;code&gt;constant_throughput&lt;/code&gt; y &lt;code&gt;constant_pacing&lt;/code&gt; ajustan esa pausa para que cada usuario ejecute como mucho un número dado de tareas por segundo, pero la documentación dice que el tiempo de espera solo puede limitar el rendimiento y no lanza usuarios nuevos para alcanzar un objetivo. &lt;code&gt;poisson()&lt;/code&gt; elige pausas aleatorias, que la documentación considera más cercanas a las llegadas reales. El ejemplo de la documentación para 500 iteraciones de tareas por segundo es &lt;code&gt;constant_throughput(0.1)&lt;/code&gt; con 5.000 usuarios, un pool cerrado con mucho margen (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JMeter.&lt;/strong&gt; El &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Thread_Group&quot;&gt;Thread Group&lt;/a&gt; clásico es un pool cerrado de hilos. Los timers Constant Throughput y Precise Throughput acompasan ese pool hacia una tasa objetivo, y la referencia advierte de que el rendimiento baja si el servidor no da abasto o no hay suficientes hilos. Para las llegadas, JMeter 5.5 añadió el &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#Open_Model_Thread_Group&quot;&gt;Open Model Thread Group&lt;/a&gt;, todavía marcado como experimental, con programaciones como &lt;code&gt;rate(10/sec) random_arrivals(1 min)&lt;/code&gt;. El plugin de la comunidad &lt;a href=&quot;https://jmeter-plugins.org/wiki/ArrivalsThreadGroup/&quot;&gt;Arrivals Thread Group&lt;/a&gt; arranca hilos nuevos cuando todos los existentes están ocupados, con un límite de concurrencia como válvula de seguridad (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;h2&gt;¿Qué vigilar en una prueba con modelo abierto?&lt;/h2&gt;
&lt;p&gt;Vigila el generador de carga tan de cerca como el sistema bajo prueba. En un modelo abierto, un sistema lento significa más usuarios concurrentes de tu lado, y eso cuesta memoria y CPU.&lt;/p&gt;
&lt;p&gt;Fija un techo, como &lt;code&gt;maxVUs&lt;/code&gt; en k6 o el límite de concurrencia del plugin de JMeter, y trata alcanzarlo como un resultado: el sistema no pudo absorber la tasa que pediste.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Un modelo de carga cerrado es alguna vez la opción correcta?&lt;/strong&gt;
Sí. Úsalo cuando el sistema real limite la concurrencia, como un pool fijo de workers, un consumidor de colas o un centro de llamadas, o cuando quieras saber cuántas sesiones simultáneas aguanta un componente. Para el tráfico web público encaja mejor un modelo abierto.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Añadir tiempo de reflexión convierte un modelo cerrado en uno abierto?&lt;/strong&gt;
No. El tiempo de reflexión reduce la frecuencia con la que cada usuario envía peticiones, pero cada usuario sigue esperando la respuesta anterior, así que un sistema lento sigue frenando la prueba. Solo una tasa de llegada fijada con independencia de los tiempos de respuesta da un modelo abierto.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuántos usuarios virtuales necesita una prueba con tasa de llegada?&lt;/strong&gt;
Los suficientes para cubrir todas las iteraciones en curso a la vez. La documentación de k6 sugiere la mediana de la duración de una iteración multiplicada por la tasa objetivo, más un margen para la variabilidad, ajustada con pruebas cortas antes de la prueba completa.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/coordinated-omission/&quot;&gt;Coordinated omission: qué es y cómo evitarla&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/littles-law-load-testing/&quot;&gt;Ley de Little en pruebas de carga: dimensionar y comprobar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/think-time-in-load-testing/&quot;&gt;Tiempo de reflexión en pruebas de carga: cómo fijarlo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/throughput-vs-latency/&quot;&gt;Rendimiento vs latencia: cómo se relacionan bajo carga&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/amdahls-law/&quot;&gt;Ley de Amdahl: fórmula, ejemplos y límites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/queueing-theory/&quot;&gt;Teoría de colas: qué es y por qué se dispara la latencia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Tiempo de reflexión en pruebas de carga: cómo fijarlo</title><link>https://loadtest.app/es/think-time-in-load-testing/</link><guid isPermaLink="true">https://loadtest.app/es/think-time-in-load-testing/</guid><description>Tiempo de reflexión en pruebas de carga: por qué las pausas cambian la carga, en qué se diferencia del pacing y cómo fijarlo en k6, JMeter y Locust.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, un servicio de pruebas de carga mencionado en este artículo.&lt;/p&gt;&lt;p&gt;El tiempo de reflexión en pruebas de carga es la pausa que hace un usuario virtual entre dos acciones, y representa los segundos que una persona real pasa leyendo una página o rellenando un formulario. Decide cuánta presión ejerce cada usuario virtual: cuanto más larga es la pausa, menos peticiones por segundo envía el mismo número de usuarios. Mídelo con datos de usuarios reales, hazlo variar al azar alrededor de ese valor y escríbelo en el script con el comando de pausa de tu herramienta.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tiempo de reflexión por vuelta&lt;/th&gt;
&lt;th&gt;Una vuelta dura&lt;/th&gt;
&lt;th&gt;Peticiones por segundo con 100 usuarios&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;0 s&lt;/td&gt;
&lt;td&gt;0,5 s&lt;/td&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 s&lt;/td&gt;
&lt;td&gt;1,5 s&lt;/td&gt;
&lt;td&gt;unas 67&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 s&lt;/td&gt;
&lt;td&gt;3,5 s&lt;/td&gt;
&lt;td&gt;unas 29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5 s&lt;/td&gt;
&lt;td&gt;5,5 s&lt;/td&gt;
&lt;td&gt;unas 18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 s&lt;/td&gt;
&lt;td&gt;10,5 s&lt;/td&gt;
&lt;td&gt;unas 10&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Es solo aritmética, sin ninguna prueba detrás: una petición por vuelta, una respuesta en 0,5 segundos, y el número de usuarios dividido entre (tiempo de respuesta + tiempo de reflexión).&lt;/p&gt;
&lt;h2&gt;¿Qué es el tiempo de reflexión en pruebas de carga?&lt;/h2&gt;
&lt;p&gt;El tiempo de reflexión es la espera deliberada que un script de prueba introduce entre los pasos de un recorrido de usuario. Reproduce la parte humana de una sesión: leer, comparar, escribir.&lt;/p&gt;
&lt;p&gt;En el script de una tienda va entre «abrir la ficha del producto» y «añadir al carrito», fuera de cualquier petición. La &lt;a href=&quot;https://loadfocus.com/docs/es-es/guides/load-testing/what-is-delay-when-running-a-load-test?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=think-time-in-load-testing&quot;&gt;guía de LoadFocus sobre los retardos en una prueba de carga&lt;/a&gt; lo separa del retardo de rampa, que añade usuarios poco a poco, y del retardo de arranque entre un usuario y el siguiente, y señala que muchas herramientas llaman «delay» a secas al retardo de rampa. Cuando una herramienta ofrezca un campo «delay», comprueba a cuál de los tres se refiere.&lt;/p&gt;
&lt;h2&gt;¿Por qué el tiempo de reflexión cambia la carga con el mismo número de usuarios?&lt;/h2&gt;
&lt;p&gt;Con un número fijo de usuarios virtuales, cada uno espera una respuesta, hace una pausa y solo entonces envía la siguiente petición. Su vuelta dura el tiempo de respuesta más el tiempo de reflexión, así que cada segundo de pausa añadido reduce las peticiones que cada usuario envía por segundo.&lt;/p&gt;
&lt;p&gt;Cien usuarios sin pausa envían 200 peticiones por segundo con una respuesta de 0,5 segundos; con una pausa de 5 segundos envían unas 18, de modo que dos pruebas «con 100 usuarios» pueden ser muy distintas. La documentación de k6 describe el mismo efecto para su &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/concepts/open-vs-closed/&quot;&gt;modelo cerrado&lt;/a&gt;: la siguiente iteración solo empieza cuando termina la anterior, así que las respuestas más lentas también bajan el ritmo (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;Recortar el tiempo de reflexión para sacar más carga de menos usuarios tiene un coste: veinte usuarios sin pausas pueden igualar el ritmo de peticiones de varios cientos que sí hacen pausas, y aun así mantienen abiertas muchas menos sesiones y conexiones que producción.&lt;/p&gt;
&lt;h2&gt;¿Qué diferencia hay entre tiempo de reflexión y pacing?&lt;/h2&gt;
&lt;p&gt;El tiempo de reflexión es una pausa después de un paso, así que una vuelta se alarga en cuanto las respuestas se vuelven lentas. El pacing fija el tiempo entre el inicio de una vuelta y el inicio de la siguiente, y acorta la espera cuando el trabajo ha tardado más.&lt;/p&gt;
&lt;p&gt;Con un pacing de 30 segundos, un usuario empieza una vuelta cada 30 segundos tanto si sus peticiones tardaron 2 segundos como 20, lo que encaja con pruebas construidas a partir de volúmenes de negocio como «500 pedidos por hora». La documentación de &lt;a href=&quot;https://docs.locust.io/en/stable/api.html&quot;&gt;&lt;code&gt;constant_pacing&lt;/code&gt;&lt;/a&gt; en Locust detalla el caso límite: si la tarea dura más que el intervalo, la espera baja a cero (comprobado el 9 de octubre de 2026). Muchos scripts combinan ambos, con tiempo de reflexión entre pasos y pacing sobre la vuelta completa.&lt;/p&gt;
&lt;h2&gt;¿El tiempo de reflexión debe ser fijo o aleatorio?&lt;/h2&gt;
&lt;p&gt;Aleatorio, alrededor de una media que hayas medido. Una pausa fija mantiene al mismo paso a los usuarios que arrancaron juntos, que llegan a la misma página en el mismo momento, vuelta tras vuelta.&lt;/p&gt;
&lt;p&gt;Esas oleadas sincronizadas pueden crear picos que producción nunca ve, y una pausa aleatoria reparte a los usuarios. Mantén la media donde la sitúan tus datos: una pausa uniforme entre 2 y 8 segundos da 5 de media, la misma carga media que una pausa fija de 5 segundos. La distribución uniforme es la opción sencilla por defecto; una normal (gaussiana) agrupa las pausas alrededor de un valor típico, y una exponencial da muchas esperas cortas y unas pocas largas.&lt;/p&gt;
&lt;h2&gt;¿Cómo eliges los valores del tiempo de reflexión?&lt;/h2&gt;
&lt;p&gt;Sácalos de lo que hacen los usuarios reales en cada paso, con tu analítica web, los logs de acceso o una herramienta de monitorización de usuarios reales (RUM). Usa un valor distinto por paso, porque leer una ficha de producto lleva más tiempo que pulsar un botón.&lt;/p&gt;
&lt;p&gt;El tiempo en la página que da la analítica, o el intervalo entre peticiones consecutivas de una misma sesión en los logs de acceso, se acerca al tiempo de reflexión de ese paso. Toma la mediana como pausa media y la dispersión para fijar el rango aleatorio, y descarta los tiempos muertos, como una pestaña abierta durante la comida.&lt;/p&gt;
&lt;p&gt;Una API a la que llaman otros programas no tiene a ningún humano en el bucle, así que modela directamente su ritmo de peticiones. Si no tienes datos, apunta en el plan de prueba los valores que supusiste para que una prueba posterior los sustituya; la &lt;a href=&quot;https://loadtest.app/es/how-to-run-a-load-test/&quot;&gt;guía paso a paso para hacer una prueba de carga&lt;/a&gt; muestra dónde encajan.&lt;/p&gt;
&lt;h2&gt;¿Cómo se añade tiempo de reflexión en k6, JMeter, Gatling, Locust y Artillery?&lt;/h2&gt;
&lt;p&gt;Cada herramienta tiene su propio comando de pausa, y la mayoría ofrece además pacing o un control de ritmo.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Herramienta&lt;/th&gt;
&lt;th&gt;Pausa fija&lt;/th&gt;
&lt;th&gt;Pausa aleatoria&lt;/th&gt;
&lt;th&gt;Pacing o ritmo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sleep(3)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;sleep(2 + Math.random() * 6)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ejecutores por tasa de llegada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JMeter&lt;/td&gt;
&lt;td&gt;Constant Timer&lt;/td&gt;
&lt;td&gt;Uniform o Gaussian Random Timer&lt;/td&gt;
&lt;td&gt;Constant Throughput Timer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pause(3)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pause(2, 8)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pace(30)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;&lt;code&gt;constant(3)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;between(2, 8)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;constant_pacing&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artillery&lt;/td&gt;
&lt;td&gt;&lt;code&gt;think: 3&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;think&lt;/code&gt; + &lt;code&gt;jitter&lt;/code&gt; (en &lt;code&gt;config.http.defaults&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Tasa de llegada por fase&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Los datos de la tabla de arriba y de las notas siguientes salen de la documentación de cada proyecto, comprobados el 9 de octubre de 2026; las cinco herramientas aparecen en nuestro repaso de &lt;a href=&quot;https://loadtest.app/es/open-source-load-testing-tools/&quot;&gt;herramientas de pruebas de carga open source&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;k6.&lt;/strong&gt; &lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6/sleep/&quot;&gt;&lt;code&gt;sleep(t)&lt;/code&gt;&lt;/a&gt; pausa al usuario virtual durante &lt;code&gt;t&lt;/code&gt; segundos; la documentación construye pausas aleatorias con &lt;code&gt;Math.random()&lt;/code&gt; o con &lt;code&gt;randomIntBetween()&lt;/code&gt; de k6-utils:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;
import { sleep } from &amp;quot;k6&amp;quot;;

export default function () {
  http.get(&amp;quot;https://example.com/products&amp;quot;);
  sleep(2 + Math.random() * 6); // de 2 a 8 segundos
  http.get(&amp;quot;https://example.com/cart&amp;quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;JMeter.&lt;/strong&gt; Entre los &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html#timers&quot;&gt;timers&lt;/a&gt;, el Constant Timer toma un retardo en milisegundos, los Uniform y Gaussian Random Timers suman una parte aleatoria a un desfase fijo, y el Constant Throughput Timer varía sus pausas para mantener un objetivo de muestras por minuto. Un timer se ejecuta antes de cada sampler de su ámbito, así que un solo timer al nivel del Thread Group hace una pausa antes de cada petición.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gatling.&lt;/strong&gt; &lt;a href=&quot;https://docs.gatling.io/concepts/scenario/&quot;&gt;&lt;code&gt;pause(2, 8)&lt;/code&gt;&lt;/a&gt; espera un tiempo aleatorio uniforme, y &lt;code&gt;pace(30)&lt;/code&gt; dentro de un bucle lo ejecuta como mucho una vez cada 30 segundos. A &lt;a href=&quot;https://docs.gatling.io/concepts/simulation/&quot;&gt;nivel de simulación&lt;/a&gt; puedes pasar todas las pausas a una distribución normal o exponencial, o desactivarlas con &lt;code&gt;disablePauses()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Locust.&lt;/strong&gt; &lt;a href=&quot;https://docs.locust.io/en/stable/writing-a-locustfile.html&quot;&gt;&lt;code&gt;wait_time&lt;/code&gt;&lt;/a&gt; se aplica después de cada tarea, así que una tarea con dos peticiones bajo &lt;code&gt;constant_throughput(2)&lt;/code&gt; envía cuatro peticiones por segundo y por usuario.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artillery.&lt;/strong&gt; Un &lt;a href=&quot;https://www.artillery.io/docs/reference/engines/http&quot;&gt;paso &lt;code&gt;think&lt;/code&gt;&lt;/a&gt; hace una pausa de un número de segundos, y un ajuste &lt;code&gt;think.jitter&lt;/code&gt; en &lt;code&gt;config.http.defaults&lt;/code&gt; añade variación aleatoria a cada paso think. Para ver dos de estas herramientas cara a cara, consulta &lt;a href=&quot;https://loadtest.app/es/k6-vs-artillery/&quot;&gt;k6 vs Artillery&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;¿Importa el tiempo de reflexión en una prueba por tasa de llegada?&lt;/h2&gt;
&lt;p&gt;Menos, en lo que toca al ritmo de peticiones. Cuando la herramienta lanza nuevas iteraciones a un ritmo fijo, las pausas deciden cuánto tiempo se queda cada usuario y, por tanto, cuántos están activos a la vez.&lt;/p&gt;
&lt;p&gt;Los &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/constant-arrival-rate/&quot;&gt;ejecutores por tasa de llegada&lt;/a&gt; de k6 marcan el ritmo de las iteraciones con su tasa, y la documentación desaconseja un &lt;code&gt;sleep&lt;/code&gt; al final de la iteración; las &lt;a href=&quot;https://www.artillery.io/docs/reference/test-script&quot;&gt;fases de carga&lt;/a&gt; de Artillery crean igualmente un número fijo de nuevos usuarios virtuales por segundo (ambos comprobados el 9 de octubre de 2026). El tiempo de reflexión entre pasos sigue dando forma a cada sesión.&lt;/p&gt;
&lt;h2&gt;¿Cómo fijan el tiempo de reflexión las herramientas de script de LoadFocus?&lt;/h2&gt;
&lt;p&gt;Lo escriben en el script de k6 o JMeter como valor inicial, para que lo ajustes después.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://loadfocus.com/docs/es-es/guides/k6-load-testing/import-to-k6-from-curl-har-postman-openapi?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=think-time-in-load-testing&quot;&gt;importación desde cURL, HAR, Postman u OpenAPI&lt;/a&gt; convierte una petición capturada en un script de k6 que termina cada iteración con &lt;code&gt;sleep(1)&lt;/code&gt;; trata ese segundo como un valor provisional que debes sustituir por tus mediciones. El generador de pruebas con IA de LoadFocus tiene la instrucción de dar a cada paso un tiempo de reflexión, lo escribe como &lt;code&gt;sleep()&lt;/code&gt; para k6 o como Constant Timer para JMeter, y avisa cuando un escenario de varios pasos no tiene ninguno.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Se puede hacer una prueba de carga sin tiempo de reflexión?&lt;/strong&gt;
Sí, para encontrar el rendimiento máximo de un endpoint o para una prueba de estrés, siempre que presentes el resultado en peticiones por segundo. Dice poco sobre cuántos usuarios reales puede atender el sistema.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿El tiempo de reflexión cuenta en el tiempo de respuesta?&lt;/strong&gt;
No en los tiempos de cada petición. En k6, &lt;code&gt;http_req_duration&lt;/code&gt; cubre el envío, la espera y la recepción, mientras que &lt;code&gt;iteration_duration&lt;/code&gt; cubre la vuelta completa (&lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/metrics/reference/&quot;&gt;referencia de métricas&lt;/a&gt;, comprobado el 9 de octubre de 2026). Un Transaction Controller de JMeter deja los timers fuera de su tiempo, salvo que marques la opción que los incluye.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-vs-closed-workload-model/&quot;&gt;Modelo de carga abierto vs cerrado: cuál usar y cuándo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/littles-law-load-testing/&quot;&gt;Ley de Little en pruebas de carga: dimensionar y comprobar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/how-to-run-a-load-test/&quot;&gt;Cómo hacer una prueba de carga: guía paso a paso&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/queueing-theory/&quot;&gt;Teoría de colas: qué es y por qué se dispara la latencia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Herramientas de pruebas de carga WebSocket: seis opciones</title><link>https://loadtest.app/es/websocket-load-testing-tools/</link><guid isPermaLink="true">https://loadtest.app/es/websocket-load-testing-tools/</guid><description>Herramientas de pruebas de carga WebSocket comparadas: k6, Artillery, Gatling, JMeter, Locust y Tsung, qué soporta cada una y cuándo elegir otra.</description><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, que vende un servicio de pruebas de carga que aparece en este artículo.&lt;/p&gt;&lt;p&gt;Entre las herramientas de pruebas de carga WebSocket, k6, Artillery, Gatling y Tsung soportan el protocolo de serie, mientras que JMeter necesita el plugin WebSocket Samplers y Locust, código cliente que escribas tú o su usuario experimental de Socket.IO. Elige según el lenguaje en el que escribe tu equipo y, después, según lo estrictamente que debas comprobar los mensajes que devuelve el servidor.&lt;/p&gt;
&lt;p&gt;Para este artículo no hemos ejecutado estas herramientas contra un servidor WebSocket. Los datos salen de la documentación y el repositorio de cada proyecto, comprobados el 9 de octubre de 2026, y las notas de «Opta por» son nuestra opinión.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Herramienta&lt;/th&gt;
&lt;th&gt;Soporte de WebSocket&lt;/th&gt;
&lt;th&gt;Pruebas escritas en&lt;/th&gt;
&lt;th&gt;Comprobar lo que envía el servidor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;De serie: &lt;code&gt;k6/websockets&lt;/code&gt;, el antiguo &lt;code&gt;k6/ws&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;Manejadores de eventos en tu script&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artillery&lt;/td&gt;
&lt;td&gt;Motores de serie &lt;code&gt;ws&lt;/code&gt; y &lt;code&gt;socketio&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;YAML, más funciones de JavaScript&lt;/td&gt;
&lt;td&gt;Respuestas y acuses de recibo de Socket.IO&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;Parte del SDK de HTTP&lt;/td&gt;
&lt;td&gt;Java, Kotlin, Scala, JavaScript&lt;/td&gt;
&lt;td&gt;Checks que esperan un mensaje concreto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apache JMeter&lt;/td&gt;
&lt;td&gt;Plugin WebSocket Samplers&lt;/td&gt;
&lt;td&gt;Planes de prueba creados en la interfaz gráfica&lt;/td&gt;
&lt;td&gt;Samplers de request-response y de lectura&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;Tu propio cliente, o el &lt;code&gt;SocketIOUser&lt;/code&gt; experimental&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Lo que informe tu código&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tsung&lt;/td&gt;
&lt;td&gt;Tipo de sesión de serie &lt;code&gt;ts_websocket&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;XML&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ack&lt;/code&gt; espera una respuesta del servidor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿En qué se diferencia la carga WebSocket de la carga HTTP?&lt;/h2&gt;
&lt;p&gt;Un usuario WebSocket abre una conexión y la mantiene durante toda la sesión, y el servidor puede enviar mensajes cuando quiera. Por eso una prueba tiene dos palancas, las conexiones abiertas y los mensajes por segundo, y cada una carga el servidor a su manera.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/protocols/websockets/&quot;&gt;guía de WebSocket de k6&lt;/a&gt; describe tráfico full-duplex sobre una sola conexión TCP y explica que un usuario virtual deja de repetir la función principal y ejecuta un bucle de eventos mientras el socket sigue abierto. La &lt;a href=&quot;https://docs.gatling.io/reference/script/websocket/&quot;&gt;referencia de WebSocket de Gatling&lt;/a&gt; añade que el tráfico va en los dos sentidos, así que el modelo de petición y respuesta de HTTP ya no encaja.&lt;/p&gt;
&lt;p&gt;Planifica tres tipos de prueba. Muchas conexiones inactivas muestran cuántos sockets pueden mantener tus servidores. Un grupo menor de clientes que hablan mucho pone a prueba el manejo de mensajes. Una difusión, en la que un mensaje llega a todos los suscriptores, pone a prueba el envío de mensajes push.&lt;/p&gt;
&lt;h2&gt;¿Qué deberías medir en una prueba de carga WebSocket?&lt;/h2&gt;
&lt;p&gt;Mide el tiempo de conexión, la latencia de los mensajes y las conexiones caídas, además de cuántas conexiones siguen abiertas. Son los valores que notan los usuarios de una aplicación en tiempo real.&lt;/p&gt;
&lt;p&gt;Las &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/metrics/reference/&quot;&gt;métricas integradas de k6&lt;/a&gt; incluyen &lt;code&gt;ws_connecting&lt;/code&gt;, &lt;code&gt;ws_ping&lt;/code&gt;, &lt;code&gt;ws_session_duration&lt;/code&gt;, &lt;code&gt;ws_sessions&lt;/code&gt; y contadores de mensajes. Ninguna cronometra un mensaje de la aplicación, así que el tiempo entre el mensaje de un cliente y la respuesta del servidor necesita una métrica Trend propia. El motor &lt;code&gt;ws&lt;/code&gt; de Artillery informa del número y el ritmo de mensajes, y su motor de Socket.IO añade &lt;code&gt;socketio.response_time&lt;/code&gt;, desde que se emite un mensaje hasta que llega la respuesta.&lt;/p&gt;
&lt;p&gt;Para las conexiones caídas, cuenta los eventos close y error que tu script no haya provocado, y compara las sesiones iniciadas con las que siguen abiertas al final de cada etapa.&lt;/p&gt;
&lt;h2&gt;¿Cuándo es k6 la herramienta WebSocket adecuada?&lt;/h2&gt;
&lt;p&gt;Cuando tu equipo escribe JavaScript y cada usuario virtual debe mantener varios sockets a la vez. k6 trae soporte de WebSocket de serie, sin extensiones que instalar.&lt;/p&gt;
&lt;p&gt;El módulo &lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-websockets/&quot;&gt;&lt;code&gt;k6/websockets&lt;/code&gt;&lt;/a&gt; sigue la API WebSocket del navegador y usa un bucle de eventos global, que permite a un usuario virtual mantener varias conexiones abiertas. El módulo antiguo &lt;a href=&quot;https://grafana.com/docs/k6/latest/javascript-api/k6-ws/&quot;&gt;&lt;code&gt;k6/ws&lt;/code&gt;&lt;/a&gt; sigue documentado, pero k6 recomienda &lt;code&gt;k6/websockets&lt;/code&gt; para pruebas nuevas, y &lt;code&gt;k6/experimental/websockets&lt;/code&gt; está obsoleto.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;import { WebSocket } from &amp;#39;k6/websockets&amp;#39;;

export default function () {
  const ws = new WebSocket(&amp;#39;wss://example.com/ws&amp;#39;);
  ws.onopen = () =&amp;gt; ws.send(&amp;#39;hello&amp;#39;);
  ws.onmessage = (e) =&amp;gt; {
    console.log(e.data);
    ws.close();
  };
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Los &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt; también funcionan con métricas propias, así que un objetivo de latencia incumplido le da a la CI un código de salida distinto de cero. Opta por Artillery cuando tu servidor hable Socket.IO y quieras comprobar emisiones y acuses de recibo sin escribir código cliente. Nuestra comparativa &lt;a href=&quot;https://loadtest.app/es/k6-vs-artillery/&quot;&gt;k6 vs Artillery&lt;/a&gt; cubre el resto de diferencias.&lt;/p&gt;
&lt;h2&gt;¿Cuándo encaja Artillery?&lt;/h2&gt;
&lt;p&gt;Cuando quieres escenarios YAML cortos, o cuando tu servidor usa Socket.IO. Los dos motores vienen con el propio Artillery.&lt;/p&gt;
&lt;p&gt;Un escenario con el &lt;a href=&quot;https://www.artillery.io/docs/reference/engines/websocket&quot;&gt;motor de WebSocket&lt;/a&gt; se construye con cinco acciones: &lt;code&gt;connect&lt;/code&gt;, &lt;code&gt;send&lt;/code&gt;, &lt;code&gt;think&lt;/code&gt;, &lt;code&gt;loop&lt;/code&gt; y &lt;code&gt;function&lt;/code&gt;. El &lt;a href=&quot;https://www.artillery.io/docs/reference/engines/socketio&quot;&gt;motor de Socket.IO&lt;/a&gt; va más allá: un &lt;code&gt;emit&lt;/code&gt; puede declarar la respuesta que espera, validar un acuse de recibo con una coincidencia JSONPath y compartir escenario con peticiones HTTP, algo útil para aplicaciones que inician sesión por HTTP antes de abrir un socket.&lt;/p&gt;
&lt;p&gt;Opta por k6 o Gatling cuando una prueba deba comprobar lo que devuelve un servidor WebSocket puro, porque la documentación del motor &lt;code&gt;ws&lt;/code&gt; no describe ningún paso que espere o compare una respuesta.&lt;/p&gt;
&lt;h2&gt;¿Para quién es Gatling en WebSockets?&lt;/h2&gt;
&lt;p&gt;Para equipos en la JVM, o en el SDK de JavaScript de Gatling, que quieren escribir las comprobaciones de mensajes dentro del escenario. El soporte de WebSocket forma parte del SDK de HTTP de Gatling, así que los pasos HTTP y WebSocket comparten una misma simulación.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://docs.gatling.io/reference/script/websocket/&quot;&gt;referencia&lt;/a&gt; cubre &lt;code&gt;connect&lt;/code&gt;, &lt;code&gt;sendText&lt;/code&gt;, &lt;code&gt;sendBytes&lt;/code&gt; y &lt;code&gt;close&lt;/code&gt;, además de checks que bloquean hasta que llega el mensaje esperado o vence un tiempo límite. Los ajustes del protocolo permiten reconectar un socket que cerró el servidor, responder automáticamente a ciertos mensajes de texto como un ping y guardar en un búfer los mensajes que ningún check reconoció. Según su &lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;repositorio&lt;/a&gt;, WebSocket forma parte de la Community Edition con licencia Apache 2.0, sin límites.&lt;/p&gt;
&lt;p&gt;Opta por k6 si prefieres reaccionar a los mensajes que empuja el servidor con manejadores de eventos en lugar de checks bloqueantes.&lt;/p&gt;
&lt;h2&gt;¿Puede JMeter hacer pruebas de carga de WebSockets?&lt;/h2&gt;
&lt;p&gt;Sí, con un plugin. JMeter no tiene sampler de WebSocket, y la extensión habitual es WebSocket Samplers de Peter Doornbosch.&lt;/p&gt;
&lt;p&gt;La &lt;a href=&quot;https://jmeter.apache.org/usermanual/component_reference.html&quot;&gt;referencia de componentes&lt;/a&gt; de JMeter no menciona WebSocket en ningún momento. El &lt;a href=&quot;https://bitbucket.org/pjtr/jmeter-websocket-samplers/src/master/&quot;&gt;repositorio del plugin&lt;/a&gt; describe seis samplers: abrir conexión, request-response, ping-pong, lectura única, escritura única y cierre. Se ejecutan en el propio hilo del Thread Group, soportan &lt;code&gt;wss&lt;/code&gt; y tramas binarias, y pueden filtrar las tramas que no interesan a la prueba. Se instala con el Plugins Manager o copiando su jar en &lt;code&gt;lib/ext&lt;/code&gt;, y la versión 1.3.2 se etiquetó en enero de 2026 (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;Elige otra herramienta si prefieres no mantener un plugin de terceros en cada generador de carga.&lt;/p&gt;
&lt;h2&gt;¿Y Locust y Tsung?&lt;/h2&gt;
&lt;p&gt;Locust solo llega a los WebSockets puros con código cliente que añades tú, y Tsung los soporta en su configuración XML, aunque publica versiones nuevas muy de vez en cuando. Los dos funcionan, con más esfuerzo.&lt;/p&gt;
&lt;p&gt;Según la &lt;a href=&quot;https://docs.locust.io/en/stable/testing-other-systems.html&quot;&gt;documentación de Locust&lt;/a&gt;, la herramienta solo soporta de serie HTTP y HTTPS; los demás protocolos se añaden envolviendo una biblioteca cliente y lanzando un evento request después de cada llamada. La biblioteca tiene que poder parchearse con gevent, o bloqueará todo el proceso. Para Socket.IO existe un &lt;code&gt;SocketIOUser&lt;/code&gt; experimental. Elige Locust si tu equipo escribe Python y no le importa mantener ese código cliente.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/processone/tsung&quot;&gt;Tsung&lt;/a&gt; es un proyecto en Erlang que se describe como una herramienta de pruebas de carga distribuida y multiprotocolo. Su &lt;a href=&quot;https://github.com/processone/tsung/blob/develop/docs/conf-sessions.rst&quot;&gt;documentación de sesiones&lt;/a&gt; define para WebSocket las peticiones &lt;code&gt;connect&lt;/code&gt;, &lt;code&gt;message&lt;/code&gt; y &lt;code&gt;close&lt;/code&gt;, con un atributo &lt;code&gt;ack&lt;/code&gt; para esperar una respuesta. Su &lt;a href=&quot;https://github.com/processone/tsung/tags&quot;&gt;última versión etiquetada&lt;/a&gt;, la 1.8.0, es de marzo de 2023.&lt;/p&gt;
&lt;h2&gt;¿Dónde encaja un servicio alojado como LoadFocus?&lt;/h2&gt;
&lt;p&gt;Mantener muchos sockets abiertos desde tus propias máquinas da trabajo, y un servicio alojado se encarga de generar la carga. Encaja mejor cuando tus pruebas ya son scripts de k6.&lt;/p&gt;
&lt;p&gt;LoadFocus, el editor de este sitio, &lt;a href=&quot;https://loadfocus.com/es-es/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=websocket-load-testing-tools&quot;&gt;ejecuta scripts de k6&lt;/a&gt; desde 25 regiones en la nube, y su página de k6 incluye las conexiones WebSocket entre las funciones de k6 que soporta. También ofrece una &lt;a href=&quot;https://loadfocus.com/templates/load-testing-for-websocket-ramp-up-and-ramp-down?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=websocket-load-testing-tools&quot;&gt;plantilla de prueba WebSocket con rampa de subida y bajada&lt;/a&gt; (en inglés). No hemos comprobado si ejecuta plugins de JMeter como WebSocket Samplers, así que no afirmamos nada al respecto.&lt;/p&gt;
&lt;h2&gt;¿Cómo elegir entre ellas?&lt;/h2&gt;
&lt;p&gt;Parte del lenguaje de tu equipo y pregúntate después si pruebas WebSockets puros o Socket.IO y con qué rigor debes comprobar los mensajes que empuja el servidor. Normalmente quedan una o dos candidatas.&lt;/p&gt;
&lt;p&gt;Escribe en las dos la misma prueba corta de conectar, enviar y recibir, y compara el tiempo de conexión y la latencia de los mensajes con poca carga. Nuestra guía &lt;a href=&quot;https://loadtest.app/es/how-to-run-a-load-test/&quot;&gt;Cómo hacer una prueba de carga&lt;/a&gt; recorre los pasos, y el repaso de &lt;a href=&quot;https://loadtest.app/es/open-source-load-testing-tools/&quot;&gt;herramientas de pruebas de carga open source&lt;/a&gt; compara estos proyectos más allá de WebSocket.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Con qué herramienta de pruebas de carga WebSocket debería empezar?&lt;/strong&gt;
Si tu equipo escribe JavaScript, empieza por k6, que trae WebSocket de serie. Para aplicaciones con Socket.IO, el motor de Artillery pide menos código, y los equipos de la JVM se sentirán como en casa con Gatling.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Puede JMeter probar WebSockets sin un plugin?&lt;/strong&gt;
Su referencia de componentes no incluye ningún sampler de WebSocket, así que el camino práctico es el plugin WebSocket Samplers, instalado con el Plugins Manager o como jar en &lt;code&gt;lib/ext&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Debería usar k6/ws o k6/websockets?&lt;/strong&gt;
Usa &lt;code&gt;k6/websockets&lt;/code&gt; para pruebas nuevas, como recomienda la documentación de k6. El módulo antiguo &lt;code&gt;k6/ws&lt;/code&gt; sigue documentado para los scripts existentes.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-source-load-testing-tools/&quot;&gt;Herramientas de pruebas de carga open source: seis opciones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/how-to-load-test-a-graphql-api/&quot;&gt;Prueba de carga de una API GraphQL: guía práctica&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/http-benchmarking-tools/&quot;&gt;Herramientas de benchmark HTTP: wrk, hey, oha, ab y más&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/grpc-load-testing/&quot;&gt;Pruebas de carga gRPC: herramientas, configuración, métricas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/artillery-load-testing/&quot;&gt;Pruebas de carga con Artillery: análisis de la herramienta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/tsung-load-testing/&quot;&gt;Pruebas de carga con Tsung: la herramienta Erlang a fondo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Cómo hacer una prueba de carga: guía paso a paso</title><link>https://loadtest.app/es/how-to-run-a-load-test/</link><guid isPermaLink="true">https://loadtest.app/es/how-to-run-a-load-test/</guid><description>Cómo hacer una prueba de carga de principio a fin: fijar un objetivo, programar un recorrido, validarlo, subir la carga y leer los resultados que importan.</description><pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, un servicio de pruebas de carga mencionado en este artículo.&lt;/p&gt;&lt;p&gt;Para hacer una prueba de carga, decide qué es un buen resultado, programa un recorrido de usuario realista, comprueba ese script con un solo usuario y después sube la carga por escalones mientras vigilas los tiempos de respuesta y los errores. Compara lo que mediste con el objetivo que fijaste al principio y cambia una sola cosa antes de la siguiente ejecución.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Paso&lt;/th&gt;
&lt;th&gt;Qué haces&lt;/th&gt;
&lt;th&gt;Terminado cuando&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;1. Fijar el objetivo&lt;/td&gt;
&lt;td&gt;Elegir la carga a probar y las cifras que cuentan como éxito&lt;/td&gt;
&lt;td&gt;Puedes escribir los criterios en una frase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Programar un recorrido&lt;/td&gt;
&lt;td&gt;Convertir un recorrido real de usuario en un script&lt;/td&gt;
&lt;td&gt;El script se ejecuta sin errores&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Prueba de humo&lt;/td&gt;
&lt;td&gt;Ejecutarlo con un usuario virtual&lt;/td&gt;
&lt;td&gt;Todas las comprobaciones pasan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Subir la carga&lt;/td&gt;
&lt;td&gt;Aumentar la carga por escalones y mantener el objetivo&lt;/td&gt;
&lt;td&gt;Llegas al objetivo o a una condición de parada&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Leer los resultados&lt;/td&gt;
&lt;td&gt;Comparar percentiles y errores con el objetivo&lt;/td&gt;
&lt;td&gt;Sabes si pasó y qué cambiar&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Qué debes decidir antes de hacer una prueba de carga?&lt;/h2&gt;
&lt;p&gt;Decide para qué carga pruebas y qué resultado cuenta como éxito. Sin las dos cosas, una prueba de carga produce números, pero no una respuesta.&lt;/p&gt;
&lt;p&gt;Parte del tráfico real si lo tienes. Tu analítica o tus logs de acceso te dicen cuál es la hora de más tráfico, cuántas peticiones por segundo llegan y qué páginas o endpoints se llevan la mayoría. Pon el objetivo por encima de ese pico, porque la idea es saber que tienes margen. Después escribe los criterios como números, por ejemplo: el percentil 95 del tiempo de respuesta se mantiene por debajo de 500 ms y fallan menos del 1 % de las peticiones con 200 usuarios virtuales.&lt;/p&gt;
&lt;p&gt;Aquí también entran dos decisiones prácticas. Elige un entorno parecido a producción en tamaño y configuración, porque un servidor de staging con una cuarta parte de la capacidad dice poco sobre producción. Y asegúrate de tener permiso para probarlo: lanzar una prueba de carga contra un sistema que no es tuyo, o que compartes con otros equipos, sin avisar se parece exactamente a un ataque.&lt;/p&gt;
&lt;h2&gt;¿Cómo se programa un recorrido de usuario realista?&lt;/h2&gt;
&lt;p&gt;Programa el recorrido que más importa al negocio, paso a paso, con pausas donde una persona real leería o escribiría. Un script que llama a una sola URL lo más rápido posible mide algo, pero rara vez lo que te interesa.&lt;/p&gt;
&lt;p&gt;En una tienda podría ser: abrir la portada, buscar, abrir un producto, añadirlo al carrito. En una API: iniciar sesión, listar elementos, obtener uno. Añade una pausa corta entre pasos (tiempo de reflexión), usa datos de prueba variados para que las cachés se comporten como en la vida real y comprueba cada respuesta para que una página de error no pase por una respuesta rápida.&lt;/p&gt;
&lt;p&gt;Este es el script que usamos para el ejemplo de esta guía, escrito para k6. Sube a 10 usuarios virtuales, mantiene la carga y baja, con dos criterios de éxito incluidos:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;
import { check, sleep } from &amp;quot;k6&amp;quot;;

export const options = {
  stages: [
    { duration: &amp;quot;10s&amp;quot;, target: 10 },
    { duration: &amp;quot;20s&amp;quot;, target: 10 },
    { duration: &amp;quot;5s&amp;quot;, target: 0 },
  ],
  thresholds: {
    http_req_duration: [&amp;quot;p(95)&amp;lt;500&amp;quot;],
    http_req_failed: [&amp;quot;rate&amp;lt;0.01&amp;quot;],
  },
};

export default function () {
  const res = http.get(&amp;quot;http://127.0.0.1:8765/&amp;quot;);
  check(res, { &amp;quot;status is 200&amp;quot;: (r) =&amp;gt; r.status === 200 });
  sleep(1);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Un recorrido real tiene varias peticiones y URLs reales. Este es diminuto a propósito, para que los pasos sean fáciles de seguir.&lt;/p&gt;
&lt;h2&gt;¿Por qué hacer primero una prueba de humo con un solo usuario?&lt;/h2&gt;
&lt;p&gt;Una prueba de humo con un usuario virtual demuestra que el script funciona antes de poner carga real sobre nada. Es la forma más barata de detectar una URL equivocada, un token de inicio de sesión que falta o una comprobación que siempre falla.&lt;/p&gt;
&lt;p&gt;Con k6 puedes &lt;a href=&quot;https://grafana.com/docs/k6/latest/get-started/running-k6/&quot;&gt;sobrescribir la carga desde la línea de comandos&lt;/a&gt;, así que el mismo script se ejecuta una vez con un solo usuario:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;k6 run --vus 1 --iterations 1 script.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En nuestra ejecución, la única comprobación pasó, así que el script estaba listo para la carga. Si aquí falla una comprobación, arregla el script antes de seguir: los errores con un usuario se convierten en ruido con cien.&lt;/p&gt;
&lt;h2&gt;¿Cómo se debe subir la carga?&lt;/h2&gt;
&lt;p&gt;Sube la carga por escalones y mantén cada escalón el tiempo suficiente para que se estabilice, en lugar de saltar directamente al objetivo. Una rampa por escalones te muestra a partir de qué nivel empiezan a empeorar las cosas.&lt;/p&gt;
&lt;p&gt;Una forma habitual es subir a un primer escalón, mantenerlo unos minutos, subir al siguiente, mantenerlo otra vez y así hasta el objetivo, y después bajar. Si miras cada tramo por separado, ves si los tiempos de respuesta suben de forma gradual con la carga o se mantienen planos y luego saltan. Ese salto, el punto en el que cada usuario extra hace más lenta cada petición, es lo más útil que puede encontrar una prueba de carga. Nuestro ejemplo solo sube a 10 usuarios y mantiene 20 segundos, suficiente para mostrar los escalones pero demasiado corto para una prueba real.&lt;/p&gt;
&lt;h2&gt;¿Qué hay que vigilar mientras corre la prueba?&lt;/h2&gt;
&lt;p&gt;Vigila los percentiles del tiempo de respuesta, la tasa de errores y el rendimiento en el lado del generador de carga, y la CPU, la memoria y la carga de la base de datos en el sistema que pruebas. Las tres primeras cosas te dicen cómo lo notarían los usuarios, y las tres últimas, por qué.&lt;/p&gt;
&lt;p&gt;Acuerda condiciones de parada antes de empezar, por ejemplo: parar si la tasa de errores pasa del 5 % o si los tiempos de respuesta llegan a varios segundos. Seguir empujando un sistema que ya se ha caído no enseña nada, y en un entorno compartido estorba el trabajo de otros.&lt;/p&gt;
&lt;p&gt;Vigila también el generador de carga. Si está al 100 % de CPU, las respuestas lentas pueden venir de tu propio portátil y no del servidor.&lt;/p&gt;
&lt;h2&gt;¿Cómo se leen los resultados de una prueba de carga?&lt;/h2&gt;
&lt;p&gt;Lee los percentiles y la tasa de errores frente a los criterios que anotaste al principio. El tiempo de respuesta medio es la cifra menos útil del informe.&lt;/p&gt;
&lt;p&gt;Esto es lo que dio nuestra ejecución de ejemplo (35 segundos, hasta 10 usuarios virtuales, una pequeña página estática servida en un portátil, el 8 de octubre de 2026):&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Métrica&lt;/th&gt;
&lt;th&gt;Valor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Peticiones&lt;/td&gt;
&lt;td&gt;282 (8 por segundo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peticiones fallidas&lt;/td&gt;
&lt;td&gt;0 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tiempo de respuesta medio&lt;/td&gt;
&lt;td&gt;0,69 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Percentil 90&lt;/td&gt;
&lt;td&gt;0,66 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Percentil 95&lt;/td&gt;
&lt;td&gt;0,71 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Percentil 99&lt;/td&gt;
&lt;td&gt;2,68 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Petición más lenta&lt;/td&gt;
&lt;td&gt;15,98 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thresholds&lt;/td&gt;
&lt;td&gt;Los dos superados&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Las cifras son diminutas porque el objetivo era un archivo estático en la misma máquina, así que no sirven como benchmark. La lección está en la forma: la media quedó por encima del percentil 90, porque un puñado de peticiones lentas la arrastró hacia arriba. Los percentiles describen lo que vivió la mayoría de las peticiones, y el percentil 99 y la petición más lenta muestran la cola que sufren unos pocos usuarios. Juzga la ejecución por el percentil de tus criterios y usa la cola para decidir si algo merece una mirada más atenta.&lt;/p&gt;
&lt;p&gt;Si una ejecución no cumple su objetivo, cambia una sola cosa (una consulta, un ajuste de caché, un tamaño de instancia) y vuelve a lanzar la misma prueba, para saber qué marcó la diferencia.&lt;/p&gt;
&lt;h2&gt;¿Cuándo conviene lanzar la prueba desde la nube?&lt;/h2&gt;
&lt;p&gt;Lleva el generador de carga a la nube cuando una máquina no puede producir la carga que necesitas, o cuando importa dónde están tus usuarios. Un portátil en el Wi-Fi de la oficina mide tu conexión tanto como tu servidor.&lt;/p&gt;
&lt;p&gt;El mismo script de k6 puede ejecutarse en infraestructura que gestionas tú, en el servicio alojado de Grafana o en &lt;a href=&quot;https://loadfocus.com/es-es/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=how-to-run-a-load-test&quot;&gt;LoadFocus, que ejecuta scripts de k6 desde 25 regiones en la nube&lt;/a&gt;. Sus informes desglosan los resultados por ubicación y muestran el tiempo de respuesta frente al número de usuarios virtuales, que es donde se ve el salto descrito arriba (&lt;a href=&quot;https://loadfocus.com/docs/es-es/guides/load-testing/analyzing-load-test-results?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=how-to-run-a-load-test&quot;&gt;cómo leer los resultados en LoadFocus&lt;/a&gt;).&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Cuánto debe durar una prueba de carga?&lt;/strong&gt;
Lo suficiente para mantener la carga objetivo varios minutos después de la subida, de modo que los picos cortos no decidan el resultado. Mantener al menos 10 minutos es un buen punto de partida, y bastante más si buscas fugas de memoria o una degradación lenta.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Cuántos usuarios virtuales necesito?&lt;/strong&gt;
Calcúlalo a partir del tráfico real. Toma las peticiones por segundo de la hora de más tráfico, estima cuántas peticiones hace un recorrido y cuánto dura, y dimensiona los usuarios virtuales para que la prueba produzca ese ritmo con algo de margen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Es seguro hacer pruebas de carga en producción?&lt;/strong&gt;
Puede serlo, con cuidado: prueba en un momento tranquilo, avisa a quien opera el sistema, fija condiciones de parada y empieza muy por debajo del pico esperado. Muchos equipos prefieren un entorno de staging del tamaño de producción, para que una prueba fallida no afecte a ningún cliente.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/load-test-pass-fail-criteria/&quot;&gt;Criterios de aprobación en pruebas de carga: cómo fijarlos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/load-testing-in-github-actions/&quot;&gt;Pruebas de carga en GitHub Actions: guía práctica&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>k6 vs Artillery: qué herramienta de pruebas de carga elegir</title><link>https://loadtest.app/es/k6-vs-artillery/</link><guid isPermaLink="true">https://loadtest.app/es/k6-vs-artillery/</guid><description>k6 y Artillery comparados en scripts, protocolos, criterios de éxito, ejecución distribuida y licencias, y cuándo conviene usar cada herramienta.</description><pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, que vende un servicio de pruebas de carga que aparece en este artículo.&lt;/p&gt;&lt;p&gt;k6 y Artillery son herramientas de pruebas de carga open source en las que las pruebas se escriben como código, y cualquiera de las dos prueba bien una API HTTP bajo carga. Elige k6 si quieres un único binario, la lógica de prueba en JavaScript y umbrales de éxito integrados. Elige Artillery si tu equipo ya trabaja en Node.js, prefiere escenarios cortos en YAML o necesita pruebas de navegador con Playwright y ejecuciones distribuidas en AWS o Azure desde la línea de comandos.&lt;/p&gt;
&lt;p&gt;Los datos de abajo salen de la documentación y del repositorio de cada proyecto, comprobados el 8 de octubre de 2026.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;k6&lt;/th&gt;
&lt;th&gt;Artillery&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Licencia&lt;/td&gt;
&lt;td&gt;AGPL-3.0 (&lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;repositorio&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;MPL-2.0, algunos módulos de Azure con BSL (&lt;a href=&quot;https://github.com/artilleryio/artillery&quot;&gt;repositorio&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entorno de ejecución&lt;/td&gt;
&lt;td&gt;Un binario de Go con un motor de JavaScript integrado&lt;/td&gt;
&lt;td&gt;Node.js, última versión LTS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scripts de prueba&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;YAML, TypeScript o JavaScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocolos principales&lt;/td&gt;
&lt;td&gt;HTTP, WebSockets, gRPC&lt;/td&gt;
&lt;td&gt;HTTP, WebSocket, Socket.IO (gRPC y Kinesis con motores adicionales)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pruebas de navegador&lt;/td&gt;
&lt;td&gt;Módulo de navegador integrado&lt;/td&gt;
&lt;td&gt;Playwright&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Criterios de éxito&lt;/td&gt;
&lt;td&gt;Thresholds&lt;/td&gt;
&lt;td&gt;Plugin &lt;code&gt;ensure&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ejecución distribuida&lt;/td&gt;
&lt;td&gt;k6-operator en Kubernetes, o Grafana Cloud k6&lt;/td&gt;
&lt;td&gt;&lt;code&gt;run-lambda&lt;/code&gt; o &lt;code&gt;run-fargate&lt;/code&gt; en AWS, &lt;code&gt;run-aci&lt;/code&gt; en Azure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Cuál es la diferencia entre k6 y Artillery?&lt;/h2&gt;
&lt;p&gt;Se diferencian sobre todo en el entorno de ejecución y en cómo describes la carga. k6 es una herramienta compilada en Go que ejecuta código de prueba en JavaScript, mientras que Artillery es una herramienta de Node.js que lee escenarios en YAML o JavaScript.&lt;/p&gt;
&lt;p&gt;Esa diferencia se nota desde el primer día. Instalar k6 es instalar un paquete o &lt;a href=&quot;https://grafana.com/docs/k6/latest/set-up/install-k6/&quot;&gt;un binario independiente&lt;/a&gt;, sin un entorno de ejecución que mantener. Artillery &lt;a href=&quot;https://www.artillery.io/docs/get-started/get-artillery&quot;&gt;necesita Node.js&lt;/a&gt; y se instala con npm, algo natural en un proyecto de JavaScript y un entorno más que mantener al día en cualquier otro sitio.&lt;/p&gt;
&lt;p&gt;En protocolos, lo que comparten cubre casi todo el trabajo web: ambos hablan HTTP y WebSockets de serie. k6 trae además gRPC, y Artillery, Socket.IO. Artillery consigue gRPC y Kinesis con &lt;a href=&quot;https://www.artillery.io/docs/reference/engines&quot;&gt;motores adicionales&lt;/a&gt; que se instalan aparte (comprobado el 9 de octubre de 2026), y k6 llega más lejos con su ecosistema de extensiones.&lt;/p&gt;
&lt;h2&gt;¿Cómo se escribe una prueba en cada herramienta?&lt;/h2&gt;
&lt;p&gt;En k6 escribes un módulo de JavaScript con las opciones arriba y una función por defecto que ejecuta cada usuario virtual. En Artillery sueles escribir un archivo YAML con un bloque &lt;code&gt;config&lt;/code&gt; para la carga y un bloque &lt;code&gt;scenarios&lt;/code&gt; para lo que hace cada usuario virtual.&lt;/p&gt;
&lt;p&gt;Una prueba de k6 que sube a 20 usuarios virtuales y falla si el percentil 95 del tiempo de respuesta pasa de 500 ms:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import http from &amp;quot;k6/http&amp;quot;;
import { check, sleep } from &amp;quot;k6&amp;quot;;

export const options = {
  stages: [
    { duration: &amp;quot;30s&amp;quot;, target: 20 },
    { duration: &amp;quot;1m&amp;quot;, target: 20 },
    { duration: &amp;quot;15s&amp;quot;, target: 0 },
  ],
  thresholds: { http_req_duration: [&amp;quot;p(95)&amp;lt;500&amp;quot;] },
};

export default function () {
  const res = http.get(&amp;quot;https://staging.example.com/api/users&amp;quot;);
  check(res, { &amp;quot;status is 200&amp;quot;: (r) =&amp;gt; r.status === 200 });
  sleep(1);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;La misma idea en &lt;a href=&quot;https://www.artillery.io/docs/reference/test-script&quot;&gt;el formato YAML de Artillery&lt;/a&gt;, con diez usuarios virtuales nuevos por segundo durante un minuto:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;config:
  target: &amp;quot;https://staging.example.com&amp;quot;
  phases:
    - duration: 60
      arrivalRate: 10
  plugins:
    ensure:
      thresholds:
        - &amp;quot;http.response_time.p95&amp;quot;: 500
scenarios:
  - flow:
      - get:
          url: &amp;quot;/api/users&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Los dos ejemplos modelan la carga de forma distinta. El script de k6 fija un número de usuarios virtuales simultáneos, y el archivo de Artillery fija cuántos usuarios virtuales nuevos llegan cada segundo. k6 también puede controlar tasas de llegada con sus &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/scenarios/executors/&quot;&gt;executors de escenarios&lt;/a&gt;, y Artillery puede limitar la concurrencia con &lt;code&gt;maxVusers&lt;/code&gt;, así que elige el modelo que se parezca a cómo llega el tráfico real a tu sistema, no el que cada herramienta muestra primero.&lt;/p&gt;
&lt;h2&gt;¿Cómo deciden k6 y Artillery si una prueba ha pasado?&lt;/h2&gt;
&lt;p&gt;Las dos convierten un objetivo de rendimiento en un código de salida, que es lo que necesita un pipeline de CI. Un objetivo incumplido termina la ejecución con un código de salida distinto de cero en las dos herramientas.&lt;/p&gt;
&lt;p&gt;En k6 los objetivos son &lt;a href=&quot;https://grafana.com/docs/k6/latest/using-k6/thresholds/&quot;&gt;thresholds&lt;/a&gt; y van en las opciones del script, como en el ejemplo de arriba. En Artillery viven en el &lt;a href=&quot;https://www.artillery.io/docs/reference/extensions/ensure&quot;&gt;plugin &lt;code&gt;ensure&lt;/code&gt;&lt;/a&gt;, que admite umbrales simples y condiciones que combinan varias métricas.&lt;/p&gt;
&lt;p&gt;La diferencia práctica está en dónde viven los objetivos. Los thresholds de k6 están en el mismo archivo que la lógica de la prueba. Las comprobaciones de Artillery están en el bloque &lt;code&gt;config&lt;/code&gt;, donde puede ajustarlas alguien que nunca toca los escenarios.&lt;/p&gt;
&lt;h2&gt;¿Cómo se ejecuta una prueba más grande de lo que puede generar una máquina?&lt;/h2&gt;
&lt;p&gt;Las dos herramientas pueden repartir una prueba entre muchas máquinas, por caminos muy distintos. k6 se apoya en Kubernetes o en el servicio alojado de Grafana, y Artillery en tu propia cuenta de AWS o Azure.&lt;/p&gt;
&lt;p&gt;Para k6, el &lt;a href=&quot;https://grafana.com/docs/k6/latest/testing-guides/running-distributed-tests/&quot;&gt;k6-operator&lt;/a&gt; reparte una prueba entre pods de un clúster de Kubernetes, y Grafana Cloud k6 ejecuta los mismos scripts como servicio alojado. Para Artillery, los comandos &lt;code&gt;run-lambda&lt;/code&gt; y &lt;code&gt;run-fargate&lt;/code&gt; &lt;a href=&quot;https://www.artillery.io/docs/load-testing-at-scale/aws-lambda&quot;&gt;lanzan workers en tu cuenta de AWS&lt;/a&gt; tras una configuración IAM única con una pila de CloudFormation. En Azure, &lt;code&gt;run-aci&lt;/code&gt; hace lo mismo con &lt;a href=&quot;https://www.artillery.io/docs/load-testing-at-scale/azure-aci&quot;&gt;Azure Container Instances&lt;/a&gt;, pero exige una suscripción de pago a Artillery para algo más que una evaluación (comprobado el 9 de octubre de 2026). Si ya usas Kubernetes, el camino del operator te resultará familiar. Si prefieres no operar nada, el camino serverless de Artillery tiene menos piezas móviles, siempre que la prueba pueda vivir en AWS o Azure.&lt;/p&gt;
&lt;p&gt;Hay un tercer camino para los scripts de k6. &lt;a href=&quot;https://loadfocus.com/es-es/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=k6-vs-artillery&quot;&gt;LoadFocus ejecuta scripts de k6&lt;/a&gt; en su propia infraestructura en la nube desde 25 regiones, así que el script que lanzas en tu portátil se convierte en una prueba distribuida sin clúster ni cuenta de AWS. LoadFocus no ejecuta scripts de Artillery, de modo que para Artillery sus propios comandos de AWS y Azure siguen siendo la forma de escalar.&lt;/p&gt;
&lt;h2&gt;¿Adónde van los resultados?&lt;/h2&gt;
&lt;p&gt;Las dos herramientas muestran un resumen al final de cada ejecución y pueden enviar métricas a otros sistemas para paneles y alertas.&lt;/p&gt;
&lt;p&gt;Según su &lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;repositorio&lt;/a&gt;, k6 ofrece estadísticas resumidas o métricas detalladas exportadas al servicio que elijas. Artillery enumera en su &lt;a href=&quot;https://github.com/artilleryio/artillery&quot;&gt;repositorio&lt;/a&gt; más de 20 integraciones de monitorización, observabilidad y CI/CD. Las dos pueden alimentar los paneles que ya tienes. Antes de decidirte, comprueba que la salida concreta que necesitas está en la lista, porque ambas listas cambian entre versiones.&lt;/p&gt;
&lt;h2&gt;¿Cuál deberías elegir?&lt;/h2&gt;
&lt;p&gt;Elige k6 si quieres un único binario en la CI, lógica de prueba en JavaScript con control de flujo real y thresholds en el mismo archivo que la prueba. También encaja con equipos que ya usan Grafana, porque la herramienta open source y el servicio alojado comparten la misma API de scripts.&lt;/p&gt;
&lt;p&gt;Elige Artillery si tu equipo escribe Node.js a diario, si un archivo YAML corto es más fácil de revisar para el resto del equipo que un script, o si necesitas pruebas de navegador con Playwright y Socket.IO en la misma herramienta. Su escalado serverless también es el camino más corto si tu infraestructura ya vive en AWS y Kubernetes no forma parte de ella.&lt;/p&gt;
&lt;p&gt;Si aún dudas, escribe la misma prueba de humo en las dos. Veinte líneas bastan para ver cuál le resulta más fácil de leer a tu equipo en una revisión de código.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿k6 es gratis?&lt;/strong&gt;
Sí. k6 es open source con licencia AGPL-3.0 y funciona gratis en tus propias máquinas. Grafana Cloud k6 es un servicio alojado aparte, con sus propios precios.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Artillery es gratis?&lt;/strong&gt;
En su mayor parte. Casi todo Artillery tiene licencia MPL-2.0, pero algunos módulos específicos de Azure usan una licencia source-available que exige una licencia comercial para uso en producción en Azure, según el repositorio del proyecto (comprobado el 8 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿LoadFocus puede ejecutar pruebas de Artillery?&lt;/strong&gt;
No. LoadFocus ejecuta scripts de k6 y JMeter. Para escalar una prueba de Artillery más allá de una máquina, usa los comandos de Artillery para AWS Lambda, Fargate o Azure Container Instances en tu propia cuenta en la nube.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Qué herramienta consume menos recursos en el generador de carga?&lt;/strong&gt;
No lo hemos medido nosotros, así que no nombramos un ganador. El proyecto k6 dice que incluso máquinas modestas pueden simular mucho tráfico, y la comparación justa es ejecutar el mismo escenario con las dos herramientas en tu propio hardware.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-vs-k6/&quot;&gt;Gatling vs k6: ¿simulaciones en la JVM o un binario Go?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/how-to-run-a-load-test/&quot;&gt;Cómo hacer una prueba de carga: guía paso a paso&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/open-source-load-testing-tools/&quot;&gt;Herramientas de pruebas de carga open source: seis opciones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/load-testing-in-github-actions/&quot;&gt;Pruebas de carga en GitHub Actions: guía práctica&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/k6-vs-locust/&quot;&gt;k6 vs Locust: ¿scripts JavaScript o usuarios Python?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/artillery-load-testing/&quot;&gt;Pruebas de carga con Artillery: análisis de la herramienta&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Herramientas de pruebas de carga open source: seis opciones</title><link>https://loadtest.app/es/open-source-load-testing-tools/</link><guid isPermaLink="true">https://loadtest.app/es/open-source-load-testing-tools/</guid><description>Seis herramientas de pruebas de carga open source analizadas: JMeter, k6, Gatling, Locust, Artillery y Vegeta, sus puntos fuertes y cuándo elegir otra.</description><pubDate>Thu, 08 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p data-disclosure=&quot;feed&quot;&gt;Aviso: loadtest.app lo publica LoadFocus, que vende un servicio de pruebas de carga que aparece en este artículo.&lt;/p&gt;&lt;p&gt;Seis herramientas de pruebas de carga open source muy usadas hoy son Apache JMeter, k6, Gatling, Locust, Artillery y Vegeta. Elige según el lenguaje en el que tu equipo escribe las pruebas y según cómo necesites escalar: JMeter para la mayor cobertura de protocolos, k6 o Artillery para JavaScript, Gatling para la JVM, Locust para Python y Vegeta para comprobaciones HTTP rápidas a ritmo fijo.&lt;/p&gt;
&lt;p&gt;Para este artículo no hemos comparado estas herramientas entre sí con benchmarks. Los datos salen del repositorio y la documentación de cada proyecto, comprobados el 8 de octubre de 2026, y las notas de «Ideal para» son nuestra opinión.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Herramienta&lt;/th&gt;
&lt;th&gt;Licencia&lt;/th&gt;
&lt;th&gt;Pruebas escritas en&lt;/th&gt;
&lt;th&gt;Se ejecuta en&lt;/th&gt;
&lt;th&gt;Repartir la carga entre máquinas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;Apache JMeter&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;td&gt;Planes de prueba creados en una interfaz gráfica&lt;/td&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;Modo remoto (cliente-servidor) integrado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;k6&lt;/td&gt;
&lt;td&gt;AGPL-3.0&lt;/td&gt;
&lt;td&gt;JavaScript&lt;/td&gt;
&lt;td&gt;Un binario de Go&lt;/td&gt;
&lt;td&gt;k6-operator en Kubernetes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gatling&lt;/td&gt;
&lt;td&gt;Apache 2.0 (algunos componentes con licencia enterprise)&lt;/td&gt;
&lt;td&gt;Java, Kotlin, Scala, JavaScript, TypeScript&lt;/td&gt;
&lt;td&gt;JVM&lt;/td&gt;
&lt;td&gt;Edición Enterprise comercial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Locust&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Integrado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Artillery&lt;/td&gt;
&lt;td&gt;MPL-2.0 (algunos módulos de Azure con BSL)&lt;/td&gt;
&lt;td&gt;YAML, JavaScript, TypeScript&lt;/td&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;AWS Lambda, Fargate o Azure ACI desde la CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vegeta&lt;/td&gt;
&lt;td&gt;MIT&lt;/td&gt;
&lt;td&gt;Línea de comandos o código Go&lt;/td&gt;
&lt;td&gt;Un binario de Go&lt;/td&gt;
&lt;td&gt;Lanzar varias instancias&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;¿Sigue mereciendo la pena Apache JMeter?&lt;/h2&gt;
&lt;p&gt;Sí, sobre todo si necesitas protocolos más allá de HTTP. JMeter cubre el abanico más amplio de las seis y tiene detrás el mayor volumen de planes de prueba y conocimiento.&lt;/p&gt;
&lt;p&gt;JMeter es una aplicación Java con licencia Apache 2.0. Su &lt;a href=&quot;https://github.com/apache/jmeter&quot;&gt;lista de protocolos&lt;/a&gt; incluye HTTP y HTTPS, servicios web SOAP y REST, FTP, bases de datos mediante JDBC, LDAP, mensajería JMS, correo y TCP sin más. Los planes de prueba se crean en una interfaz gráfica de escritorio, las pruebas reales se lanzan sin interfaz desde la línea de comandos y el modo remoto cliente-servidor reparte una prueba entre varias máquinas.&lt;/p&gt;
&lt;p&gt;Ideal para sistemas con varios protocolos, equipos que ya tienen planes de JMeter y testers que prefieren construir las pruebas de forma visual. Elige otra cosa si tu equipo quiere pruebas como código puro, revisadas igual que la aplicación, porque los planes XML creados en una interfaz gráfica son difíciles de leer en una pull request.&lt;/p&gt;
&lt;h2&gt;¿Cuándo es k6 la opción adecuada?&lt;/h2&gt;
&lt;p&gt;Cuando tu equipo escribe JavaScript y quiere pruebas en código con umbrales de éxito integrados. Se distribuye como un único binario de Go, lo que simplifica su configuración en la CI.&lt;/p&gt;
&lt;p&gt;k6 tiene &lt;a href=&quot;https://github.com/grafana/k6&quot;&gt;licencia AGPL-3.0&lt;/a&gt; y habla HTTP, WebSockets y gRPC, con un módulo de navegador para comprobaciones de front-end. Los thresholds convierten un objetivo, como un límite al percentil 95, en un código de salida distinto de cero para la CI. Para escalar, el &lt;a href=&quot;https://grafana.com/docs/k6/latest/testing-guides/running-distributed-tests/&quot;&gt;k6-operator&lt;/a&gt; ejecuta pruebas distribuidas en Kubernetes, y Grafana vende un servicio alojado.&lt;/p&gt;
&lt;p&gt;Ideal para desarrolladores que mantienen sus pruebas de API junto al código y para pipelines de CI. Elige otra cosa si tu equipo no quiere JavaScript o si la licencia AGPL no encaja con cómo integras o distribuyes la herramienta. La comparamos a fondo en &lt;a href=&quot;https://loadtest.app/es/k6-vs-artillery/&quot;&gt;k6 vs Artillery&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;¿Para quién es Gatling?&lt;/h2&gt;
&lt;p&gt;Para equipos en la JVM que quieren pruebas como código y un informe HTML detallado sin añadir nada. También ofrece un SDK de JavaScript y TypeScript sobre el mismo motor.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/gatling/gatling&quot;&gt;Gatling&lt;/a&gt; ejecuta los usuarios virtuales sobre un motor no bloqueante construido con Netty, así que una sola máquina puede generar mucha carga. Las simulaciones se escriben en Java, Kotlin, Scala, JavaScript o TypeScript y se ejecutan con plugins de Maven, Gradle, sbt o npm. La edición comunitaria tiene licencia Apache 2.0 y cubre HTTP/1.1, HTTP/2, WebSocket, Server-Sent Events y JMS, mientras que sus componentes de gRPC, MQTT y GraphQL usan la licencia enterprise de Gatling.&lt;/p&gt;
&lt;p&gt;Ideal para equipos de Java y Scala, y para quien quiera informes completos sin herramientas extra. Elige otra cosa si necesitas repartir la carga entre máquinas solo con la edición open source: generar carga desde infraestructura gestionada o privada es la función de Gatling Enterprise, la edición comercial.&lt;/p&gt;
&lt;h2&gt;¿Es Locust una buena opción para equipos de Python?&lt;/h2&gt;
&lt;p&gt;Sí. Las pruebas de Locust son Python puro, así que bucles, condiciones y cualquier biblioteca de Python funcionan como en código normal.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/locustio/locust&quot;&gt;Locust&lt;/a&gt; tiene licencia MIT y funciona por eventos con gevent, lo que permite a un solo proceso atender a muchos usuarios. Las pruebas se lanzan desde la línea de comandos o desde una interfaz web que muestra en directo el rendimiento, los tiempos de respuesta y los errores, y Locust reparte una prueba entre varias máquinas por sí mismo. HTTP viene integrado y otros protocolos se añaden escribiendo Python.&lt;/p&gt;
&lt;p&gt;Ideal para equipos de Python, escenarios con lógica compleja y quien disfrute siguiendo una prueba en el navegador. Elige otra cosa si quieres pruebas declarativas al estilo de un archivo de configuración, o si un plugin listo para un protocolo poco común importa más que escribir uno propio.&lt;/p&gt;
&lt;h2&gt;¿Cuándo tiene sentido Artillery?&lt;/h2&gt;
&lt;p&gt;Cuando tu equipo vive en Node.js, le gustan los escenarios cortos en YAML o quiere pruebas de navegador con Playwright en la misma herramienta que sus pruebas de API.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/artilleryio/artillery&quot;&gt;Artillery&lt;/a&gt; tiene sobre todo licencia MPL-2.0, con algunos módulos de Azure bajo una licencia source-available. Trae de serie HTTP, WebSocket y Socket.IO, suma gRPC y Kinesis con &lt;a href=&quot;https://www.artillery.io/docs/reference/engines&quot;&gt;motores adicionales&lt;/a&gt;, y sus comandos &lt;code&gt;run-lambda&lt;/code&gt; y &lt;code&gt;run-fargate&lt;/code&gt; reparten una prueba entre workers de tu propia cuenta de AWS. El comando &lt;code&gt;run-aci&lt;/code&gt; hace lo mismo en Azure Container Instances, con una suscripción de pago a Artillery para algo más que una evaluación (comprobado el 9 de octubre de 2026).&lt;/p&gt;
&lt;p&gt;Ideal para equipos de Node.js, pruebas mixtas de API y navegador, y empresas que ya usan AWS. Elige otra cosa si prefieres no instalar Node.js en tus generadores de carga o si las pruebas grandes tienen que correr fuera de AWS y Azure.&lt;/p&gt;
&lt;h2&gt;¿Para qué sirve Vegeta?&lt;/h2&gt;
&lt;p&gt;Para comprobaciones HTTP rápidas a ritmo constante desde la línea de comandos. Hace una sola cosa, enviar peticiones a un ritmo fijo, y la mantiene sencilla.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/tsenart/vegeta&quot;&gt;Vegeta&lt;/a&gt; es una herramienta de Go con licencia MIT que funciona como programa de línea de comandos o como biblioteca de Go, con una CLI pensada para combinarse con otras herramientas de Unix. Como mantiene constante el ritmo de peticiones en lugar de modelar usuarios, responde mejor a preguntas como «¿qué pasa a 500 peticiones por segundo?» que a reproducir recorridos de usuario.&lt;/p&gt;
&lt;p&gt;Ideal para comprobar rápido un endpoint, hacer pruebas de capacidad a ritmo fijo y escribir scripts de shell. Elige otra cosa si necesitas recorridos de varios pasos, tiempo de reflexión o informes detallados.&lt;/p&gt;
&lt;h2&gt;¿Dónde encaja un servicio alojado como LoadFocus?&lt;/h2&gt;
&lt;p&gt;Ninguna de estas herramientas necesita un servicio alojado, pero generar una carga grande o repartida geográficamente desde tus propias máquinas da trabajo. Un servicio alojado se encarga de generar la carga y deja tus scripts como están.&lt;/p&gt;
&lt;p&gt;LoadFocus, el editor de este sitio, es uno de esos servicios. &lt;a href=&quot;https://loadfocus.com/es-es/jmeter-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=open-source-load-testing-tools&quot;&gt;Ejecuta tus planes de prueba de JMeter&lt;/a&gt; y tus &lt;a href=&quot;https://loadfocus.com/es-es/k6-load-testing?utm_source=loadtest.app&amp;amp;utm_medium=referral&amp;amp;utm_campaign=open-source-load-testing-tools&quot;&gt;scripts de k6&lt;/a&gt; desde 25 regiones en la nube. No ejecuta pruebas de Gatling, Locust, Artillery ni Vegeta, así que para esas herramientas se aplican las opciones de escalado de arriba. Grafana Cloud k6 y Gatling Enterprise son las vías alojadas de los propios fabricantes para k6 y Gatling.&lt;/p&gt;
&lt;h2&gt;¿Cómo elegir entre ellas?&lt;/h2&gt;
&lt;p&gt;Parte del lenguaje que tu equipo ya escribe y de los protocolos que tienes que probar, y luego mira cómo escala cada herramienta. Eso suele reducir seis opciones a una o dos.&lt;/p&gt;
&lt;p&gt;Después escribe la misma prueba corta con tus dos favoritas. Leerlas una al lado de la otra resuelve la mayoría de los debates más rápido que cualquier tabla de funciones, y nuestra guía &lt;a href=&quot;https://loadtest.app/es/how-to-run-a-load-test/&quot;&gt;Cómo hacer una prueba de carga&lt;/a&gt; acompaña esa primera prueba paso a paso.&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;¿Qué herramienta de pruebas de carga open source es la más fácil para empezar?&lt;/strong&gt;
Para un solo endpoint HTTP, Vegeta o k6 te dan un resultado en minutos porque cada una es un único binario. Para recorridos de varios pasos, elige la herramienta cuyo lenguaje de pruebas ya escribe tu equipo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Pueden las herramientas de pruebas de carga open source ejecutar pruebas distribuidas?&lt;/strong&gt;
Sí, por caminos distintos: JMeter tiene un modo remoto integrado, Locust se reparte entre máquinas de forma nativa, k6 usa el k6-operator en Kubernetes y Artillery usa AWS Lambda, Fargate o Azure Container Instances. En Gatling, generar carga desde infraestructura gestionada o privada forma parte de la edición comercial Enterprise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;¿Es JMeter mejor que k6?&lt;/strong&gt;
Ninguna es mejor en general. JMeter cubre más protocolos y encaja con el diseño de pruebas en interfaz gráfica, mientras que k6 encaja con desarrolladores que quieren pruebas como código JavaScript en la CI.&lt;/p&gt;
&lt;h2&gt;Lecturas relacionadas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/http-benchmarking-tools/&quot;&gt;Herramientas de benchmark HTTP: wrk, hey, oha, ab y más&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/locust-load-testing/&quot;&gt;Pruebas de carga con Locust: análisis de la herramienta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/gatling-load-testing/&quot;&gt;Pruebas de carga con Gatling: la herramienta JVM a fondo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/websocket-load-testing-tools/&quot;&gt;Herramientas de pruebas de carga WebSocket: seis opciones&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/k6-vs-artillery/&quot;&gt;k6 vs Artillery: qué herramienta de pruebas de carga elegir&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/how-to-run-a-load-test/&quot;&gt;Cómo hacer una prueba de carga: guía paso a paso&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/azure-load-testing/&quot;&gt;Azure Load Testing: análisis del servicio de Microsoft&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/artillery-load-testing/&quot;&gt;Pruebas de carga con Artillery: análisis de la herramienta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/nbomber-load-testing/&quot;&gt;Pruebas de carga con NBomber: análisis del framework .NET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/tsung-load-testing/&quot;&gt;Pruebas de carga con Tsung: la herramienta Erlang a fondo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/pgbench/&quot;&gt;pgbench: benchmark y pruebas de carga de PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://loadtest.app/es/sysbench/&quot;&gt;Cómo usar sysbench: benchmarks de CPU, disco y MySQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item></channel></rss>