Linux – iperf

por | 3 julio, 2009

Resumen

Iperf es una herramienta que nos permite efectuar medidas de ancho de banda entre dos equipos. Proporciona una estimación del rendimiento de una conexión entre dos máquinas conectadas por protocolo TCP/IP. En este artículo se muestra su instalación y su funcionamiento básico.

1. Introducción

Iperf es actualmente uno de los proyectos del Sourceforce:

http://sourceforge.net/projects/iperf

Fue originalmente desarrollado por http://dast.nlanr.net/projects/Iperf/.

Iperf permite medir el ancho de banda real entre dos nodos de red, estableciendo transmisiones mediante protocolo TCP o UDP. Varios parámetros y características TCP y UDP son configurables.

Iperf es independiente del medio de transmisión usado, ya sea cable, WIFI, etc. Establece una estimación de la velocidad de transmisión del medio sobre la que aparentan los dispositivos.

Iperf es una utilidad cliente-servidor. Debemos ejecutar el servidor en una máquina y después ejecutyar el cliente apuntando a la IP del servidor. El cliente establec la conexión contra ella y transmite información de modo contínuo durante un periodo de tiempo midiendo la velocidad. El servidor puede gestionar varias conexiones y se pueden especificar la cantidad de sdatos a transmitir, la tasa de generación y el tiempo de duración de la transmisión.

La información suministrada por Iperf es el ancho de banda (throughput), delay, jitter y paquetes IP perdidos en el intervalo especificado.

 

2. Instalación de Iperf

Tras descargarnos la versión 2.0.2 la descomprimimos en un directorio en nuestro disco duro. Se trata de una instalación desde las fuentes. En el directorio /doc tenemos las instrucciones de instalación y uso en formato html. Primero efectuamos ./configure para preparar el entorno necesario para la compilación:

# ./configure

A continuación usamos make para configurar y compilar el código fuente:

# make

Finalmente efectuamos la instalación como tal:

# make install

3. Usando Iperf

Para utilizar Iperf necesitamos ejecutar el servidor en una máquina y el cliente en otra máquina, que en realidad es el mismo ejecutable con las opciones correspondiente.

Ejecutamos le servidor:

[root@localhost iperf-2.0.4]# iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------

Vemos que por defecto se usa TCP, sino indicamos la opción –u.

Para hacer la primera medida usando todas la opciones por defecto:

[root@localhost ~]# iperf -c 127.0.0.1
------------------------------------------------------------
Client connecting to 127.0.0.1, TCP port 5001
TCP window size: 49.2 KByte (default)
------------------------------------------------------------
[ 3] local 127.0.0.1 port 42005 connected with 127.0.0.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 10.6 GBytes 9.12 Gbits/sec 
[root@localhost ~]#

En este caso hemos usado la IP local como demostración, por lo que el resultado es un ancho de banda interno de 9.12 Gigas. Vemos que se han usado 10 segundos y se han transferido 10.6 Gb por el puerto TCP 5001 usando un tamaño de ventana TCP de 49,2 KB.

Las opciones disponibles son:

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)
-o, --output <filename> output the report or error message to this specified file
-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)
-Z, --linux-congestion <algo> set TCP congestion control algorithm (Linux only)

 

4. Usando Iperf con UDP

Como ya sabemos la diferencia entre UDP y TCP es que TCP implemeta un mecanismo para chequear que los paquetes son correctamebte enviados al receptor mientras que en UDP los paquetes se envía sin singuna garantía ni chequeo de error pero con la ventaja que gestionar un tráfico más rápido y fluido.

En el caso de UDP, Iperf puede dar información del Jitter (variación de la latencia) así como de pauqtes perdidos en el test.

En el servidor:

[s80usr@localhost pruebas_ancho_banda]$ iperf -s -u
------------------------------------------------------------
Server listening on UDP port 5001
Receiving 1470 byte datagrams
UDP buffer size: 107 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.220.175 port 5001 connected with 192.168.220.170 port 32800
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 3] 0.0-10.0 sec 964 MBytes 809 Mbits/sec 0.023 ms 117937/805771 (15%)
[ 3] 0.0-10.0 sec 1 datagrams received out-of-order

En el cliente:

[s80usr@s80sb Javi]$ iperf -c 192.168.220.175 -u -b 1000m
------------------------------------------------------------
Client connecting to 192.168.220.175, UDP port 5001
Sending 1470 byte datagrams
UDP buffer size: 107 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.220.170 port 32800 connected with 192.168.220.175 port 5001
[ 3] 0.0-10.0 sec 1.10 GBytes 948 Mbits/sec
[ 3] Sent 805773 datagrams
[ 3] Server Report:
[ 3] 0.0-10.0 sec 964 MBytes 809 Mbits/sec 0.022 ms 117937/805771 (15%)
[ 3] 0.0-10.0 sec 1 datagrams received out-of-order

 

Fijémonos en que hemos puesto la opción –b 1000m para indicar que se trata de un ancho de banda esperado de 1 Gb, pues nuestra conexión es de 1 Gb. Si no especificamos con –b nos usará por defecto 1 Mb.

5. Usando Iperf con tráfico multicast

Una característica interesante de Iperf es su capacidad de generar tráfico multicast. Además de permitir medir el ancho de banda para tráfico multicast (multicast puede involucrar otros mecanismos no presentes en unicast, como IGMP) permite verificar si los nodos de ruteo están habilitados para el transporte de tráfico multicast.

Para actibar la escucha de tráfico multicast en una determinada IP multicast usamos la opció –B en el servidor:

[s80usr@localhost ~]$ iperf -s -u -B 224.0.55.55 -i 1
------------------------------------------------------------
Server listening on UDP port 5001
Binding to local address 224.0.55.55
Joining multicast group 224.0.55.55
Receiving 1470 byte datagrams
UDP buffer size: 107 KByte (default)
------------------------------------------------------------

Como vemos es el servidor el ser se suscribe al grupo multicast indicado por la IP correspondiente.

Ahora en el cliente hacemos que se genere tráfico multitas hacia el mismo grupo:

[root@localhost /]# iperf -c 224.0.55.55 -u -T 32 -t 3 -i 1 -B
------------------------------------------------------------
Client connecting to 224.0.55.55, UDP port 5001
Binding to local address 192.168.0.222
Sending 1470 byte datagrams
Setting multicast TTL to 32
UDP buffer size: 107 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.0.222 port 5001 connected with 224.0.55.55 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 1.0 sec 121 KBytes 988 Kbits/sec
[ ID] Interval Transfer Bandwidth
[ 3] 1.0- 2.0 sec 128 KBytes 1.05 Mbits/sec
[ ID] Interval Transfer Bandwidth
[ 3] 2.0- 3.0 sec 136 KBytes 1.12 Mbits/sec
[ ID] Interval Transfer Bandwidth
[ 3] 0.0- 3.0 sec 386 KBytes 1.05 Mbits/sec
[ 3] Sent 269 datagrams
[root@localhost /]#

En la consola del servidor aparece el resultado de la recepción:

------------------------------------------------------------
[ 3] local 224.0.55.55 port 5001 connected with 192.168.0.222 port 5001
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 3] 0.0- 1.0 sec 119 KBytes 976 Kbits/sec 0.008 ms 0/ 83 (0%)
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 3] 1.0- 2.0 sec 128 KBytes 1.05 Mbits/sec 0.009 ms 0/ 89 (0%)
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 3] 2.0- 3.0 sec 136 KBytes 1.12 Mbits/sec 0.009 ms 0/ 95 (0%)
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 3] 0.0- 3.0 sec 386 KBytes 1.05 Mbits/sec 0.009 ms 0/ 268 (0%)
[ 3] 0.0- 3.0 sec 1 datagrams received out-of-order

6. Jperf

Jperf proporciona un frontend gráfico para Iperf. Está escrito en Java.

Download: http://code.google.com/p/xjperf/downloads/list

Una vez descargamos el software, lo descomprimimos y nos posicionamos en dicho directorio. Lo ejecutamos como root:

# ./jperf.sh

La aplicación permite seleccionar las diferentes opciones. Lo primero que podemos seleccionar es el modo cliente o servidor. Un buen uso del Jperf es por ejemplo lanzar el servidor en una máquina por línea de commandos y usar jperf en el cliente para visualizar el ancho de banda en tiempo real. El Jperf nos puede ir mostrando en cada segundo (opción –i 1) el ancho de banda medido entre las dos máquinas.

jperf

7. Otras opciones a Iperf

Netperf
Pchar
Pathload
Cacti
Netflow
Logs
Bwctl
Amp
Owamp
Perfsonar
Pinger
Pathrate
Thrulay
nuttcp

 

Referencias

[1] http://dast.nlanr.net/projects/Iperf/

[2] http://sourceforge.net/projects/iperf

[3] http://taosecurity.blogspot.com/2006/09/generating-multicast-traffic.html

[4] Un buen tutorial en http://openmaniak.com/iperf.php

 

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *