J'essaie de limiter la bande passante avec tc
et de vérifier les résultats avec iperf
. J'ai commencé comme ça:
# 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
Les deux instances sont directement connectées via Ethernet.
J'ai ensuite mis en place un htb
qdisc
avec une classe par défaut pour limiter la bande passante à 1 Mo / 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
Mais je n'obtiens pas ce que j'attends:
# 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 je double le débit, la bande passante mesurée ne change pas. Qu'est-ce que je rate? Pourquoi la bande passante mesurée ne correspond-elle pas au 1mbit du rate
paramètre? Quels paramètres dois-je définir pour limiter la bande passante à un débit précis?
Cependant, la man
page indique que cela tbf
devrait être le qdisc
choix pour cette tâche:
Le Token Bucket Filter est adapté pour ralentir le trafic vers un débit configuré avec précision. S'adapte bien aux larges bandes passantes.
tbf
nécessite des paramètres rate
, burst
et ( limit
| latency
). J'ai donc essayé ce qui suit sans comprendre comment burst
et ( limit
| latency
) affectent la bande passante disponible:
# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k
Cela m'a donné une bande passante mesurée de 113 Kbits / sec. Jouer avec ces paramètres n'a pas beaucoup changé jusqu'à ce que je remarque que l'ajout d'une valeur pour les mtu
choses change radicalement:
# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k mtu 5000
a donné lieu à une bande passante mesurée de 1,00 Mbits / s.
Quels paramètres dois-je définir pour limiter la bande passante à un débit donné exact?
Dois-je utiliser la discipline htb
ou la tbf
file d'attente pour cela?
MODIFIER :
Sur la base de ces ressources, j'ai fait quelques tests:
- https://help.ubuntu.com/community/UbuntuBonding
- https://help.ubuntu.com/community/LinkAggregation
- /usr/share/doc/ifenslave-2.6/README.Debian.gz http://lartc.org/
J'ai essayé les configurations suivantes.
Sur une machine physique
/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
bridge_ports eth0
Mesure avec 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
Alors que le iperf
serveur a calculé une bande passante différente:
[ 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
Sur une machine virtuelle sans liaison
/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
Mesure avec 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
Alors que le iperf
serveur a calculé une bande passante différente:
[ 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
Sur une machine virtuelle avec liaison (tc configuré sur 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
Mesure avec 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
Alors que le iperf
serveur a calculé une bande passante différente:
[ 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
Sur une machine virtuelle avec liaison (tc configuré sur 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
Mesure avec 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
Alors que le iperf
serveur a calculé une bande passante différente:
[ 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
Le résultat ne change pas si je retire eth1
(l'interface passive) du lien.
Conclusion
Le contrôle du trafic sur une interface de liaison ne fonctionne pas, ou du moins pas comme prévu. Je vais devoir enquêter davantage.
Comme solution de contournement, on pourrait ajouter les disciplines de mise en file d'attente directement aux interfaces appartenant à la liaison.
tc filter
pour mettre les paquets en classes. Vous devrez peut-être également modifier certains des paramètres htb (réglez-le comme tbf). Je suggère de se pencher sur tcng
ce qui est un frontal pour tc. (Ce sont des pointeurs rapides ...)