No sé qué le pasa últimamente a mi router Zyxel 660HW en su función de switch de red para conectar los diferentes ordenadores de casa. Mientras que el ancho de banda de red que debería de permitir para la comunicación entre los ordenadores debería de ser cercano a los teóricos 100 Mbps, hay veces que no hace falta esforzarse mucho para ver que realmente es muy inferior, hasta llegar a ver cosas como esta usando Samba entre un sistema con Ubuntu y otro con Debian:
Sin saber realmente por qué me está ocurriendo esto, este problema me sirve para hablar del IPerf, una pequeña utilidad que nos sirve para medir el ancho de banda efectivo entre dos sistemas de la red usando TCP o UDP. Como está disponible para Windows, y para los diferentes sistemas UNIX (en Debian y Ubuntu existe un paquete en la distribución estándar), podemos usarla entre dos nodos cualquiera conectados a una red para ver el ancho de banda real que, tras quitar las cabeceras y los retardos que introducen los dispositivos de red intermedios, nos queda.
En un extremo la ejecutaremos en modo servidor, con la opción -s
:
debian $ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[ 4] local 192.168.1.2 port 5001 connected with 192.168.1.3 port 53490
[ 4] 0.0-10.3 sec 116 MBytes 94.1 Mbits/sec
En el otro extremo, en modo cliente, con la opción -c
. Por defecto, ambos extremos usan el puerto 5001:
ubuntu $ iperf -c debian
------------------------------------------------------------
Client connecting to debian, TCP port 5001
TCP window size: 16.0 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.1.3 port 53490 connected with 192.168.1.2 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.1 sec 116 MBytes 96.3 Mbits/sec
Vemos que, de una red de 100 Mbps salen 94-96 Mbps. No está mal.
Por defecto, es el cliente es el que manda datos al servidor durante 10 segundos (a menos que usemos el parámetro -t
en el cliente). Curiosamente, si hago la prueba al revés, para que el ordenador con Debian mande al ordenador con Ubuntu, obtengo algo menos de velocidad:
ubuntu $ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[ 4] local 192.168.1.3 port 5001 connected with 192.168.1.2 port 35792
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-10.0 sec 104 MBytes 87.1 Mbits/sec
debian $ iperf -c ubuntu
------------------------------------------------------------
Client connecting to ulises, TCP port 5001
TCP window size: 16.0 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.1.2 port 35792 connected with 192.168.1.3 port 5001
[ 3] 0.0-10.0 sec 104 MBytes 87.2 Mbits/sec
Pero en realidad, tales números sólo los obtengo cuando no está ocurriendo nada más en la red. La realidad es que si el router está trabajando en otras cosas, los números que puedo obtener son bastante peores. Definitivamente, mi router/switch no tiene bastante potencia para mover varios flujos de datos a la vez a 100 Mbps entre sus diferentes interfaces:
debian $ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[ 4] local 192.168.1.2 port 5001 connected with 192.168.1.3 port 43429
[ 4] 0.0-10.4 sec 38.9 MBytes 31.3 Mbits/sec
ubuntu $ iperf -c debian
------------------------------------------------------------
Client connecting to debian, TCP port 5001
TCP window size: 16.0 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.1.3 port 43429 connected with 192.168.1.2 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.2 sec 38.9 MBytes 32.0 Mbits/sec
Pero lo que es el colmo es lo que estoy viendo estos últimos días, que se traduce en la captura de la copia de datos con Samba del principio de la entrada:
ubuntu $ iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[ 5] local 192.168.1.3 port 5001 connected with 192.168.1.2 port 36886
[ ID] Interval Transfer Bandwidth
[ 5] 0.0-10.2 sec 2.38 MBytes 1.96 Mbits/sec
debian $ iperf -c ubuntu
------------------------------------------------------------
Client connecting to ubuntu, TCP port 5001
TCP window size: 16.0 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.1.2 port 36886 connected with 192.168.1.3 port 5001
[ 3] 0.0-10.2 sec 2.38 MBytes 1.96 Mbits/sec
¡Menos de 2 Mbps! En los aproximadamente 4 años que llevo con este router, nunca me había hecho estas cosas. Sí que estaba acostrumbrado a no mover datos entre ordenadores a más de unos 4MB/seg (los 32 Mbps que salían anteriormente). Eso era lo normal, y me parecía razonablemente aceptable, pero ahora, de vez en cuando le da por hacer esto y no se arregla hasta que lo reinicio y sólo por un rato. ¿Será problema de hardware? ¿Será problema de software? ¿Ha llegado la hora de cambiar el router?
Por cierto, si necesitamos medir el ancho de banda y no tenemos el más versátil IPerf a mano, siempre podemos recurrir a un clásico scp
, pero tendremos que tener en cuenta la carga adicional en encriptar y desencriptar los datos en ambos extremos:
debian $ scp linux-2.6.25.5.tar.bz2 vicente@ubuntu:/tmp/
linux-2.6.25.5.tar.bz2 100% 46MB 3.6MB/s 00:13
También podemos usar un netcat con un dd
o con un pv
para que nos midan la velocidad de transferencia:
debian $ cat linux-2.6.25.5.tar.bz2 | nc -q 0 ubuntu 2222
ubuntu $ nc -lp 2222 | dd of=/dev/null
68980+31407 records in
94901+1 records out
48589640 bytes (49 MB) copied, 6.28166 s, 7.7 MB/s
debian $ cat linux-2.6.25.5.tar.bz2 | nc -q 0 ubuntu 2222
$ nc -lp 2222 | pv > /dev/null
46.3MB 0:00:06 [7.43MB/s] [ <=> ]
Si en uno de los sitemas tenemos un servidor web, el wget
también nos dará estadísticas de velocidad de transferencia:
$ wget http://debian/linux-2.6.25.5.tar.bz2
--2008-12-12 20:17:58-- http://debian/linux-2.6.25.5.tar.bz2
Resolving debian... 192.168.1.2
Connecting to debian |192.168.1.2|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 48589640 (46M) [application/x-tar]
Saving to: `linux-2.6.25.5.tar.bz2'
97% [====================================> ] 47,195,808 418K/s eta 4s
ubuntu $ wget http://debian/linux-2.6.25.5.tar.bz2
--2008-12-12 20:20:38-- http://debian/linux-2.6.25.5.tar.bz2
Resolving debian... 192.168.1.2
Connecting to debian |192.168.1.2|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 48589640 (46M) [application/x-tar]
Saving to: `linux-2.6.25.5.tar.bz2.2'
100%[======================================>] 48,589,640 10.5M/s in 4.4s
2008-12-12 20:20:42 (10.4 MB/s) - `linux-2.6.25.5.tar.bz2' saved [48589640/48589640]
¿Se nota que entre las dos ejecuciones he reiniciado el router? ¡Qué diferencia! ¡De 418 KB/s a 10.5 MB/s!.
Fuente y autoría: http://www.vicente-navarro.com/blog/2008/12/13/midiendo-el-ancho-de-banda-de-red-con-iperf-y-con-scp-netcat-wget/