You are here

Medir la red con Iperf

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      <host>   bind to <host>, 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    <host>   run in client mode, connecting to <host>
  -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 <name>   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_<long option name>, such as IPERF_BANDWIDTH.

Report bugs to <dast@nlanr.net>

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.

Debian: 
GNU/Linux: 
Asterisk: 
Qué te parece: