Sobre httperf y las pruebas de carga
Andaba yo viendo esta mañana el screencast de Peepcode Benchmarking with httperf bastante emocionado (ya que la fama precede a estos screencasts) para ver cómo podía mejorar las pruebas de rendimiento que estoy haciendo contra una aplicación Rails que he instalado en mi recién adquirido Slicehost.
La situación es la siguiente: es una cuenta Slicehost de 256Mb de memoria, en el que tú instalas lo que quieres. El problema es que debes de instalar un servidor web, los servidores de aplicaciones y la base de datos, y todos ellos han de luchar por esos 256Mb. Así que al final me he decidido por instalar esto:
- servidor web: Nginx, que tenía ganas de probarlo tras leer a uno de los sysadmins decir que Nginx era lo más estable que había visto nunca, y que recomendaba usar Apache sólo en el caso de querer que un mismo servidor web compartiera diferentes aplicaciones y en distintos lenguajes (PHP y Rails, por ejemplo). Además, su uso de memoria es ridículo.
- servidor de aplicaciones: Mongrel. Considerando los 60Mb que viene a consumir un Mongrel de memoria, el número de Mongrels en el clúster lo he establecido a 3.
- servidor de base de datos: MySQL. No había otra opción.
Además de todo esto, hay un servidor Memcached de 32Mb para guardar las sesiones.
Y claro, quería hacer pruebas de carga contra el stack completo para ver de rendimiento qué tal.
Las pruebas se han realizado contra una página sin caché y con bastantes consultas a la base de datos, cuyo tiempo de respuesta medio es de 0.005 segundos o lo que es lo mismo, unas 20 req/s.
El screencast
El screencast se queda algo corto en cuanto a uso de la herramienta httperf, ya que el autor pierde mucho tiempo explicando conceptos teóricos y muy básicos de Estadística: media y desviación estándar, así como cómo mostrar luego los resultados a través de gráficas (unas muy bonitas generadas con gruff).
Posteriormente las pruebas las realiza contra un único Mongrel, explicando con todo detalle:
- la importancia de utilizar datos reales: la muestra debe de ser representativa para que los resultados lo sean
- la importancia de obtener muchas muestras: cuantas más muestras, la media y la varianza son más significativas también
- la importancia de anotar todos los resultados
- la importancia de la interpretación de los mismos en función de los resultados obtenidos y entender qué significan
Las pruebas las realiza para comparar el rendimiento de su aplicación sin usar caché, utilizando caché de acción y utilizando caché de página. Así que establece el baseline en los resultados obtenidos sin utilizar caché y a partir de los obtenidos utilizando caché establece porcentajes de mejora.
Otros aspectos a tener en cuenta
Hay otras muchas situaciones en las que es recomendable hacer pruebas de rendimiento contra tu propia aplicación:
- calcular el número de Mongrels a lanzar en el servidor de aplicaciones. Una buena explicación (aunque breve también), la da Zed en la página de Mongrel: How many Mongrels
- comparar el rendimiento entre distintos sistemas de almacenamiento de sesiones
- comparar distintos algoritmos de balanceo en el módulo de proxy
- determinar el tope máximo de ficheros servidos a través de una unidad NFS
- ...
En estos casos es posible que nos interese conocer algún parámetro más de httperf que los que se han explicado en el vídeo:
--rate: determinar el número de peticiones concurrentes lanzadas en un segundo--wsess: determina cada cuántas peticiones se inicia una nueva sesión
Y además, si vais a hacer pruebas de carga, hay que tener en cuenta estas perogrulladas, que a veces no lo son tanto:
- el número de Mongrels en el clúster
- la conexión: ¡no hagas las pruebas con un ADSL! En mi caso he pasado de 30 req/s a más de 50 req/s sólo por lanzar las pruebas desde una máquina con una conexión decente
- testea el stack entero: sobre todo porque es interesante ver si hay problemas de conectividad entre una capa (web) y la otra (aplicación), o si el proxy que reparte la carga está mal configurado, etcétera
