5 ago 2010

Medir la red con Iperf | Bytecoders

Medir la red con Iperf | Bytecoders

Iperf es una herramienta que nos permite medir el ancho de banda para el protocolo internet, nos proporciona información como la tasa de transferencia de datagramas en la red, el retardo (jitter) y la pérdida de paquetes. Todo ello enviando datagramas TCP o UDP según le especifiquemos y esperando la respuesta ACK.

Esta herramienta resulta útil para todo tipo de aplicaciones de red independientemente del protocolo de comunicaciones usado, permitiéndonos especificar el host, puerto, protocolo TCP o UDP, .... además puede correr en modo servidor o cliente. Si ejecutamos "iperf --help" veremos una gran cantidad de opciones, de todos formas la que más nos interesan son: -c (modo cliente), o -s (modo servidor). Evidentemente no podemos especificar ambas opciones a la vez, en modo cliente lanzaremos peticiones a una ip y un puerto que especifiquemos mientras que en modo servidor quedará escuchando peticiones en dicho puerto. Después de la opción de modo cliente/servidor especificaremos el host (hostname o ip), y con la opción -p indicamos el puerto que vamos a usar. La aplicación usa por defecto TCP pero con la opción -u podemos especificarle que use datagramas UDP. (Para todas las pruebas ejecutaremos "iperf -s" en el otro nodo, especificando el puerto con -p)

iperf --help
Usage: iperf [-s|-c host] [options]
iperf [-h|--help] [-v|--version]

Client/Server:
-f, --format [kmKM] format to report: Kbits, Mbits, KBytes, MBytes
-i, --interval # seconds between periodic bandwidth reports
-l, --len #[KM] length of buffer to read or write (default 8 KB)
-m, --print_mss print TCP maximum segment size (MTU - TCP/IP header)
-p, --port # server port to listen on/connect to
-u, --udp use UDP rather than TCP
-w, --window #[KM] TCP window size (socket buffer size)
-B, --bind bind to , an interface or multicast address
-C, --compatibility for use with older versions does not sent extra msgs
-M, --mss # set TCP maximum segment size (MTU - 40 bytes)
-N, --nodelay set TCP no delay, disabling Nagle's Algorithm
-V, --IPv6Version Set the domain to IPv6

Server specific:
-s, --server run in server mode
-U, --single_udp run in single threaded UDP mode
-D, --daemon run the server as a daemon

Client specific:
-b, --bandwidth #[KM] for UDP, bandwidth to send at in bits/sec
(default 1 Mbit/sec, implies -u)
-c, --client run in client mode, connecting to
-d, --dualtest Do a bidirectional test simultaneously
-n, --num #[KM] number of bytes to transmit (instead of -t)
-r, --tradeoff Do a bidirectional test individually
-t, --time # time in seconds to transmit for (default 10 secs)
-F, --fileinput input the data to be transmitted from a file
-I, --stdin input the data to be transmitted from stdin
-L, --listenport # port to recieve bidirectional tests back on
-P, --parallel # number of parallel client threads to run
-T, --ttl # time-to-live, for multicast (default 1)

Miscellaneous:
-h, --help print this message and quit
-v, --version print version information and quit

[KM] Indicates options that support a K or M suffix for kilo- or mega-

The TCP window size option can be set by the environment variable
TCP_WINDOW_SIZE. Most other options can be set by an environment variable
IPERF_, such as IPERF_BANDWIDTH.

Report bugs to

También disponemos de opciones más avanzadas para controlar el ancho de banda a generar, tamaño máximo de segmento, sin delay (Algoritmo de Nagle) e incluso tenemos la posibilidad de utilizar IPv6 (IP versión 6). Aunque con muy pocos parámetros podemos realizar una sencilla prueba simulando un servidor web:

iperf -c asteriskpbx -p 80
------------------------------------------------------------
Client connecting to asteriskpbx, TCP port 80
TCP window size: 16.0 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.1.2 port 51952 connected with 192.168.1.8 port 80
[ 3] 0.0-10.0 sec 77.3 MBytes 64.8 Mbits/sec

Si intentamos enviar información a un puerto donde el servidor iperf no está escuchando nos avisará con el mensaje "Connection refused", y un otro mensaje que nos indica que no se ha recibido el ACK (Acknowledge) después de un intento de enviar el datagrama:

iperf -c asteriskpbx -p 80 -u
------------------------------------------------------------
Client connecting to asteriskpbx, UDP port 80
Sending 1470 byte datagrams
UDP buffer size: 109 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.1.2 port 54812 connected with 192.168.1.8 port 80
write2 failed: Connection refused
read failed: Connection refused
[ 3] WARNING: did not receive ack of last datagram after 1 tries.
[ 3] 0.0- 0.0 sec 1.44 KBytes 1.05 Mbits/sec
[ 3] Sent 1 datagrams

Por tanto una sencilla prueba simulando el puerto SIP de nuestro servidor Asterisk sería tal que así (de momento usando UDP, aunque con pocos cambios también es posible hacer una prueba SIP sobre TCP):

iperf -c asteriskpbx -p 5060 -u
------------------------------------------------------------
Client connecting to asteriskpbx, UDP port 5060
Sending 1470 byte datagrams
UDP buffer size: 109 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.1.2 port 50678 connected with 192.168.1.8 port 5060
[ 3] 0.0-10.0 sec 1.25 MBytes 1.05 Mbits/sec
[ 3] Sent 893 datagrams
[ 3] WARNING: did not receive ack of last datagram after 10 tries.

A partir de aquí y observando todas las opciones podemos realizar pruebas más complejas.

No hay comentarios: