{"id":12335,"date":"2022-06-02T09:34:00","date_gmt":"2022-06-02T09:34:00","guid":{"rendered":"https:\/\/cl.abstracta.us\/blog\/?p=12335"},"modified":"2022-10-05T17:00:23","modified_gmt":"2022-10-05T17:00:23","slug":"threads-virtuales-jmeter-project-loom","status":"publish","type":"post","link":"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/","title":{"rendered":"Threads Virtuales: JMeter y Project Loom"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/cl.abstracta.us\/wp-content\/uploads\/2022\/07\/threads-virtuales-jmeter-project-loom.jpeg\" alt=\"Threads Virtuales: JMeter y Project Loom - Gu\u00eda Introductoria\" class=\"wp-image-12347\" width=\"798\" height=\"532\" srcset=\"https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/threads-virtuales-jmeter-project-loom.jpeg 630w, https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/threads-virtuales-jmeter-project-loom-300x200.jpeg 300w\" sizes=\"(max-width: 798px) 100vw, 798px\" \/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"83d6\">Motivaci\u00f3n:<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>OpenJDK 19, que ser\u00e1 publicada en setiembre de 2022, incorporar\u00e1 una nueva soluci\u00f3n disruptiva: Threads Virtuales, aka Project Loom.<\/li><li>Queremos ver si es beneficioso usar Threads Virtuales en una aplicaci\u00f3n como JMeter para mejorar su rendimiento.<\/li><li>Queremos experimentar con JMeter DSL como plataforma de creaci\u00f3n de prototipos para la personalizaci\u00f3n de JMeter.<\/li><\/ul>\n\n\n\n<p id=\"5bfd\">Para explorar dicha motivaci\u00f3n, en este art\u00edculo vamos a tratar: una <strong>introducci\u00f3n general del estado actual de JMeter y otras alternativas, una visi\u00f3n general de alto nivel de Project Loom, c\u00f3mo usar JMeter DSL para implementar un thread group personalizado que use Threads Virtuales<\/strong>, y los resultados y conclusiones de nuestros experimentos como tambi\u00e9n algunas ideas a futuro.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"bf21\">Introducci\u00f3n<\/h3>\n\n\n\n<p id=\"3a93\">Desde la primera liberaci\u00f3n de&nbsp;<a href=\"https:\/\/abstracta.github.io\/jmeter-java-dsl\/\" rel=\"noreferrer noopener\" target=\"_blank\">jmeter-java-dsl<\/a>, tenemos en mente el combinar todos los beneficios de&nbsp;<a href=\"https:\/\/jmeter.apache.org\/\" rel=\"noreferrer noopener\" target=\"_blank\">JMeter&nbsp;<\/a>con los que nos proporcionan otras herramientas de testing de performance como&nbsp;<a href=\"https:\/\/gatling.io\/\" rel=\"noreferrer noopener\" target=\"_blank\">Gatling<\/a>,&nbsp;<a href=\"https:\/\/gettaurus.org\/\" rel=\"noreferrer noopener\" target=\"_blank\">Taurus<\/a>,&nbsp;<a href=\"https:\/\/k6.io\/\" rel=\"noreferrer noopener\" target=\"_blank\">k6<\/a>, etc. Satisfacer esta necesidad, que logramos comprobar luego de interactuar con la comunidad, resulta beneficioso para cualquier persona que quiera hacer pruebas de rendimiento.<\/p>\n\n\n\n<p id=\"7425\">Uno de los puntos que diferencia a JMeter de otras herramientas es su modelo de concurrencia (c\u00f3mo ejecuta peticiones en paralelo).<\/p>\n\n\n\n<p id=\"c5a5\">JMeter usa Thread Pools, que son el est\u00e1ndar en Java (y muchos otros lenguajes) para realizar procesamiento en paralelo. Pero este modelo de concurrencia presenta un inconveniente significativo: es costoso en recursos computacionales. Para cada thread de JMeter, se crea uno para Java y por cada thread de Java se usa uno del SO (Sistema Operativo).<\/p>\n\n\n\n<p id=\"900e\">Los threads del SO son relativamente pesados, comparados con algunas alternativas, tanto en memoria como en CPU (mientras realizan cambio de contexto). Tambi\u00e9n algunos SO imponen l\u00edmites en el n\u00famero de threads que se pueden crear, limitando efectivamente a JMeter.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"605\" height=\"355\" src=\"https:\/\/cl.abstracta.us\/wp-content\/uploads\/2022\/07\/threads-jmeter.png\" alt=\"\" class=\"wp-image-12336\" srcset=\"https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/threads-jmeter.png 605w, https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/threads-jmeter-300x176.png 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/figure><\/div>\n\n\n<p id=\"7e3a\">Algunas opciones para evitar esta \u201cineficiencia\u201d o limitaci\u00f3n, implican el uso de alguna biblioteca alternativa o incluso un lenguaje diferente, para usar otro mecanismo como programaci\u00f3n reactiva (como&nbsp;<a href=\"https:\/\/github.com\/ReactiveX\/RxJava\" rel=\"noreferrer noopener\" target=\"_blank\">RxJava<\/a>), modelo de actores (implementado por&nbsp;<a href=\"https:\/\/akka.io\/\" rel=\"noreferrer noopener\" target=\"_blank\">Akka<\/a>&nbsp;y usado por Gatling mediante Scala),&nbsp;<a href=\"https:\/\/kotlinlang.org\/docs\/coroutines-overview.html\" rel=\"noreferrer noopener\" target=\"_blank\">corutinas de kotlin<\/a>, etc.<\/p>\n\n\n\n<p id=\"f400\">En la mayor\u00eda de los casos, al correr una prueba de performance, no se aprecian mayores diferencias entre las diferentes alternativas, ya que en la mayor\u00eda de ellos la memoria y CPU son acaparados por otros aspectos de la herramienta (por ejemplo; variables, extracci\u00f3n de respuestas y generaci\u00f3n de pedidos para correlaci\u00f3n, serializaci\u00f3n y deserializaci\u00f3n de pedidos y respuestas, etc) y la parte lenta de la ejecuci\u00f3n est\u00e1 generalmente en el procesamiento de red o servidor.&nbsp;<a href=\"https:\/\/abstracta.us\/blog\/performance-testing\/gatling-vs-jmeter-findings\/\" rel=\"noreferrer noopener\" target=\"_blank\">Aqu\u00ed&nbsp;<\/a>vas a encontrar una comparaci\u00f3n de rendimiento entre JMeter y Gatling.<\/p>\n\n\n\n<p id=\"deff\">Pero, tambi\u00e9n existe una opci\u00f3n que no requiere de una biblioteca aparte o de un cambio de lenguaje, \u00a1bienvenidos a Project Loom!.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"511b\"><strong>Project Loom: Threads Virtuales<\/strong><\/h2>\n\n\n\n<p id=\"7f0b\">No vamos a entrar en mucho detalle sobre Project Loom, puedes aprender m\u00e1s sobre el mismo&nbsp;<a href=\"https:\/\/cr.openjdk.java.net\/~rpressler\/loom\/loom\/sol1_part1.html\" rel=\"noreferrer noopener\" target=\"_blank\">aqu\u00ed<\/a>&nbsp;o&nbsp;<a href=\"https:\/\/blogs.oracle.com\/javamagazine\/post\/java-loom-virtual-threads-platform-threads\" rel=\"noreferrer noopener\" target=\"_blank\">ac\u00e1<\/a>. Pero en esencia te permite usar threads livianos (tambi\u00e9n llamados threads virtuales) que son din\u00e1micamente asignados a threads est\u00e1ndar (tambi\u00e9n llamados threads de plataforma) de Java y a los threads del SO (m\u00faltiples threads virtuales por cada thread de plataforma).<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"630\" height=\"486\" src=\"https:\/\/cl.abstracta.us\/wp-content\/uploads\/2022\/07\/project-loom-threads-virtuales-jmeter.png\" alt=\"\" class=\"wp-image-12337\" srcset=\"https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/project-loom-threads-virtuales-jmeter.png 630w, https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/project-loom-threads-virtuales-jmeter-300x231.png 300w\" sizes=\"(max-width: 630px) 100vw, 630px\" \/><\/figure><\/div>\n\n\n<p id=\"47f8\">Esto no solo reduce el consumo de recursos permitiendo generar m\u00e1s carga desde el mismo hardware, sino que tambi\u00e9n mantiene todos los beneficios del modelo existente de threads de Java (facilidad de debugeo, conocimiento previo del modelo, soporte de herramientas, etc)<\/p>\n\n\n\n<p id=\"4e3d\">De hecho, es muy f\u00e1cil cambiar en una aplicaci\u00f3n existente Java de usar threads de plataforma a usar threads virtuales reemplazando invocaciones a&nbsp;<em>new Thread<\/em>&nbsp;por algo como Thread.ofVirtual(). No hay necesidad de cambiar operaciones de IO (entrada\/salida), locks o esperas con sleep, el equipo de OpenJDK ya se encarg\u00f3 de adaptar todos estos m\u00e9todos. Internamente un thread virtual asignado\/montado a un thread de plataforma es suspendido\/desmontado cuando una de estas operaciones es invocada, para luego ser reasignado cuando la operaci\u00f3n finaliza. Adem\u00e1s, excepciones, stacktraces, herramientas de debugeo y otras herramientas existentes funcionan sin mayores alteraciones, no necesitamos preocuparnos por callbacks, cadenas de flujo de invocaciones y observers, usar alguna biblioteca\/API espec\u00edfica para IO o concurrencia, etc.<\/p>\n\n\n\n<p id=\"e52a\">Hay art\u00edculos muy interesantes sobre el uso del Project Loom en diferentes escenarios como&nbsp;<a href=\"https:\/\/horstmann.com\/unblog\/2022-04-15\/index.html\" rel=\"noreferrer noopener\" target=\"_blank\">este experimento<\/a>&nbsp;donde usan threads virtuales en Apache Tomcat.<\/p>\n\n\n\n<p id=\"05bb\">Luego de nuestra primer liberaci\u00f3n de JMeter DSL, hicimos algunas pruebas con el Project Loom y los thread groups de JMeter, pero en ese momento la tecnolog\u00eda estaba un poco inmadura y todavia habia algunas cosas por pulir: experimentamos algunos problemas aleatorios al ejecutar pruebas y algunos comportamientos inconsistentes, pero en general los resultados iniciales que obtuvimos fueron prometedores. Adem\u00e1s, no era claro en aquel entonces cu\u00e1ndo la tecnolog\u00eda iba a estar disponible dentro de las distribuciones est\u00e1ndar de la JVM.<\/p>\n\n\n\n<p id=\"8910\">El equipo de JMeter tambi\u00e9n ha estado discutiendo algunas alternativas en el pasado. De hecho han explorado usar corutinas de Kotlin como se puede ver en&nbsp;<a href=\"https:\/\/lists.apache.org\/thread\/sbwx4qylxkxxvbg1jw37jkd8gc29t5y7\" rel=\"noreferrer noopener\" target=\"_blank\">esta cadena<\/a>.<\/p>\n\n\n\n<p id=\"db4d\">Esto ha cambiado significativamente desde entonces, ya que&nbsp;el equipo de OpenJDK <a href=\"https:\/\/twitter.com\/OpenJDK\/status\/1519749893253861376\" rel=\"noreferrer noopener\" target=\"_blank\">ha anunciado la inclusi\u00f3n<\/a> del primer preview de Project Loom en su pr\u00f3xima versi\u00f3n de la JDK, 19&nbsp;(que se espera&nbsp;<a href=\"https:\/\/www.java.com\/releases\/matrix\/\" rel=\"noreferrer noopener\" target=\"_blank\">ser liberada<\/a> en septiembre).<\/p>\n\n\n\n<p id=\"5128\">Con esto en mente, hemos decidido hacer pruebas nuevamente y publicar los resultados obtenidos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"f62f\"><strong>Experimentando con JMeter y Loom<\/strong><\/h2>\n\n\n\n<p id=\"36dd\">Para evaluar si Project Loom puede ser f\u00e1cilmente usado en JMeter y ver las diferencias con el modelo de threads existente, decidimos implementar la soluci\u00f3n m\u00e1s simple al alcance de nuestras manos: implementar un nuevo thread group con JMeter DSL que simplemente use threads virtuales en vez de los threads de plataforma, portando y adaptando parte de la l\u00f3gica de los thread groups por defecto de JMeter.<\/p>\n\n\n\n<p id=\"a39b\">Usar JMeter DSL nos permite enfocarnos en las partes de la l\u00f3gica que realmente importan y cambian e iterar sobre la implementaci\u00f3n, sin tener que preocuparnos por detalles que son requeridos para implementar plugins o modificaciones a JMeter, como detalles de interfaz gr\u00e1fica, empaquetado, etc.<\/p>\n\n\n\n<p id=\"ead6\">Antes de esto, debemos instalar la \u00faltima versi\u00f3n \u201cearly access\u201d de JDK 19. Esto lo podemos hacer de una manera muy sencilla con&nbsp;<a href=\"https:\/\/sdkman.io\/\" rel=\"noreferrer noopener\" target=\"_blank\">sdkman<\/a>&nbsp;as\u00ed:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sdk install java 19.ea.23-open<\/code><\/pre>\n\n\n\n<p class=\"has-background\" id=\"3008\" style=\"background-color:#f0f0f0\"><strong>Nota:<\/strong>&nbsp;La \u00faltima versi\u00f3n \u201cearly access\u201d de la JDK cambia frecuentemente, as\u00ed que seguramente tu tengas que cambiar la versi\u00f3n para que el comando te funcione.<\/p>\n\n\n\n<p id=\"9273\">Luego de esto creamos un proyecto Maven que implementa el nuevo thread group usando JMeter DSL como framework para extender y usar JMeter.&nbsp;<a href=\"https:\/\/github.com\/abstracta\/jmeter-loom-test\" rel=\"noreferrer noopener\" target=\"_blank\">Aqu\u00ed<\/a>&nbsp;puedes encontrar el c\u00f3digo del proyecto.<\/p>\n\n\n\n<p id=\"6853\">Si revisas el c\u00f3digo puedes ver que es bastante sencillo crear un nuevo thread group, extendiendo la clase BaseThreadGroup provista por el DSL que retorne en el m\u00e9todo buildThreadGroup una subclase de la clase AbstractThreadGroup de JMeter. En este caso simplemente copiamos la l\u00f3gica de la clase ThreadGroup de JMeter que queremos personalizar. En particular el m\u00e9todo startNewThread, que es el encargado de crear los threads, donde cambiamos esta l\u00ednea:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Thread newThread = new Thread(jmThread, jmThread.getThreadName());<\/code><\/pre>\n\n\n\n<p>Por esto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Thread newThread = Thread.ofVirtual().name(jmThread.getThreadName()).unstarted(jmThread);<\/code><\/pre>\n\n\n\n<p id=\"3f3f\">Adicionalmente tambi\u00e9n cambiamos el m\u00e9todo addNewThread, reemplazando el uso de synchronized por ReentrantLock, ya que en la actual implementaci\u00f3n de la JDK Project Loom bloquea los threads del SO cuando encuentra un bloque synchronized, en vez de suspender los threads virtuales.<\/p>\n\n\n\n<p id=\"cbeb\">No cambiamos cada ocurrencia de los bloques synchronized en JMeter (por ejemplo en ResultCollectors), para simplificar la implementaci\u00f3n y porque dichos cambios no tendr\u00edan un impacto significativo ya que estos bloques no incluyen l\u00f3gica pesada o lenta. Adem\u00e1s, no detectamos \u201cpinning\u201d de threads cuando usamos la opci\u00f3n de JVM -Djdk.tracePinnedThreads (usado para detectar threads virtuales que se encuentran bloqueados en monitores).<\/p>\n\n\n\n<p id=\"d261\">Tambi\u00e9n para simplificar y evitar mayores complejidades, el thread group implementado no tiene soporte para demoras iniciales o ramp up. Las pruebas usar\u00e1n el sampler HTTP con la implementaci\u00f3n Java para evitar tener que portar parte del manejo de threads de httpClient.<\/p>\n\n\n\n<p id=\"ef88\">Para poder compilar y correr las pruebas, ya que los threads virtuales son una funcionalidad en modo \u201cpreview\u201d, necesitamos especificar la opci\u00f3n de JVM \u2014 enable-preview.<\/p>\n\n\n\n<p id=\"ea42\">Ya que obtenemos diferentes resultados con top (que en general reporta mayor uso de CPU y RAM) que cuando usamos VisualVM y Java Flight Recorder, optamos por monitorear los recursos con top, que reporta los datos del proceso desde la perspectiva del SO, evitando cualquier potencial funcionalidad \u201cearly access\u201d que falte aun adaptar en las herramientas de la JVM.<\/p>\n\n\n\n<p><strong>El principal foco de las pruebas es evaluar si hay alguna diferencia en TPS, consumo de RAM, CPU, o resultados generales obtenidos entre threads de plataforma y threads virtuales. No vamos a experimentar con opciones de la JVM, \u201ctunear\u201d el c\u00f3digo, o entrar en demasiados detalles con limitaciones concernientes al generador de carga o servicio bajo prueba, para mantener las pruebas simples y reducir el alcance del experimento.<\/strong><\/p>\n\n\n\n<p id=\"b852\">Usaremos en cada prueba un thread group con 5 minutos de duraci\u00f3n y cada configuraci\u00f3n ser\u00e1 ejecutada 3 veces para ignorar cualquier valor at\u00edpico.<\/p>\n\n\n\n<p id=\"8482\">Ahora solo tenemos que correr las pruebas con el thread group por defecto y el nuevo thread group con diferentes cargas y ver los resultados :).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"ee56\">Resultados<\/h2>\n\n\n\n<p id=\"af25\">Vamos ahora a correr algunas pruebas experimentando con diferentes cargas y escenarios y ver cuales son las diferencias entre usar threads virtuales y de plataforma.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"d459\">Pruebas locales<\/h3>\n\n\n\n<p id=\"d64b\">Primero vamos a intentar correr pruebas desde una m\u00e1quina local (MacOS 11.5, Intel Core i7, 6 n\u00facleos de 2.5 GHz y 16GB de RAM) contra un sitio remoto en&nbsp;<a href=\"http:\/\/opencart.abstracta.us\/\" rel=\"noreferrer noopener\" target=\"_blank\">http:\/\/opencart.abstracta.us<\/a>, que es una versi\u00f3n de&nbsp;<a href=\"https:\/\/github.com\/opencart\/opencart\" rel=\"noreferrer noopener\" target=\"_blank\">OpenCart<\/a>&nbsp;hosteada por Abstracta.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"578\" height=\"203\" src=\"https:\/\/cl.abstracta.us\/wp-content\/uploads\/2022\/07\/pruebas-locales.png\" alt=\"\" class=\"wp-image-12338\" srcset=\"https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/pruebas-locales.png 578w, https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/pruebas-locales-300x105.png 300w\" sizes=\"(max-width: 578px) 100vw, 578px\" \/><\/figure><\/div>\n\n\n<p>Empezamos con este tipo de pruebas, desde local a un servicio remoto, ya que es una buena prueba en algunos casos para recolectar m\u00e9tricas de experiencia de usuario finales y es un escenario com\u00fan cuando arrancamos a hacer pruebas de performance.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"571\" height=\"994\" src=\"https:\/\/cl.abstracta.us\/wp-content\/uploads\/2022\/07\/pruebas-performance-threads-virtuales-plataforma.png\" alt=\"\" class=\"wp-image-12339\" srcset=\"https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/pruebas-performance-threads-virtuales-plataforma.png 571w, https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/pruebas-performance-threads-virtuales-plataforma-172x300.png 172w\" sizes=\"(max-width: 571px) 100vw, 571px\" \/><\/figure><\/div>\n\n\n<p id=\"e4ba\">No vamos a correr m\u00e1s pruebas locales ya que no podemos seguir comparando con threads de plataforma. Adem\u00e1s, el sistema bajo prueba est\u00e1 fallando mucho y ya identificamos una diferencia significativa entre los threads virtuales y de plataforma.<\/p>\n\n\n\n<p id=\"9c6f\">Aqu\u00ed hay una gr\u00e1fica para visualizar los datos r\u00e1pidamente:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"449\" height=\"499\" src=\"https:\/\/cl.abstracta.us\/wp-content\/uploads\/2022\/07\/resultadospruebas-performance-threads-virtuales.png\" alt=\"\" class=\"wp-image-12340\" srcset=\"https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/resultadospruebas-performance-threads-virtuales.png 449w, https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/resultadospruebas-performance-threads-virtuales-270x300.png 270w\" sizes=\"(max-width: 449px) 100vw, 449px\" \/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"2350\"><strong>Prueba de servidor a servidor<\/strong><\/h3>\n\n\n\n<p id=\"7ab5\">Ya que correr pruebas desde una m\u00e1quina local a un servidor remoto puede incluir fluctuaciones provocadas por la red o problemas de la m\u00e1quina local (otras aplicaciones compitiendo por recursos, limitaciones del SO, etc), vamos ahora a probar con dos servidores en la misma red. Adicionalmente, ya que Opencart fue bastante lento y f\u00e1cil de saturar, vamos a intentar esta vez con la p\u00e1gina de bienvenida de nginx, que deber\u00eda dar unos tiempos de respuesta realmente bajos.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"578\" height=\"203\" src=\"https:\/\/cl.abstracta.us\/wp-content\/uploads\/2022\/07\/prueba-servidor.png\" alt=\"\" class=\"wp-image-12341\" srcset=\"https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/prueba-servidor.png 578w, https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/prueba-servidor-300x105.png 300w\" sizes=\"(max-width: 578px) 100vw, 578px\" \/><\/figure><\/div>\n\n\n<p id=\"11d5\">Para estas ejecuciones vamos a usar 2 instancias de Amazon EC2 t2.medium (2 vCPUs, 4GB RAM) que se encontraran en la misma \u201cavailability zone\u201d y corriendo Amazon Linux. Para administrar esta infraestructura usamos un proyecto&nbsp;<a href=\"https:\/\/www.pulumi.com\/\" rel=\"noreferrer noopener\" target=\"_blank\">pulumi<\/a>&nbsp;que puedes encontrar en el repositorio de c\u00f3digo&nbsp;<a href=\"https:\/\/github.com\/abstracta\/jmeter-loom-test\/tree\/master\/pulumi\" rel=\"noreferrer noopener\" target=\"_blank\">aqu\u00ed<\/a>.<\/p>\n\n\n\n<p id=\"52ea\">Una de las instancias va a correr el script de pruebas JMeter y el otro va a correr nginx usando un contenedor Docker (lo que facilita el setup).<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"571\" height=\"1002\" src=\"https:\/\/cl.abstracta.us\/wp-content\/uploads\/2022\/07\/correr-script-pruebas-jmeter.png\" alt=\"\" class=\"wp-image-12342\" srcset=\"https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/correr-script-pruebas-jmeter.png 571w, https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/correr-script-pruebas-jmeter-171x300.png 171w\" sizes=\"(max-width: 571px) 100vw, 571px\" \/><\/figure><\/div>\n\n\n<p>No vamos a correr m\u00e1s pruebas ya que el servicio bajo prueba ya est\u00e1 sobrecargado y hemos identificado una diferencia importante entre threads virtuales y de plataforma.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"408\" height=\"586\" src=\"https:\/\/cl.abstracta.us\/wp-content\/uploads\/2022\/07\/resultados-prueba.png\" alt=\"\" class=\"wp-image-12343\" srcset=\"https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/resultados-prueba.png 408w, https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/resultados-prueba-209x300.png 209w\" sizes=\"(max-width: 408px) 100vw, 408px\" \/><\/figure><\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"65c4\"><strong>Prueba ficticia<\/strong><\/h3>\n\n\n\n<p id=\"0f04\">Como \u00faltima prueba vamos a correr algunas pruebas usando el&nbsp;<a href=\"https:\/\/abstracta.github.io\/jmeter-java-dsl\/guide\/#dummy-sampler\" rel=\"noreferrer noopener\" target=\"_blank\">sampler dummy<\/a>&nbsp;con 1 segundo de respuesta emulada para ver, solo por curiosidad, a cuanto llegamos sin tener una conexi\u00f3n en el medio y ver c\u00f3mo evolucionan las m\u00e9tricas m\u00e1s all\u00e1 de los 5000 virtual threads.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"336\" height=\"203\" src=\"https:\/\/cl.abstracta.us\/wp-content\/uploads\/2022\/07\/0_WjJXVbAmLbrIupZI.png\" alt=\"\" class=\"wp-image-12344\" srcset=\"https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/0_WjJXVbAmLbrIupZI.png 336w, https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/0_WjJXVbAmLbrIupZI-300x181.png 300w\" sizes=\"(max-width: 336px) 100vw, 336px\" \/><\/figure><\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"515\" height=\"630\" src=\"https:\/\/cl.abstracta.us\/wp-content\/uploads\/2022\/07\/prueba-ficticia.png\" alt=\"\" class=\"wp-image-12345\" srcset=\"https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/prueba-ficticia.png 515w, https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/prueba-ficticia-245x300.png 245w\" sizes=\"(max-width: 515px) 100vw, 515px\" \/><\/figure><\/div>\n\n\n<p>A medida que la cantidad de threads incrementa podemos ver un esperado incremento en la desviaci\u00f3n de TPS del ideal, debido a una carga mayor impuesta sobre la m\u00e1quina.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"449\" height=\"541\" src=\"https:\/\/cl.abstracta.us\/wp-content\/uploads\/2022\/07\/resultados-prueba-ficticia.png\" alt=\"\" class=\"wp-image-12346\" srcset=\"https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/resultados-prueba-ficticia.png 449w, https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/resultados-prueba-ficticia-249x300.png 249w\" sizes=\"(max-width: 449px) 100vw, 449px\" \/><\/figure><\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"bc65\">Conclusiones y pr\u00f3ximos pasos<\/h2>\n\n\n\n<p id=\"a844\">La primer conclusi\u00f3n que podemos obtener de este experimento es que&nbsp;<strong>es muy sencillo implementar nuevos elementos de JMeter y probar nuevas ideas usando JMeter DSL<\/strong>. Parece ser una buena soluci\u00f3n para prototipar ideas y luego contribuirlas al c\u00f3digo de JMeter o implementar un nuevo plugin de JMeter.<\/p>\n\n\n\n<p id=\"210d\">Con respecto a los resultados obtenidos de las pruebas, en general&nbsp;<strong>no hay demasiada diferencia en consumo de CPU o RAM para los principales escenarios usando threads virtuales y de plataforma<\/strong>. A pesar que los threads virtuales podr\u00edan ser m\u00e1s livianos que los de plataforma, esto no es nada comparado con los recursos requeridos por las variables de threads de JMeter, los \u00e1rboles de test plan de los threads de JMeter (JMeter clona un \u00e1rbol por thread), los Sample Results, etc. Hemos visto un TPS menor y consumo de CPU mayor con los threads virtuales cuando probamos servicios realmente r\u00e1pidos, pero eso puede deberse a una diferencia \u201ctemporal\u201d ya que los threads virtuales todav\u00eda tienen margen de mejora seg\u00fan las palabras del equipo de OpenJDK. Una diferencia apreciable aparece cuando usamos el sampler dummy, pero este escenario es bastante ficticio.<\/p>\n\n\n\n<p id=\"38bc\">No hay tampoco demasiada diferencia en velocidad, ya que la mayor\u00eda del tiempo es acaparado por operaciones que son mucho m\u00e1s costosas que el cambio de contexto de los threads: como networking, serializaci\u00f3n y deserializaci\u00f3n, etc.<\/p>\n\n\n\n<p><strong>La principal diferencia se puede ver cuando intentamos generar m\u00e1s concurrencia que la impuesta por los l\u00edmites del SO. Con threads virtuales el l\u00edmite en la cantidad de procesos no interfiere en las pruebas.<\/strong><\/p>\n\n\n\n<p id=\"66c7\">Algo que debes tener en cuenta a la hroa de usar threads virtuales es que son \u00f3ptimos para tareas que requieren alguna espera (IO, lock, sleep), as\u00ed que cuanto m\u00e1s procesamiento tienes en el thread, menor sentido, en t\u00e9rminos de performance, tiene transicionar a usar threads virtuales. Los puede usar para organizar mejor el trabajo paralelo o para evitar limitaciones a nivel del SO sobre la cantidad de threads, pero no deber\u00edas considerarlos como una manera de mejorar la performance de un proceso que sea computacionalmente intensivo.<\/p>\n\n\n\n<p id=\"6fe6\">Ser\u00eda interesante en el futuro evaluar y experimentar con una implementaci\u00f3n de httpClient que use threads virtuales y correr unas pruebas rehusando conexiones. Esto ayudar\u00eda a cubrir m\u00e1s casos de los que t\u00edpicamente tenemos cuando hacemos pruebas de performance que habitualmente tienen esta necesidad (rehusar conexiones). Adem\u00e1s, esto seguramente haga mejor uso de los threads virtuales, ya que habr\u00eda menos procesamiento requerido por la l\u00f3gica de conexi\u00f3n y desconexi\u00f3n (la creaci\u00f3n de de objetos asociadas a ella) y m\u00e1s de esperas por IO.<\/p>\n\n\n\n<p><strong>En tanto a Project Loom y su futuro, pensamos que los threads virtuales nos traen una nueva soluci\u00f3n a la JVM que evitan problemas asociados al uso de threads de plataforma y tambi\u00e9n los problemas asociados a las alternativas existentes hoy d\u00eda<\/strong>. Estamos ansiosos por ver c\u00f3mo esta nueva tecnolog\u00eda evoluciona, mejora y es incorporada en diferentes herramientas.<\/p>\n\n\n\n<p id=\"f2c1\">En particular, esperamos que JMeter lo integre pronto, despu\u00e9s que haya sido liberada, ya que provee una opci\u00f3n muy \u00fatil cuando estamos luchando contra las limitantes del SO.<\/p>\n\n\n\n<p id=\"cf35\">Te alentamos a que le prestes atenci\u00f3n, lo pruebes y pruebes <strong>JMeter DSL<\/strong> si todav\u00eda no lo has hecho. Y que nos des una estrella&nbsp;<a href=\"https:\/\/github.com\/abstracta\/jmeter-java-dsl\" rel=\"noreferrer noopener\" target=\"_blank\">aqu\u00ed<\/a>.<\/p>\n\n\n\n<p id=\"4e7e\">\u00bfQu\u00e9 piensas? \u00bfFueron los resultados los que esperabas? \u00bfYa conoc\u00edas Project Loom? Nos gustar\u00eda conocer tus ideas y comentarios, realmente apreciamos el intercambio.<\/p>\n\n\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-wide\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Otros contenidos relacionados<\/h3>\n\n\n\n<p><a href=\"https:\/\/cl.abstracta.us\/blog\/pruebas-performance-streaming-video-plugin-hls-jmeter\/\" target=\"_blank\" rel=\"noreferrer noopener\">C\u00f3mo ejecutar Pruebas de Performance de streaming de video con el Plugin HLS para JMeter<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/cl.abstracta.us\/blog\/metricas-clave-pruebas-performance\/\" target=\"_blank\" rel=\"noreferrer noopener\">3 m\u00e9tricas clave de Pruebas de Performance que todo tester debe conocer<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/cl.abstracta.us\/blog\/plan-pruebas-de-performance\/\" target=\"_blank\" rel=\"noreferrer noopener\">\u00bfC\u00f3mo dise\u00f1ar un Plan de Pruebas de Performance?<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/cl.abstracta.us\/blog\/jmeter-dsl-innovadora-herramienta-testing-performance\/\" target=\"_blank\" rel=\"noreferrer noopener\">JMeter DSL, una innovadora herramienta para Testing de Performance<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/cl.abstracta.us\/blog\/evento-wopr-testing-performance\/\" target=\"_blank\" rel=\"noreferrer noopener\">Prestigioso evento mundial WOPR (<em>Workshops on Performance and Reliability<\/em>) es hosteado por Abstracta en Uruguay en su 29.\u00aa edici\u00f3n<\/a><\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Abstracta Tech Talk: 8 cosas que no sab\u00edas de Performance Testing\" width=\"500\" height=\"281\" src=\"https:\/\/www.youtube.com\/embed\/MmCtgDGBmPE?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n","protected":false},"excerpt":{"rendered":"<p>Conoce el estado actual de JMeter, una visi\u00f3n general de Project Loom, c\u00f3mo usar JMeter DSL para implementar un thread group personalizado que use Threads Virtuales y conclusiones de nuestros experimentos.<\/p>\n","protected":false},"author":41,"featured_media":12363,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[57,9],"tags":[102,173,64,120],"class_list":["post-12335","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-herramientas-pruebas","category-pruebas-performance","tag-jmeter","tag-performance-testing","tag-pruebas-carga","tag-pruebas-performance"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.13 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Threads Virtuales: JMeter y Project Loom - Abstracta<\/title>\n<meta name=\"description\" content=\"Conoce el estado actual de JMeter, una visi\u00f3n general de Project Loom, c\u00f3mo usar JMeter DSL para implementar un thread group personalizado que use Threads Virtuales y conclusiones de nuestros experimentos.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Threads Virtuales: JMeter y Project Loom - Abstracta\" \/>\n<meta property=\"og:description\" content=\"Conoce el estado actual de JMeter, una visi\u00f3n general de Project Loom, c\u00f3mo usar JMeter DSL para implementar un thread group personalizado que use Threads Virtuales y conclusiones de nuestros experimentos.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog de Desarrollo de Software, Testing e Inteligencia Artificial | Abstracta\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/AbstractaChile\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-06-02T09:34:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-10-05T17:00:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/guia-introductoria-threads-virtuales-jmeter-project-loom-1024x576.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"576\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Roger Abelenda\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@AbstractaChile\" \/>\n<meta name=\"twitter:site\" content=\"@AbstractaChile\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Roger Abelenda\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/\"},\"author\":{\"name\":\"Roger Abelenda\",\"@id\":\"https:\/\/es.abstracta.us\/blog\/#\/schema\/person\/ffd201bac5699303dcbe1c0ffdd78704\"},\"headline\":\"Threads Virtuales: JMeter y Project Loom\",\"datePublished\":\"2022-06-02T09:34:00+00:00\",\"dateModified\":\"2022-10-05T17:00:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/\"},\"wordCount\":2706,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/es.abstracta.us\/blog\/#organization\"},\"keywords\":[\"JMeter\",\"Performance Testing\",\"Pruebas de Carga\",\"Pruebas de Performance\"],\"articleSection\":[\"Herramientas\",\"Pruebas de Performance\"],\"inLanguage\":\"es-CL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/\",\"url\":\"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/\",\"name\":\"Threads Virtuales: JMeter y Project Loom - Abstracta\",\"isPartOf\":{\"@id\":\"https:\/\/es.abstracta.us\/blog\/#website\"},\"datePublished\":\"2022-06-02T09:34:00+00:00\",\"dateModified\":\"2022-10-05T17:00:23+00:00\",\"description\":\"Conoce el estado actual de JMeter, una visi\u00f3n general de Project Loom, c\u00f3mo usar JMeter DSL para implementar un thread group personalizado que use Threads Virtuales y conclusiones de nuestros experimentos.\",\"breadcrumb\":{\"@id\":\"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/#breadcrumb\"},\"inLanguage\":\"es-CL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/es.abstracta.us\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Threads Virtuales: JMeter y Project Loom\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/es.abstracta.us\/blog\/#website\",\"url\":\"https:\/\/es.abstracta.us\/blog\/\",\"name\":\"Abstracta\",\"description\":\"Recursos, buenas pr\u00e1cticas, tendencias y rese\u00f1as de herramientas de desarrollo de software, testing e Inteligencia Artificial.\",\"publisher\":{\"@id\":\"https:\/\/es.abstracta.us\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/es.abstracta.us\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"es-CL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/es.abstracta.us\/blog\/#organization\",\"name\":\"Abstracta\",\"url\":\"https:\/\/es.abstracta.us\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es-CL\",\"@id\":\"https:\/\/es.abstracta.us\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/es.abstracta.us\/wp-content\/uploads\/2024\/03\/abstracta-logo.png\",\"contentUrl\":\"https:\/\/es.abstracta.us\/wp-content\/uploads\/2024\/03\/abstracta-logo.png\",\"width\":1217,\"height\":300,\"caption\":\"Abstracta\"},\"image\":{\"@id\":\"https:\/\/es.abstracta.us\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.instagram.com\/we_are_abstracta\/\",\"https:\/\/www.linkedin.com\/showcase\/abstracta-chile\/\",\"https:\/\/www.youtube.com\/channel\/UCj4dx2LZCRcgM8GzxYEKYeQ\",\"https:\/\/www.facebook.com\/AbstractaChile\/\",\"https:\/\/twitter.com\/AbstractaChile\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/es.abstracta.us\/blog\/#\/schema\/person\/ffd201bac5699303dcbe1c0ffdd78704\",\"name\":\"Roger Abelenda\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es-CL\",\"@id\":\"https:\/\/es.abstracta.us\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b27f46c8de22bb2f058eee53142daf2e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b27f46c8de22bb2f058eee53142daf2e?s=96&d=mm&r=g\",\"caption\":\"Roger Abelenda\"},\"sameAs\":[\"https:\/\/cl.abstracta.us\/\"],\"url\":\"https:\/\/es.abstracta.us\/blog\/author\/roger-abelendaabstracta-com-uy\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Threads Virtuales: JMeter y Project Loom - Abstracta","description":"Conoce el estado actual de JMeter, una visi\u00f3n general de Project Loom, c\u00f3mo usar JMeter DSL para implementar un thread group personalizado que use Threads Virtuales y conclusiones de nuestros experimentos.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/","og_locale":"es_ES","og_type":"article","og_title":"Threads Virtuales: JMeter y Project Loom - Abstracta","og_description":"Conoce el estado actual de JMeter, una visi\u00f3n general de Project Loom, c\u00f3mo usar JMeter DSL para implementar un thread group personalizado que use Threads Virtuales y conclusiones de nuestros experimentos.","og_url":"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/","og_site_name":"Blog de Desarrollo de Software, Testing e Inteligencia Artificial | Abstracta","article_publisher":"https:\/\/www.facebook.com\/AbstractaChile\/","article_published_time":"2022-06-02T09:34:00+00:00","article_modified_time":"2022-10-05T17:00:23+00:00","og_image":[{"width":1024,"height":576,"url":"https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/guia-introductoria-threads-virtuales-jmeter-project-loom-1024x576.png","type":"image\/png"}],"author":"Roger Abelenda","twitter_card":"summary_large_image","twitter_creator":"@AbstractaChile","twitter_site":"@AbstractaChile","twitter_misc":{"Written by":"Roger Abelenda","Est. reading time":"14 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/#article","isPartOf":{"@id":"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/"},"author":{"name":"Roger Abelenda","@id":"https:\/\/es.abstracta.us\/blog\/#\/schema\/person\/ffd201bac5699303dcbe1c0ffdd78704"},"headline":"Threads Virtuales: JMeter y Project Loom","datePublished":"2022-06-02T09:34:00+00:00","dateModified":"2022-10-05T17:00:23+00:00","mainEntityOfPage":{"@id":"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/"},"wordCount":2706,"commentCount":0,"publisher":{"@id":"https:\/\/es.abstracta.us\/blog\/#organization"},"keywords":["JMeter","Performance Testing","Pruebas de Carga","Pruebas de Performance"],"articleSection":["Herramientas","Pruebas de Performance"],"inLanguage":"es-CL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/","url":"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/","name":"Threads Virtuales: JMeter y Project Loom - Abstracta","isPartOf":{"@id":"https:\/\/es.abstracta.us\/blog\/#website"},"datePublished":"2022-06-02T09:34:00+00:00","dateModified":"2022-10-05T17:00:23+00:00","description":"Conoce el estado actual de JMeter, una visi\u00f3n general de Project Loom, c\u00f3mo usar JMeter DSL para implementar un thread group personalizado que use Threads Virtuales y conclusiones de nuestros experimentos.","breadcrumb":{"@id":"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/#breadcrumb"},"inLanguage":"es-CL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/es.abstracta.us\/blog\/threads-virtuales-jmeter-project-loom\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/es.abstracta.us\/blog\/"},{"@type":"ListItem","position":2,"name":"Threads Virtuales: JMeter y Project Loom"}]},{"@type":"WebSite","@id":"https:\/\/es.abstracta.us\/blog\/#website","url":"https:\/\/es.abstracta.us\/blog\/","name":"Abstracta","description":"Recursos, buenas pr\u00e1cticas, tendencias y rese\u00f1as de herramientas de desarrollo de software, testing e Inteligencia Artificial.","publisher":{"@id":"https:\/\/es.abstracta.us\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/es.abstracta.us\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"es-CL"},{"@type":"Organization","@id":"https:\/\/es.abstracta.us\/blog\/#organization","name":"Abstracta","url":"https:\/\/es.abstracta.us\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es-CL","@id":"https:\/\/es.abstracta.us\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/es.abstracta.us\/wp-content\/uploads\/2024\/03\/abstracta-logo.png","contentUrl":"https:\/\/es.abstracta.us\/wp-content\/uploads\/2024\/03\/abstracta-logo.png","width":1217,"height":300,"caption":"Abstracta"},"image":{"@id":"https:\/\/es.abstracta.us\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.instagram.com\/we_are_abstracta\/","https:\/\/www.linkedin.com\/showcase\/abstracta-chile\/","https:\/\/www.youtube.com\/channel\/UCj4dx2LZCRcgM8GzxYEKYeQ","https:\/\/www.facebook.com\/AbstractaChile\/","https:\/\/twitter.com\/AbstractaChile"]},{"@type":"Person","@id":"https:\/\/es.abstracta.us\/blog\/#\/schema\/person\/ffd201bac5699303dcbe1c0ffdd78704","name":"Roger Abelenda","image":{"@type":"ImageObject","inLanguage":"es-CL","@id":"https:\/\/es.abstracta.us\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/b27f46c8de22bb2f058eee53142daf2e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b27f46c8de22bb2f058eee53142daf2e?s=96&d=mm&r=g","caption":"Roger Abelenda"},"sameAs":["https:\/\/cl.abstracta.us\/"],"url":"https:\/\/es.abstracta.us\/blog\/author\/roger-abelendaabstracta-com-uy\/"}]}},"jetpack_featured_media_url":"https:\/\/es.abstracta.us\/wp-content\/uploads\/2022\/07\/guia-introductoria-threads-virtuales-jmeter-project-loom.png","_links":{"self":[{"href":"https:\/\/es.abstracta.us\/blog\/wp-json\/wp\/v2\/posts\/12335"}],"collection":[{"href":"https:\/\/es.abstracta.us\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/es.abstracta.us\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/es.abstracta.us\/blog\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/es.abstracta.us\/blog\/wp-json\/wp\/v2\/comments?post=12335"}],"version-history":[{"count":15,"href":"https:\/\/es.abstracta.us\/blog\/wp-json\/wp\/v2\/posts\/12335\/revisions"}],"predecessor-version":[{"id":13313,"href":"https:\/\/es.abstracta.us\/blog\/wp-json\/wp\/v2\/posts\/12335\/revisions\/13313"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/es.abstracta.us\/blog\/wp-json\/wp\/v2\/media\/12363"}],"wp:attachment":[{"href":"https:\/\/es.abstracta.us\/blog\/wp-json\/wp\/v2\/media?parent=12335"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/es.abstracta.us\/blog\/wp-json\/wp\/v2\/categories?post=12335"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/es.abstracta.us\/blog\/wp-json\/wp\/v2\/tags?post=12335"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}