GNU/Linux >> Tutoriales Linux >  >> Linux

Comprender Tc Qdisc e Iperf?

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.

Relacionado:¿Opción del menú contextual de Nautilus para crear un nuevo archivo?

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

Linux
  1. 2>&1 y comprender las expresiones idiomáticas de otros scripts de shell

  2. Comprender los recursos, manifiestos, módulos y clases de Puppet con ejemplos

  3. Cómo:MTR:comprender y solucionar problemas de conectividad de red

  4. Comprender las versiones de RPM y los esquemas de nombres

  5. Comprender los comandos de control de trabajos en Linux:bg, fg y CTRL+Z

Comprender las rutas de los archivos y cómo usarlas en Linux

Comprender los sistemas de archivos de Linux:ext4 y más allá

Comprender la diferencia entre los comandos sudo y su en Linux

Comprender Bash If Else y otras declaraciones condicionales

Comprender los permisos básicos de archivos y la propiedad en Linux

Comprensión de los permisos y tipos de archivos de UNIX