Estoy tratando de limitar el ancho de banda tc
y verificar 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é una 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 espero:
# 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 velocidad, el ancho de banda medido no cambia. ¿Qué me estoy perdiendo? ¿Por qué el ancho de banda medido no corresponde al 1mbit del rate
parámetro? ¿Qué parámetros debo establecer para limitar el ancho de banda a una velocidad determinada?
Sin embargo, la man
página dice que tbf
debería ser la qdisc
elección para esta tarea:
El Token Bucket Filter es adecuado para ralentizar el tráfico a una velocidad configurada con precisión. Escala bien a grandes anchos de banda.
tbf
requiere parámetros rate
, burst
y ( limit
| latency
). Así que probé lo siguiente sin comprender 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 los mtu
cambios cambia drásticamente:
# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k mtu 5000
resultó en un ancho de banda medido de 1.00 Mbits / seg.
¿Qué parámetros necesitaría establecer para limitar el ancho de banda a una tasa dada exacta?
¿Debo usar la disciplina htb
o tbf
hacer cola para esto?
EDITAR :
Con base en 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 intentado 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
Medida 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 vinculación
/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
Medida 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
Medida 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
Medida 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
El control de tráfico en una interfaz de enlace no funciona, o al menos no como se esperaba. Tendré que investigar más a fondo.
Como solución alternativa, se podrían agregar las disciplinas de colas directamente a las interfaces que pertenecen al enlace.
tc filter
para poner los paquetes en clases. También es posible que deba cambiar algunos de los parámetros de htb (sintonícelo como tbf). Sugiero investigar tcng
, que es un front-end para tc. (Estos son consejos rápidos ...)