################################################################################
# bench.sh - Hace mediciones de rendimiento de cualquier URL que se le pase
# 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.
# Estructura de la base de datos:
# CREATE TABLE IF NOT EXISTS `elemento` (
# `id` int(11) NOT NULL AUTO_INCREMENT,
# `id_pagina` int(11) NOT NULL,
# `url` varchar(127) NOT NULL,
# `tipo` tinyint(4) NOT NULL COMMENT '1=js, 2=css, 3=img',
# `tamano` decimal(10,2) NOT NULL,
# `tiempo` decimal(10,2) NOT NULL,
# `origen` varchar(3) NOT NULL,
# CREATE TABLE IF NOT EXISTS `pagina` (
# `id` int(11) NOT NULL AUTO_INCREMENT,
# `url` varchar(127) NOT NULL,
# `dominio` varchar(30) NOT NULL,
# `fecha` datetime NOT NULL,
# `rps` decimal(10,4) NOT NULL,
# `tiempo_conexion` decimal(10,4) NOT NULL,
# `tiempo_transferencia` decimal(10,4) NOT NULL,
# `tiempo_total` decimal(10,4) NOT NULL,
# `tamano_plano` decimal(10,4) NOT NULL,
# `tamano_gzip` decimal(10,4) NOT NULL,
################################################################################
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
MYSQL_PASS="*****************"
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
if [ ${DO_MYSQL} == 1 ]; then
# ------------------------------------------------------------------------------
# Bench #1: Apache Benchmark Tool (1000 requests, 30 clients).
# ------------------------------------------------------------------------------
echo -e "=== Apache Benchmarking -n100 -c10 ==="
OUT=`${AB} -n100 -c5 -q -k -H 'Accept-Encoding: gzip,deflate' $URL | grep 'per second' | awk '{print "Peticiones por segundo:" $4 }'`
MYSQL_BENCH1=`echo $OUT | cut -d":" -f2`
# ------------------------------------------------------------------------------
# Bench #2: Curl, time to connect, transfer and total time of the request.
# ------------------------------------------------------------------------------
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`
# ------------------------------------------------------------------------------
# Bench #3: Wget plain and gzipped pettition.
# ------------------------------------------------------------------------------
echo -e "=== Plano y gzip ==="
${WGET} -q -O gzip --header="Accept-Encoding: gzip" $URL
MYSQL_BENCH3_PLANO=`du -h plano | cut -d"K" -f1`
MYSQL_BENCH3_GZIP=`du -h gzip | cut -d"K" -f1`
# ------------------------------------------------------------------------------
# Bench #4: Nº of javascript and css files
# ------------------------------------------------------------------------------
echo -e "=== Javascript/CSS info ==="
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" | awk -F 'src="' '{ print $2 }' | awk -F '"' '{ print $1 }' | sort | uniq | wc -l`
NUMCSS=`cat plano2 | grep -P "href=[^*]*\.css" | awk -F 'href="' '{ print $2 }' | awk -F '"' '{ print $1 }' | sort | uniq | wc -l`
NUMIMG=`cat plano2 | grep -P "src=[^*]*\.(jpg|gif|png)" | awk -F 'src="' '{ print $2 }' | awk -F '"' '{ print $1 }' | sort | uniq | wc -l`
NUMJS2=`cat plano2 | grep -P "src=[^*]*\.js" | awk -F 'src="' '{ print $2 }' | awk -F '"' '{ print $1 }' | wc -l`
NUMCSS2=`cat plano2 | grep -P "href=[^*]*\.css" | awk -F 'href="' '{ print $2 }' | awk -F '"' '{ print $1 }' | wc -l`
NUMIMG2=`cat plano2 | grep -P "src=[^*]*\.(jpg|gif|png)" | awk -F 'src="' '{ print $2 }' | awk -F '"' '{ print $1 }' | wc -l`
echo "JS: ${NUMJS2} file(s)"
echo "JS: ${NUMJS} file(s)"
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`
echo " (${ORIGEN})" $i ${TIEMPO} ${TAMANO};
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`
echo " (${ORIGEN})" $i ${TIEMPO} ${TAMANO};
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`
echo " (${ORIGEN}) $i" ${TIEMPO} ${TAMANO}
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}');"
echo "CSS: ${NUMCSS2} file(s)"
echo "CSS: ${NUMCSS} file(s)"
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`
echo " (${ORIGEN})" $i ${TIEMPO} ${TAMANO};
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`
echo " (${ORIGEN})" $i ${TIEMPO} ${TAMANO};
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`
echo " (${ORIGEN}) $i" ${TIEMPO} ${TAMANO};
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}');"
echo "IMG: ${NUMIMG2} file(s)"
echo "IMG: ${NUMIMG} file(s)"
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`
echo " (${ORIGEN})" $i ${TIEMPO} ${TAMANO};
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`
echo " (${ORIGEN})" $i ${TIEMPO} ${TAMANO};
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`
echo " (${ORIGEN}) $i" ${TIEMPO} ${TAMANO};
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}');"
# ------------------------------------------------------------------------------
# Inserta datos en el MySQL configurado
# ------------------------------------------------------------------------------
${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"`
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
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 "\t $ isp.sh -u http://www.domain.com/"
# ------------------------------------------------------------------------------
# ------------------------------------------------------------------------------
--help|-h) showHelp; exit 0;;
DOMAIN=`echo ${URL} | sed -e "s/[^/]*\/\/\([^@]*@\)\?\([^:/]*\).*/\2/"`;
echo -e "=== Testing ${URL} (${DOMAIN}) ==="