#!/bin/bash ################################################################################ # bench.sh - Hace mediciones de rendimiento de cualquier URL que se le pase # v0.1 r0sk 07.11.2011 # # FIXME: Como se pasa el html a minúsculas para parsear las jpg|gif|png, al # hacer las peticiones de esos archivos para saber cuanto pesan falla # porque no están en mayúsculas. # FIXME: No se muestran las imágenes en CSS, solamente se muestran las html # FIXME: Comprobar el funcionamiento con subdominios, creo que el "sed" que # calcula el domainmane falla con subdominios y a la hora de agregar esa # misma variable a CSS/JS internos lo mismo. # FIXME: El cuenteo de JS/CSS/IMG no se corresponde con el número de elementos # listados al final. # FIXME: Comprobar los MySQL de los elementos, que no hace INSERT no sé por qué. ################################################################################ # ------------------------------------------------------------------------------ # Required software # ------------------------------------------------------------------------------ AB=`which ab` CURL=`which curl` WGET=`which wget` MYSQL=`which mysql` # ------------------------------------------------------------------------------ # Config # ------------------------------------------------------------------------------ DO_MYSQL=1 MYSQL_HOST="localhost" MYSQL_USER="root" MYSQL_PASS="*************" MYSQL_DDBB="bench" # ------------------------------------------------------------------------------ # go() # ------------------------------------------------------------------------------ go() { bench1; bench2; bench3; if [ ${DO_MYSQL} == 1 ]; then inserta_mysql; fi bench4; } # ------------------------------------------------------------------------------ # Bench #1: Apache Benchmark Tool (1000 requests, 30 clients). # ------------------------------------------------------------------------------ bench1() { echo -e "=== Apache Benchmarking -n100 -c10 ===" OUT=`${AB} -n100 -c10 -q -k -H 'Accept-Encoding: gzip,deflate' $URL | grep 'per second' | awk '{print "Peticiones por segundo:" $4 }'` MYSQL_BENCH1=`echo $OUT | cut -d":" -f2` echo $OUT echo -e "" } # ------------------------------------------------------------------------------ # Bench #2: Curl, time to connect, transfer and total time of the request. # ------------------------------------------------------------------------------ bench2() { echo -e "=== Tiempos de conexión ===" ${CURL} -o /dev/null -s -w " Connect: "%{time_connect}"\n Transfer: "%{time_starttransfer}"\n Total: "%{time_total}"\n" $URL MYSQL_BENCH2_T1=`${CURL} -o /dev/null -s -w %{time_connect} $URL` MYSQL_BENCH2_T2=`${CURL} -o /dev/null -s -w %{time_starttransfer} $URL` MYSQL_BENCH2_T3=`${CURL} -o /dev/null -s -w %{time_total} $URL` echo -e "" } # ------------------------------------------------------------------------------ # Bench #3: Wget plain and gzipped pettition. # ------------------------------------------------------------------------------ bench3() { echo -e "=== Plano y gzip ===" ${WGET} -q -O plano $URL ${WGET} -q -O gzip --header="Accept-Encoding: gzip" $URL du -h plano gzip MYSQL_BENCH3_PLANO=`du -h plano | cut -d"K" -f1` MYSQL_BENCH3_GZIP=`du -h gzip | cut -d"K" -f1` rm plano gzip echo -e "" } # ------------------------------------------------------------------------------ # Bench #4: Nº of javascript and css files # ------------------------------------------------------------------------------ bench4() { echo -e "=== Javascript/CSS info ===" ${WGET} -q -O plano $URL cat plano | awk '{print tolower($0)}' | sed s/src/\\nsrc/g | sed s/href/\\nhref/g | sed s/\'/\"/g > plano2 JS=`cat plano2 | grep -P "src=[^*]*\.js" | awk -F 'src="' '{ print $2 }' | awk -F '"' '{ print $1 }' | sort | uniq` CSS=`cat plano2 | grep -P "href=[^*]*\.css" | awk -F 'href="' '{ print $2 }' | awk -F '"' '{ print $1 }' | sort | uniq` IMG=`cat plano2 | grep -P "src=[^*]*\.(jpg|gif|png)" | awk -F 'src="' '{ print $2 }' | awk -F '"' '{ print $1 }' | sort | uniq` NUMJS=`cat plano2 | grep -P "src=[^*]*\.js" | sort | uniq | wc -l` NUMCSS=`cat plano2 | grep -P "href=[^*]*\.css" | sort | uniq | wc -l` NUMIMG=`cat plano2 | grep -P "src=[^*]*\.(jpg|gif|png)" | sort | uniq | wc -l` TIPO=1 echo "JS: ${NUMJS} file(s)" for i in ${JS}; do if echo ${i} | grep -q "${DOMAIN}"; then TAMANO=`${CURL} -sI $i | awk '/Content-Length/ { print $2 }'` TAMANO=`echo ${TAMANO} | sed 's/.$//'` TIEMPO=`${CURL} -o /dev/null -s -w %{time_total} $i` ORIGEN='int' echo " (${ORIGEN})" $i ${TIEMPO} ${TAMANO}; else if [[ $i == http* ]]; then TAMANO=`${CURL} -sI $i | awk '/Content-Length/ { print $2 }'` TAMANO=`echo ${TAMANO} | sed 's/.$//'` TIEMPO=`${CURL} -o /dev/null -s -w %{time_total} $i` ORIGEN='ext' echo " (${ORIGEN})" $i ${TIEMPO} ${TAMANO}; else TAMANO=`${CURL} -sI http://${DOMAIN}/$i | awk '/Content-Length/ { print $2 }'` TAMANO=`echo ${TAMANO} | sed 's/.$//'` TIEMPO=`${CURL} -o /dev/null -s -w %{time_total} http://${DOMAIN}/$i` ORIGEN='int' $i="http://${DOMAIN}/$i" echo " (${ORIGEN}) $i" ${TIEMPO} ${TAMANO} fi fi if [ ${DO_MYSQL} == 1 ]; then echo "INSERT INTO elemento VALUES (NULL, '${LASTID}', '${i}', ${TIPO}, REPLACE('${TAMANO}',',','.'), REPLACE('${TIEMPO}',',','.'),'${ORIGEN}'));" ${MYSQL} -u${MYSQL_USER} -p${MYSQL_PASS} -h${MYSQL_HOST} ${MYSQL_DDBB} -e "INSERT INTO elemento VALUES (NULL, '${LASTID}', '${i}', ${TIPO}, REPLACE('${TAMANO}',',','.'), REPLACE('${TIEMPO}',',','.'),'${ORIGEN}'));" fi done echo -e "" TIPO=2 echo "CSS: ${NUMCSS} file(s)" for i in ${CSS}; do if echo ${i} | grep -q "${DOMAIN}"; then TAMANO=`${CURL} -sI $i | grep Content-Length | cut -d ' ' -f 2` TAMANO=`echo ${TAMANO} | sed 's/.$//'` TIEMPO=`${CURL} -o /dev/null -s -w %{time_total} $i` ORIGEN='int' echo " (${ORIGEN})" $i ${TIEMPO} ${TAMANO}; else if [[ $i == http* ]]; then TAMANO=`${CURL} -sI $i | grep Content-Length | cut -d ' ' -f 2` TAMANO=`echo ${TAMANO} | sed 's/.$//'` TIEMPO=`${CURL} -o /dev/null -s -w %{time_total} $i` ORIGEN='ext' echo " (${ORIGEN})" $i ${TIEMPO} ${TAMANO}; else TAMANO=`${CURL} -sI http://${DOMAIN}/$i | grep Content-Length | cut -d ' ' -f 2` TAMANO=`echo ${TAMANO} | sed 's/.$//'` TIEMPO=`${CURL} -o /dev/null -s -w %{time_total} http://${DOMAIN}/$i` ORIGEN='int' $i="http://${DOMAIN}/$i" echo " (${ORIGEN}) $i" ${TIEMPO} ${TAMANO}; fi fi if [ ${DO_MYSQL} == 1 ]; then echo "INSERT INTO elemento VALUES (NULL, '${LASTID}', '${i}', ${TIPO}, REPLACE('${TAMANO}',',','.'), REPLACE('${TIEMPO}',',','.'),'${ORIGEN}'));" ${MYSQL} -u${MYSQL_USER} -p${MYSQL_PASS} -h${MYSQL_HOST} ${MYSQL_DDBB} -e "INSERT INTO elemento VALUES (NULL, '${LASTID}', '${i}', ${TIPO}, REPLACE('${TAMANO}',',','.'), REPLACE('${TIEMPO}',',','.'),'${ORIGEN}'));" fi done echo -e "" TIPO=3 echo "IMG: ${NUMIMG} file(s)" for i in ${IMG}; do if echo ${i} | grep -q "${DOMAIN}"; then TAMANO=`${CURL} -sI $i | grep Content-Length | cut -d ' ' -f 2` TAMANO=`echo ${TAMANO} | sed 's/.$//'` TIEMPO=`${CURL} -o /dev/null -s -w %{time_total} $i` ORIGEN='int' echo " (${ORIGEN})" $i ${TIEMPO} ${TAMANO}; else if [[ $i == http* ]]; then TAMANO=`${CURL} -sI $i | grep Content-Length | cut -d ' ' -f 2` TAMANO=`echo ${TAMANO} | sed 's/.$//'` TIEMPO=`${CURL} -o /dev/null -s -w %{time_total} $i` ORIGEN='ext' echo " (${ORIGEN})" $i ${TIEMPO} ${TAMANO}; else TAMANO=`${CURL} -sI http://${DOMAIN}/$i | grep Content-Length | cut -d ' ' -f 2` TAMANO=`echo ${TAMANO} | sed 's/.$//'` TIEMPO=`${CURL} -o /dev/null -s -w %{time_total} http://${DOMAIN}/$i` ORIGEN='int' $i="http://${DOMAIN}/$i" echo " (${ORIGEN}) $i" ${TIEMPO} ${TAMANO}; fi fi if [ ${DO_MYSQL} == 1 ]; then echo "INSERT INTO elemento VALUES (NULL, '${LASTID}', '${i}', ${TIPO}, REPLACE('${TAMANO}',',','.'), REPLACE('${TIEMPO}',',','.'),'${ORIGEN}'));" ${MYSQL} -u${MYSQL_USER} -p${MYSQL_PASS} -h${MYSQL_HOST} ${MYSQL_DDBB} -e "INSERT INTO elemento VALUES (NULL, '${LASTID}', '${i}', ${TIPO}, REPLACE('${TAMANO}',',','.'), REPLACE('${TIEMPO}',',','.'),'${ORIGEN}'));" fi done rm plano rm plano2 echo -e "" } # ------------------------------------------------------------------------------ # Inserta datos en el MySQL configurado # ------------------------------------------------------------------------------ inserta_mysql() { ${MYSQL} -u${MYSQL_USER} -p${MYSQL_PASS} -h${MYSQL_HOST} ${MYSQL_DDBB} -e "INSERT INTO pagina VALUES (NULL, '${URL}', '${DOMAIN}', NOW(), '${MYSQL_BENCH1}', REPLACE('${MYSQL_BENCH2_T1}',',','.'), REPLACE('${MYSQL_BENCH2_T2}',',','.'), REPLACE('${MYSQL_BENCH2_T3}',',','.'), REPLACE('${MYSQL_BENCH3_PLANO}',',','.'), REPLACE('${MYSQL_BENCH3_GZIP}',',','.'));" LASTID=`${MYSQL} -u${MYSQL_USER} -p${MYSQL_PASS} -h${MYSQL_HOST} ${MYSQL_DDBB} --batch -e "SELECT max(id) as max from pagina" | grep -v "max"` } # ------------------------------------------------------------------------------ # Ayuda del comando # ------------------------------------------------------------------------------ showHelp() { echo -e "[bench.sh] - Hace mediciones de rendimiento de cualquier URL que se le pase" echo -e "como parámetro. Está basado en ab, curl y wget. Los resultados pueden variar" echo -e "dependiendo de la latencia de red, el estado del host, etc..." echo -e "\nModo de empleo: bench.sh [OPCIONES]" echo -e "\t--url o -u http://www.domain.com/test-url/\tPetición a analizar" echo -e "\t--help o -h\t\t\t\t\tPara ver este menú de ayuda\n" echo -e "Ejemplos:" echo -e "\t $ isp.sh -u http://www.domain.com/" } # ------------------------------------------------------------------------------ # Main # ------------------------------------------------------------------------------ while [ $# -ne 0 ]; do case "$1" in --help|-h) showHelp; exit 0;; --url|-u) URL="$2"; DOMAIN=`echo ${URL} | sed -e "s/[^/]*\/\/\([^@]*@\)\?\([^:/]*\).*/\2/"`; echo -e "=== Testing ${URL} (${DOMAIN}) ===" go; exit 0;; *) shift; esac done