SafeChildren Banner

Havoc Oracle Solaris Experts

martes, 24 de noviembre de 2009

Cálculo de Rendimiento utilizando Apache JMeter - Parte 1

Instalación
En este primer post vamos a ver cómo utilizar JMeter para establecer un "Base Time Line" para nuestros cambios de configuración.

Apache JMeter es un aplicativo diseñado para obtener métricas de rendimiento de una forma automática y repetible. Ésto que parece no es muy importante, sí que lo es. Una de las cosas que debemos eliminar de nuestro vocabulario cuando empecemos a realizar pruebas de carga son: "parece que, más rápido, más lento, ..." todas estas expresiones no nos sirven ya que dependen de muchos factores, aunque el mayor problema es que son subjetivas y dependientes de una/varias personas.

JMeter nos ofrece datos "la página tarda 2,7 seg" ya no depende de si es "rápido" o "lento" son "2,7 seg", si hacemos un cambio y JMeter ofrece "2,9 seg", el cambio hace que el sistema responda más lento.

Debemos tener en cuenta que JMeter no es un navegador y por lo tanto, no va a procesar los código JavaScript, me explico, JMeter no va a procesar los document.write del código HTML. Por ejemplo, el siguiente bloque de código no será interpretado por JMeter y por lo tanto, las latencias de render no se computarán.
<script type='text/javascript'>new BannerManager('http://openads.test.com/').getBanner(106,'banner106',true,-1,false,'null');script>
<script type='text/javascript'>new BannerManager('http://openads.test.com/').getBanner(107,'banner107',true,-1,false,'null');script>
  
<script type="text/javascript">
     var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
     document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
script>
Una vez aclarado el funcionamiento de JMeter, vamos a ver cómo configurar una batería de pruebas para simular el acceso a nuestras webs.

Instalación de JMeter
JMeter es una aplicación Java y necesita de JVM 1.5+ para poder ejecutarse. La instalación simplemente es descomprimir el archivo tar.gz en la ubicación que nosotros queramos ($JMETER_HOME)

Lanzar JMeter
Antes de lanzar JMeter vamos a analizar si las pruebas que vamos a llevar a cabo van a ser muy complejas, ya que si así fuera, necesitaremos ampliar la memoria asignada por defecto a JMeter.

JMeter se inicia con un tamaño máximo de memoria de 512Mb, y aunque en la mayoría de los casos es suficiente, yo suelo configurarlo para que abra con 1024Mb.

Para modificar el parámetro de memoria, simplemente incluiremos una variable de entorno llamada JVM_ARGS donde se le asignan los parámetros de la máquina virtual, por ejemplo
$ export JVM_ARGS="-server -Xms1024m -Xmx1024m"
$ jmeter.sh
También podemos editaremos el archivo $JMETER_HOME/bin/jmeter y cambiar el valor de HEAP para asignarle los valores que deseemos, en mi caso 1024m
# This is the base heap size -- you may increase or decrease it to fit your
# system's memory availablity:
HEAP="-Xms1024m -Xmx1024m"
Una vez configurado nuestro JMeter, ejecutaremos el script de arranque $JMETER_HOME/bin/jmeter.sh y se nos mostrará nuestro entorno de trabajo que se ve a continuación



Como podemos observar, JMeter nos ofrece dos categorías dentro del árbol principal
  • Plan de Pruebas
  • Banco de Trabajo
En esta primera parte, vamos a ver cómo configurar un nuevo plan de pruebas, y en la segunda parte veremos cómo podemos utilizar el Banco de Trabajo


Nota: En JMeter no existe el botón Guardar y por lo tanto, cuando hagamos un "Focus Lost" del componente éste quedará guardado.

Configurar un Nuevo Plan de Pruebas
Lo primero que debemos hacer es añadir un Grupo de Hilos, para ello seleccionaremos Plan de Pruebas y haciendo click con el botón derecho Añadir->Grupo de Hilos. Esto representará a nuestros usuarios, es decir, si queremos comprobar cómo responde nuestro aplicativo con 50 usuarios concurrentes, en la propiedad Número de Hilos deberemos poner 50.

Para establecer un Base Time Line debemos establecer el valor de Número de Hilos a 1, y Contador del Bucle a un valor superior a 1, de esta forma, podemos obtener la media de ejecución con un sólo usuario y, de esta forma, tomaremos este dato como nuestro punto de partida.
Cuanto mayor sea el valor de Contador del Bucle mejor será la precisión, ya que obtendremos más muestras y por lo tanto la media será más realista.

Ahora seleccionaremos nuestro Grupo de Hilos y con el botón derecho Añadir->Elementos de Configuración->Valores por Defecto para Petición HTTP. Esto nos permitirá incluir los valores generales de la petición como: Nombre del Servidor, Puerto, Protocolo y Encoding.

 Seleccionamos Grupo de Hilos y con el botón derecho Añadir->Muestreador->Petición HTTP y, como hemos introducido Valores por Defecto simplemente deberemos editar el valor de la propiedad Path.

Por último, introduciremos un Listener que nos proporcionará los valores de la muestra, en este primer ejemplo vamos a introducir un Árbol de Resultados, para ello, seleccionaremos Grupo de Hilos y botón derecho Añadir->Listener->Ver Árbol de Resultados

Ya sólo nos queda guardar la prueba, Archivo->Guardar Como ... y podemos ejecutarla utilizando el menú Lanzar->Arrancar y ver el resultado en Ver Árbol de Resultados.

Como podéis ver, el funcionamiento de JMeter es sencillo y la creación de planes de pruebas no es muy complicado, en cuatro clicks hemos obtenido un plan de pruebas, sin embargo la información que obtenemos con este Sencillo Plan no nos aporta mucho, vamos a ver cómo hacer un plan más realista. Podéis descargar esta prueba sencilla de JMeter HTTP

Instalar nuevo Listener

Antes de comenzar con el plan de pruebas vamos a instalar un Listener que nos mostrará de forma gráfica, y más amena, el rendimiento y tiempo de respuesta de nuestro muestreador. Para ello, debemos descargar e instalar Better JMeter Graphs, después reiniciaremos el JMeter. Una vez hecho esto, tendremos un nuevo Listener llamado Statistical Aggregate Report

Configurar un Plan de Pruebas Más "Complicado"
Al igual que hemos hecho en la Prueba Sencilla de JMeter para HTTP añadiremos un Grupo de Hilos, añadiremos también Valores por Defecto para Petición HTTP, ahora viene algún cambio, seleccionamos Grupo de Hilos y con el botón derecho Añadir->Elemento de Configuración->Gestor de Cookies HTTP.

Los usuarios no hacen siempre las mismas iteraciones, es decir, Home->Pagina1->Pagina2->Home, y por lo tanto, si queremos hacer un plan de prueba que pueda simular  a un usuario, debemos tener en cuenta esto, por ello, JMeter nos ofrece el Controlador Lógico Random Order, así que seleccionamos Grupo de Hilos y con el botón derecho del ratón Añadir->Controlador Lógico->Random Order.

Ahora vamos a introducir los muestreadores HTTP dentro de nuestro controlador lógico, para ello, seleccionamos Controlador Random Order y con botón derecho Añadir->Muestreador->Petición HTTP y aquí pondremos la primera página. Deberemos repetir este proceso para todas las páginas que queremos muestrear.

Por último, vamos a añadir nuestro Listener seleccionando Grupo de Hilos y con el botón derecho Añadir->Listener->Statistical Aggregate Report, guardamos la prueba y ejecutamos. Podéis descargar la Prueba JMeter HTTP Multiples Páginas


Conclusión
En esta primera parte hemos visto cómo movernos con JMeter y las opciones que nos aporta, además, tenemos el resultado en formato gráfico al incluir el listener alternativo.

En la siguiente parte, veremos cómo podemos crear pruebas mucho más complejas y cómo establecer valores de control en los muestreadores

Referencias

10 comentarios:

  1. Muchas gracias por este post, es muy útil.
    Tengo una duda, a ver si me puedes ayudar.
    Quiero medir con jmeter el tiempo de respuesta para n usuarios para una determinada consulta en una aplicación web. ¿Jmeter va a tener en cuenta el tiempo de renderizado? ¿y si cambio de explorador? ¿qué mide exactamente jmeter?
    Muchas gracias.

    Fernando

    ResponderEliminar
  2. Hola Fernando,

    JMeter es capaz de medir: Latencia, Tiempos de Respuestas, Tasa de Transferencia, etc. pero, como comentaba en el Blog, JMeter No es un navegador, por lo tanto, no puede calcular el tiempo de procesamiento de JavaScript, o contenido Flash.

    Por lo tanto, a tu pregunta la respuesta es No, no es capaz de calcular cuanto costará renderizar una página con un número n de usuarios. Pero, esto tampoco es problema, ya que, eso a ti no te importa hablando en temas de Sistemas, ya que ese procesamiento se hace en el lado del cliente.

    Si que podrás hacer una estimación de cuánto tiempo tarda/incrementa con un número alto de usuarios, o, si el servidor se colapsa y saltan los TimeOuts.

    Puedes, por ejemplo, incluir Asserts para medir que el tiempo de respuesta no sea superior a 1sec y luego ver el porcentaje de errores con un número pequeño de usuarios, y vas incrementando.


    Espero haberte aclarado tus dudas, si necesitas algún ejemplo, puedo ayudarte con alguno.

    Un Saludo,
    Urko

    ResponderEliminar
    Respuestas
    1. Hola amigo

      Por que dice esto
      " Por lo tanto, a tu pregunta la respuesta es No, no es capaz de calcular cuanto costará renderizar una página con un número n de usuarios. Pero, esto tampoco es problema, ya que, eso a ti no te importa hablando en temas de Sistemas, ya que ese procesamiento se hace en el lado del cliente."

      Entonces como se le explicaría esto al cliente, si es lo que el cliente necesita.

      Eliminar
  3. Muchas gracias por tu respuesta.
    Fernando.

    ResponderEliminar
  4. Hola Fernando,

    De nada, espero haberte sido de ayuda,

    Urko,

    ResponderEliminar
  5. Hola Urko,

    Que tal, me Podrías hacer un favor cuando tengas un momento de darme tu correo o usuario de skype u otro medio para resolver una duda que tengo con Jmeter y te lo agradeceré con amino de lucro :-)

    gracias

    ResponderEliminar
  6. Muy buen post espero más información sobre las diferentes herramientas de prueba de carga y cual sería la más recomendable para empezar a profundizar más en el tema.

    ResponderEliminar
  7. Hola Buen día!!

    Tengo instalado el JMeter, cuando realizo pruebas de mil Hilos, me marca error de memoria, e configurado la herramienta hasta "set HEAP=-Xms1536m -Xmx1536m" y "set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m", cuento con una PC Inter Core i5-2400S @ 2.50Ghz con $ Gb en ram Windows7 32 bits.

    Que más puedo configurar para la operación correcta y me deje de presentar este problema la herramienta?

    ResponderEliminar
    Respuestas
    1. Buenos días,

      Tengo instalado el JMeter para trabajar con MyEclipse y a la hora de hacerle el testeo me da los siguientes errores:









      ya me estoy volviendo loco de mirar por todos lados y nadie es capaz de darme una solucion.

      Podrías ayudarme?, muchas gracias

      Eliminar
  8. Buenos días,

    Tengo instalado el JMeter para trabajar con MyEclipse y a la hora de hacerle el testeo me da los siguientes errores:


    HTTP Request HTTPClient” rc=”Non HTTP response code: java.net.ConnectException”
    Non HTTP response message: Connection refused: connect

    Non HTTP response code: java.io.EOFException
    Non HTTP response message: Unexpected end of ZLIB input stream

    ya me estoy volviendo loco de mirar por todos lados y nadie es capaz de darme una solucion.

    ResponderEliminar