Estou tentando limitar a largura de banda com tc
e verificar os resultados com iperf
. Eu comecei assim:
# 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
As duas instâncias estão diretamente conectadas através da Ethernet.
Em seguida, configurei um htb
qdisc
com uma classe padrão para limitar a largura de banda a 1mbit / s:
# tc qdisc add dev bond0 root handle 1: htb default 12
# tc class add dev bond0 parent 1: classid 1:12 htb rate 1mbit
Mas não consigo o 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
Se eu dobrar a taxa, a largura de banda medida não será alterada. o que estou perdendo? Por que a largura de banda medida não corresponde ao 1mbit do parâmetro rate
? Quais parâmetros eu preciso definir para limitar a largura de banda a uma taxa específica?
No entanto, a página man
diz que tbf
deve ser o qdisc
de escolha para esta tarefa:
The Token Bucket Filter is suited for slowing traffic down to a precisely configured rate. Scales well to large bandwidths.
tbf
requer parâmetros rate
, burst
e ( limit
| latency
). Então, tentei o seguinte sem entender como burst
e ( limit
| latency
) afetam a largura de banda disponível:
# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k
Isso me deu uma largura de banda medida de 113 Kbits / seg. Brincar com esses parâmetros não mudou muito até que eu notei que adicionar um valor para mtu
muda drasticamente as coisas:
# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k mtu 5000
resultou em uma largura de banda medida de 1,00 Mbits / seg.
Quais parâmetros eu precisaria definir para limitar a largura de banda a uma taxa específica?
Devo usar a disciplina de enfileiramento htb
ou tbf
para isso?
EDITAR :
Com base nesses recursos, fiz alguns testes:
- link
- link
- /usr/share/doc/ifenslave-2.6/README.Debian.gz link
Eu tentei as seguintes configurações.
Em uma máquina física
/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
bridge_ports eth0
Medição com 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
Considerando que o servidor iperf
calculou uma largura 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
Em uma máquina virtual sem colagem
/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
Medição com 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
Considerando que o servidor iperf
calculou uma largura 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
Em uma máquina virtual com ligação (tc configurado em 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
Medição com 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
Considerando que o servidor iperf
calculou uma largura 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
Em uma máquina virtual com ligação (tc configurado em 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
Medição com 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
Considerando que o servidor iperf
calculou uma largura 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
O resultado não muda se eu remover eth1
(a interface passiva) da ligação.
Conclusão
Controle de tráfego em uma interface de ligação não funciona, ou pelo menos não como esperado. Vou ter que investigar mais.
Como solução alternativa, pode-se adicionar as disciplinas de enfileiramento diretamente às interfaces pertencentes ao vínculo.