Estoy tratando de limitar el ancho de banda con tc
y comprueba los resultados con iperf
. Empecé así:
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.2.7 port 35213 connected with 192.168.2.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 830 MBytes 696 Mbits/sec
Las dos instancias están conectadas directamente a través de Ethernet.
Luego configuré un htb
qdisc
con una clase predeterminada para limitar el ancho de banda a 1mbit/seg:
# tc qdisc add dev bond0 root handle 1: htb default 12
# tc class add dev bond0 parent 1: classid 1:12 htb rate 1mbit
Pero no obtengo lo que esperaba:
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.2.7 port 35217 connected with 192.168.2.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-12.8 sec 768 KBytes 491 Kbits/sec
Si duplico la tasa, el ancho de banda medido no cambia. ¿Qué me estoy perdiendo? ¿Por qué el ancho de banda medido no corresponde a 1mbit de la rate
? ¿parámetro? ¿Qué parámetros debo establecer para limitar el ancho de banda a una tasa dada exacta?
Sin embargo, el man
página dice que tbf
debería ser el qdisc
de elección para esta tarea:
El Token Bucket Filter es adecuado para reducir la velocidad del tráfico a una velocidad configurada con precisión. Se adapta bien a grandes anchos de banda.
tbf
requiere parámetros rate
, burst
y (limit
| latency
). Así que intenté lo siguiente sin entender cómo burst
y (limit
| latency
) afectan el ancho de banda disponible:
# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k
Esto me dio un ancho de banda medido de 113 Kbits/seg. Jugar con esos parámetros no cambió mucho hasta que noté que agregar un valor para mtu
cambia las cosas drásticamente:
# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k mtu 5000
dio como resultado un ancho de banda medido de 1,00 Mbits/seg.
¿Qué parámetros necesitaría configurar para limitar el ancho de banda a una tasa dada exacta?
¿Debo usar el htb
o tbf
¿Disciplina de cola para esto?
EDITAR :
En base a estos recursos, he realizado algunas pruebas:
- https://help.ubuntu.com/community/UbuntuBonding
- https://help.ubuntu.com/community/LinkAggregation
- /usr/share/doc/ifenslave-2.6/README.Debian.gz http://lartc.org/
He probado las siguientes configuraciones.
En una máquina física
/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
bridge_ports eth0
Medición con iperf
:
# tc qdisc add dev eth0 root handle 1: htb default 12
# tc class add dev eth0 parent 1: classid 1:12 htb rate 1mbit
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.2.4 port 51804 connected with 192.168.2.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-11.9 sec 1.62 MBytes 1.14 Mbits/sec
Mientras que el iperf
servidor calculó un ancho de banda diferente:
[ 4] local 192.168.2.1 port 5001 connected with 192.168.2.4 port 51804
[ 4] 0.0-13.7 sec 1.62 MBytes 993 Kbits/sec
En una máquina virtual sin enlace
/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
Medición con iperf
:
# tc qdisc add dev eth0 root handle 1: htb default 12
# tc class add dev eth0 parent 1: classid 1:12 htb rate 1mbit
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.2.7 port 34347 connected with 192.168.2.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-11.3 sec 1.62 MBytes 1.21 Mbits/sec
Mientras que el iperf
servidor calculó un ancho de banda diferente:
[ 4] local 192.168.2.1 port 5001 connected with 192.168.2.7 port 34347
[ 4] 0.0-14.0 sec 1.62 MBytes 972 Kbits/sec
En una máquina virtual con enlace (tc configurado en eth0)
/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto eth0
allow-bond0 eth0
iface eth0 inet manual
bond-master bond0
bond-primary eth0 eth1
auto eth1
allow-bond0 eth1
iface eth1 inet manual
bond-master bond0
bond-primary eth0 eth1
auto bond0
iface bond0 inet dhcp
bond-slaves none
bond-mode 1
# bond-arp-interval 250
# bond-arp-ip-target 192.168.2.1
# bond-arp-validate 3
Medición con iperf
:
# tc qdisc add dev eth0 root handle 1: htb default 12
# tc class add dev eth0 parent 1: classid 1:12 htb rate 1mbit
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.2.9 port 49054 connected with 192.168.2.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-11.9 sec 1.62 MBytes 1.14 Mbits/sec
Mientras que el iperf
servidor calculó un ancho de banda diferente:
[ 4] local 192.168.2.1 port 5001 connected with 192.168.2.9 port 49054
[ 4] 0.0-14.0 sec 1.62 MBytes 972 Kbits/sec
En una máquina virtual con enlace (tc configurado en bond0)
/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto eth0
allow-bond0 eth0
iface eth0 inet manual
bond-master bond0
bond-primary eth0 eth1
auto eth1
allow-bond0 eth1
iface eth1 inet manual
bond-master bond0
bond-primary eth0 eth1
auto bond0
iface bond0 inet dhcp
bond-slaves none
bond-mode 1
# bond-arp-interval 250
# bond-arp-ip-target 192.168.2.1
# bond-arp-validate 3
Medición con iperf
:
# tc qdisc add dev bond0 root handle 1: htb default 12
# tc class add dev bond0 parent 1: classid 1:12 htb rate 1mbit
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.2.9 port 49055 connected with 192.168.2.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-13.3 sec 768 KBytes 475 Kbits/sec
Mientras que el iperf
servidor calculó un ancho de banda diferente:
[ 4] local 192.168.2.1 port 5001 connected with 192.168.2.9 port 49055
[ 4] 0.0-14.1 sec 768 KBytes 446 Kbits/sec
El resultado no cambia si elimino eth1
(la interfaz pasiva) del enlace.
Conclusión
Control de tráfico en una interfaz de enlace no funciona, o al menos no como se esperaba. Tendré que investigar más.
Como solución, se podrían agregar las disciplinas de cola directamente a las interfaces pertenecientes al enlace.
Respuesta aceptada:
Cuando no está seguro de cómo funciona tc, aún puede monitorear tc y ver cómo fluyen los paquetes. Puede usar mi script para monitorear tc y necesita ejecutarlo en una terminal con privilegios elevados. Puede cambiar wlan0 a otra interfaz y también necesita grep y awk:
#!/bin/sh
INTERVAL=15
while sleep $INTERVAL
do
/usr/sbin/tc -s -d class show dev wlan0
uptime
more /proc/meminfo | grep MemFree | grep -v grep
echo cache-name num-active-objs total-objs obj-size
SKBUFF=`more /proc/slabinfo | grep skbuff | grep -v grep | awk
'{print $2} {print $3} {print $4}'`
echo skbuff_head_cache: $SKBUFF
done