Pruebas de Stress en Apps Rails

Written on February 13th, 2008
.

Muchas veces cuando estas en las fases de pruebas, y cuando tu aplicación se supone que va a soportar grandes flujos de peticiones, querrías testear la misma antes de ponerla en producción.

Como es lógico, estas pruebas sería materialmente imposible hacerlas uno mismo, ya que seríamos incapaces manualmente de generar suficientes peticiones como para saber los límites de rendimiento de nuestros proyectos.
Para esto hay utilidades que ya no solo podemos testear aplicaciones con Rails, si no también cualquier aplicación web escrita en el lenguaje de tu elección.

Aplicaciones de stress

Entonces, desechada la opción de enviarle un mail a todos tus familiares y conocidos para que prueben la app. Vamos a echar un ojo al mundo del software libre para ver los recursos que nos brinda:

JMeter

JMeter aunque un tanto engorroso de configurar, es un gran aliado. Después de trabajar un poco con el se entiende bastante bien y se llega a aprovechar mucho su uso. Además permite trabajar como proxy HTTP para capturar las solicitudes y repetirlas

ab – Apache HTTP server benchmarking tool

ab permite realizar múltiples peticiones GET o POST contra un servidor. Las peticiones las podemos hacer en modo secuencial o, como a nosotros nos interesa en esta ocasión, de modo concurrente, de la misma forma que podemos hacer que las peticiones sean independientes o de forma que esten en la misma sesión.

httperf

Este proyecto tiene muchas opciones para “machacar” a los servidores, donde puedes simular “ráfagas” de “usuarios” conectados de forma concurrente, simula muy bien las sesiones al estilo de los navegadores HTTP actuales.

Además las estadísticas que reporta son muy completas, donde podemos ver porcentaje de uso de CPU, tiempos de respuesta y muchas más cosas.

Autobench

Esta es una abstracción de httpref, no es más que un script escrito en Perl para automatizar la medición del comportamiento. Es básicamente incrementar el número de peticiones o nivel de concurrencia conforme pase el tiempo y analizar cambios bruscos en las peticiones.
El nivel de detalle de este llega al punto de crear gráficas, geniales para su mejor lectura.

En todos los casos tienes que buscarte un poco la vida y trabajar un poco el * –help, ya que la documentación es mas bien escasa, yo empezaría por estudiarte la RFC2616 – HTTP/1.1 Specification.

En definitiva, y bajo mi punto de vista Autobench está muy bien por la utilidad de las gráficas, y para todo lo demás httperf se comporta muy bien.

Benchmarks de Ruby 1.9

Written on December 27th, 2007
.

Logo RubyRecientemente ha salido Ruby on Rails versión 2 que todavía estoy estudiando para llevar a cabo un review. Pero ahora mismo voy a mostrar unos pequeños benchmarks de Ruby 1.9, versión recién salida del horno, y que por lo que parece los se va acercando a lenguajes más “enterprise”.

Pero vayamos al meollo de la cuestión, inicialmente había pensado en crearme alguna función que cargue el sistema de procesos pero como soy un Vago Bueno™, he deducido que el Makefile del intérprete de Ruby tenía que tener algún sistema de benchmark.

Descargaremos la nueva versión 1.9.0 y compilaremos como siempre ./configure && make && make test && make install. Así que lanzaremos lo siguiente:

make benchmark

Esta tarea detectará tu versión anterior y ejecutará un elevado número de pruebas comparando la versión recién compilada con la antigua, he aquí un ejemplo que se lleva a cabo.

vm1_rescue

i=0
while i<30000000 # while loop 1
  i+=1
  begin
  rescue
  end
end

ruby 1.8.6 (2007-09-24) [universal-darwin9.0]    11.3471548557281
ruby 1.9.0 (2007-12-25 revision 14709) [i686-darwin9.1.0]    1.78452610969543

La mejora es evidente, también es verdad que en algunos casos la mejora no es tan sustancial y en otras contadas ocasiones incluso empeora la anterior marca de tiempo. Si queréis ver el reporte completo de mis pruebas os dejo aquí el archivo Benchmarks de Ruby 1.9

Para aquel que esta más interesado en hacer benchmarks de sus scripts, es bueno utilizar la clase Benchmark, que da muchísimas facilidades para llevar a cabo pruebas de forma muy rápida.

Ahora solo falta que el amado/odiado ActionPack de Ruby on Rails soporte MultiThreading para que volemos. Aunque me está gustando el proyecto Merb, que a costa de perder alguna mágia este si que es multithread y ya no corre… vuela.

Por cierto que si estás interesado en benchmarks más generales y más fidedignos pasate por esta review.