jueves, 21 de agosto de 2008

Què es un Benchmark?

Wikipedia: "Un benchmark es una técnica que se utiliza para medir el rendimiento de un sistema o componente de un sistema"

http://es.wikipedia.org/wiki/Benchmark



Los siguientes son algunos parámetros que podemos usar al momento de realizar el Benchmark de rendimiento al servidor web, en este caso la prueba utilizada es la ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0 Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Copyright 2006 The Apache Software Foundation, http://www.apache.org/:



-n requests Number of requests to perform
-c concurrency Number of multiple requests to make
-t timelimit Seconds to max. wait for responses
-p postfile File containing data to POST
-T content-type Content-type header for POSTing
-v verbosity How much troubleshooting info to print
-w Print out results in HTML tables
-i Use HEAD instead of GET
-x attributes String to insert as table attributes
-y attributes String to insert as tr attributes
-z attributes String to insert as td or th attributes
-C attribute Add cookie, eg. 'Apache=1234. (repeatable)
-H attribute Add Arbitrary header line, eg. 'Accept-Encoding: gzip'
Inserted after all normal header lines. (repeatable)
-A attribute Add Basic WWW Authentication, the attributes
are a colon separated username and password.
-P attribute Add Basic Proxy Authentication, the attributes
are a colon separated username and password.
-X proxy:port Proxyserver and port number to use
-V Print version number and exit
-k Use HTTP KeepAlive feature
-d Do not show percentiles served table.
-S Do not show confidence estimators and warnings.
-g filename Output collected data to gnuplot format file.
-e filename Output CSV file with percentages served
-h Display usage information (this message)
-Z ciphersuite Specify SSL/TLS cipher suite (See openssl ciphers)
-f protocol Specify SSL/TLS protocol (SSL2, SSL3, TLS1, or ALL)
katy:/etc/cherokee#


Me enfocarè en tres aspectos: -k, -n y -c


-c
debe ser menor que -n, sino nos saldrá el siguiente error:

katy:/etc/cherokee# ab -n100 -c500 -k http://127.0.0.1/ ab: Cannot use concurrency level greater than total number of requests Usage: ab [options] [http[s]://]hostname[:port]/path



Es recomendable realizar cada prueba 3 veces y tomar siempre el valor mas pequeño, ejm:

katy:/etc/cherokee# ab -n2000 -c300 -k http://127.0.0.1/


Lo anterior lo realizamos 3 veces y tomamos el resultado mas pequeño, ejm: el Request per second mas pequeño.


Realizar la prueba completa con -k y luego sin -k para tener una mejor comparativa de resultados. Primero realizamos la prueba con -k y cuando terminemos, debemos reiniciar nuestro servidor web y luego realizar la prueba sin -k, sino reiniciamos, el servidor no toma los cambios.



Qué es -k:

Anteriormente http trabajaba de la siguiente manera: un usuario primero abria un socket(osea una conexion al servidor) y por él enviaba el request y esperaba la respuesta del servidor. Cuando el servidor respondia cerraba el socket y esperaba otros request.

Despues de http 1.1 se creo otro método que es keepalive, osea, -k, que es mantener abierto el socket.

La diferencia es:

El servidor , una vez responde no cierra el socket y lo deja abierto entre el usuario y el servidor por si el usuario hace mas requests, y eso hace que todo sea mas rápido por que solo tienen que crear una conexión, y no es necesario crear una para cada request. El servidor abre un socket con cada usuario que hace un request.

En conclusión, cuando usas esta opción (-k), le estas diciendo al servidor que deje el socket abierto, es por esto que se recomienda hacer pruebas con -k y sin -k para ver cómo se comporta el servidor web.


A continuación pongo ejemplos para entender mejor -n y -c:

Este es un ejemplo de comando que use en linux debian con la versión del benchmark mencionada anteriormente:


katy:/etc/cherokee#
ab -n10000 http://localhost/

Aca estoy enviando 10000 requerimientos al servidor, al no poner c le estoy diciendo que por defecto envie 1 al tiempo. Lo que podriamos interpretar como si un solo usuario enviara 10000 requerimientos al servidor web.



katy:/etc/cherokee# ab -n20000 -c16 -k http://localhost/

Aca le estoy diciendo que envie 20000 requerimientos al servidor en grupos de 16 en 16 requerimientos al mismo tiempo. Lo que podriamos interpretar como si 16 usuarios le estan pidiendo abrir 20000 requerimientos y que mantenga abierto el socket.


katy:/etc/cherokee# ab -n20000 -c16 http://localhost/



Este es casi igual al caso anterior, la diferencia es que le digo que no mantenga abierto el socket



El siguiente es un ejemplo que nos muestra cuàndo el servidor llegò a su lìmite:

katy:/etc/cherokee# ab -n2000000 -c300 -k http://127.0.0.1/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 200000 requests
Completed 400000 requests
Completed 600000 requests
Completed 800000 requests
apr_socket_recv: Connection reset by peer (104)
Total of 996507 requests completed
katy:/etc/cherokee#

0 comentarios: