sábado, 19 de febrero de 2011

Evaluación de rendimiento - II - Definición del Entorno

Después de tener las herramientas listas según mi anterior post, ahora es necesario definir una estructura simple que me permita hacer la evaluación.

Dentro de la carpeta root de los servidores web creé una carpeta "FrameworksTest" que en adelante será la carpeta base y contendrá una carpeta por cada elemento a evaluar cuyo nombre tendrá la siguiente estructura: XX_NOMBRE donde XX es un número que me permitirá ordenar por nombre los elementos y NOMBRE es  un nombre corto: Ejs: 01_HTML, 02_PHP.
En la carpeta base tendré todos recursos que son compartidos por los elementos a evaluar, por el momento ab.exe que tomé de la carpeta de instalación del Apache y un archivo interface que llamé benchmark.bat que me permitirá ejecutar ab.exe con algunos parámetros por defecto.

Acá un ejemplo simple de comó usar ab.exe.
ab.exe -n 20 -k http://localhost:80/FrameworksTests/01_HTML/index.html
Donde:
  • -n 200: Es el número de peticiones a realizar.
  • -k: Usar KeepAlive para que todas las peticiones usen la misma conexión.
  • El parámetro final es la URL a la que se harán las peticiones.

La evaluación que haré tiene las siguientes características:
  • Evaluaré el número de respuestas por segundo.
  • Se harán 200.000 peticiones.
  • Siempre estará activo KeepAlive.
  • Puedo cambiar el puerto de evaluación para usar otro servidor web (por defecto 80).
  • Cada elemento, archivo o framework a evaluar estará en una subcarpeta de FrameworkTests.
  • El nombre del archivo a evaluar puede variar en cada evaluación.
  • La salida de la herramienta ab debe ser almacenada en la subcarpeta correspondiente.

Según las características anteriores hice una archivo benchmark.bat que me permite un uso más simple de la herramienta ab.
El contenido del archivo benchmark.bat es el siguiente:
@echo OFF
rem    // Número de peticiones a realizar
set REQUESTS=200000

rem    // Archivo al que se dirigirá la evaluación
set FILE=%2
rem    // Si el parámetro no existe se asume index.php
if %2.==. set FILE=index.php

rem    // Puerto de conexión para la evaluación
set PORT=%3
rem    // Si el parámetro no existe se asume 80
if %3.==. set PORT=80

rem    // URL final
set URL=http://localhost:%PORT%/FrameworksTests/%1/%FILE%

echo/
echo Iniciando...
echo Peticiones: %REQUESTS%
echo URL: %URL%
echo LOG: %~dp0%1\benchmark%3.txt
echo/
pause
echo/

%~dp0\ab.exe -n %REQUESTS% -k %URL% > %~dp0%1\benchmark%3.txt

echo/
echo Terminado.
echo/
pause
echo/
El uso de este archivo es el siguiente:
benchmark.bat 01_HTML index.html 80
Donde:
  • 01_HTML es la subcarpeta a evaluar.
  • index.html es el archivo dentro de la subcarpeta (No requerido, por defecto index.php).
  • 80 es el puerto a usar (No requerido, por defecto 80).
Un llamado con parámetros sería:
benchmark.bat 01_HTML index.html 8080
Hace 200.000 peticiones a la dirección: http://localhost:8080/FrameworksTests/01_HTML/index.html y genera un archivo llamado benchmark8080.txt dentro de la subcarpeta 01_HTML con el resultado de la evaluación.

Un llamado simple al archivo:
benchmark.bat 01_HTML
Hace 200.000 peticiones a la dirección: http://localhost:80/FrameworksTests/01_HTML/index.php y genera un archivo llamado benchmark.txt dentro de la subcarpeta 01_HTML con el resultado de la evaluación.

Incluso puedo crear un archivo benchmark.bat dentro de cada subcarpeta que llame al archivo "benchmark principal" que auto-calcule su carpeta y me ahorre el trabajo de escribir la línea anterior.
@echo OFF

for %%* in (.) do set ACTUALDIR=%%~n*

echo Directorio actual: %ACTUALDIR%
..\benchmark.bat %ACTUALDIR%

Al ejecutarlo la salida sería más o menos esto:
Directorio actual: 01_HTML

Iniciando...
Peticiones: 200000
URL: http://localhost:80/FrameworksTests/01_HTML/index.html
LOG: C:\...\FrameworksTests\01_HTML\benchmark.txt

Presione una tecla para continuar . . .

Completed 20000 requests
Completed 40000 requests
Completed 60000 requests
Completed 80000 requests
Completed 100000 requests
Completed 120000 requests
Completed 140000 requests
Completed 160000 requests
Completed 180000 requests
Completed 200000 requests
Finished 200000 requests

Terminado.

Presione una tecla para continuar . . .

Y el archivo de resultados generado sería algo así:
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)


Server Software:        Microsoft-IIS/7.5
Server Hostname:        localhost
Server Port:            80

Document Path:          /FrameworksTests/01_HTML/index.html
Document Length:        319 bytes

Concurrency Level:      1
Time taken for tests:   32.370 seconds
Complete requests:      200000
Failed requests:        0
Write errors:           0
Keep-Alive requests:    200000
Total transferred:      113200000 bytes
HTML transferred:       63800000 bytes
Requests per second:    6178.55 [#/sec] (mean)
Time per request:       0.162 [ms] (mean)
Time per request:       0.162 [ms] (mean, across all concurrent requests)
Transfer rate:          3415.10 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0      16
Processing:     0    0   1.6      0      47
Waiting:        0    0   1.5      0      47
Total:          0    0   1.6      0      47

Percentage of the requests served within a certain time (ms)
  50%      0
  66%      0
  75%      0
  80%      0
  90%      0
  95%      0
  98%      0
  99%     16
 100%     47 (longest request)

Y el entorno está terminado.

No hay comentarios:

Publicar un comentario