Я намагаюся обмежити пропускну здатність tc
і перевірити результати iperf
. Я почав так:
# 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
Два екземпляри безпосередньо пов'язані через Ethernet.
Потім я встановив htb
qdisc
один клас за замовчуванням, щоб обмежити пропускну здатність до 1 Мбіт / сек:
# 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.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
Якщо я подвоюю швидкість, виміряна пропускна здатність не змінюється. Що я пропускаю? Чому вимірювана пропускна здатність не відповідає параметру 1mbit від rate
параметра? Які параметри мені потрібно встановити, щоб обмежити пропускну здатність точно заданою швидкістю?
Однак на man
сторінці написано, що для цього завдання tbf
повинен бути qdisc
вибір:
Фільтр Token Bucket підходить для уповільнення трафіку до точно налаштованої швидкості. Добре масштабується до великої пропускної здатності.
tbf
вимагає параметрів rate
, burst
і ( limit
| latency
). Тому я спробував наступне, не розуміючи, як burst
і ( limit
| latency
) впливати на доступну пропускну здатність:
# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k
Це дозволило мені виміряти пропускну здатність 113 Кбіт / сек. Пограти з цими параметрами не змінилося настільки сильно, поки я не помітив, що додавання значення для mtu
змін різко:
# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k mtu 5000
в результаті була виміряна пропускна здатність 1,00 Мбіт / с.
Які параметри мені потрібно встановити, щоб обмежити пропускну здатність точно заданою швидкістю?
Чи слід використовувати для цього дисципліну htb
чи tbf
чергування?
Редагувати :
На основі цих ресурсів я зробив кілька тестів:
- https://help.ubuntu.com/community/UbuntuBonding
- https://help.ubuntu.com/community/LinkAggregation
- /usr/share/doc/ifenslave-2.6/README.Debian.gz http://lartc.org/
Я спробував такі установки.
На фізичній машині
/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto br0
iface br0 inet dhcp
bridge_ports eth0
Вимірювання за допомогою 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
Тоді як iperf
сервер обчислював іншу пропускну здатність:
[ 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
На віртуальній машині без скріплення
/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
Вимірювання за допомогою 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
Тоді як iperf
сервер обчислював іншу пропускну здатність:
[ 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
На віртуальній машині із скріпленням (tc налаштовано на 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
Вимірювання за допомогою 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
Тоді як iperf
сервер обчислював іншу пропускну здатність:
[ 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
На віртуальній машині із скріпленням (tc налаштовано на 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
Вимірювання за допомогою 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
Тоді як iperf
сервер обчислював іншу пропускну здатність:
[ 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
Результат не змінюється, якщо я видаляю eth1
(пасивний інтерфейс) з облігації.
Висновок
Управління трафіком на інтерфейсі облігацій не працює або, принаймні, не так, як очікувалося. Доведеться розслідувати далі.
В якості вирішення можна додати дисципліни черги безпосередньо до інтерфейсів, що належать до облігації.
tc filter
щоб розмістити пакети в класи. Вам також може знадобитися змінити деякі параметри htb (налаштуйте його так само, як tbf). Я пропоную розглянути tcng
, що є передньою частиною до тс. (Це швидкі покажчики ...)