Розуміння tc qdisc та iperf


15

Я намагаюся обмежити пропускну здатність 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чергування?

Редагувати :

На основі цих ресурсів я зробив кілька тестів:

Я спробував такі установки.

На фізичній машині

/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(пасивний інтерфейс) з облігації.

Висновок

Управління трафіком на інтерфейсі облігацій не працює або, принаймні, не так, як очікувалося. Доведеться розслідувати далі.

В якості вирішення можна додати дисципліни черги безпосередньо до інтерфейсів, що належать до облігації.


Як не дивно, це, здається, працювало для цього хлопця: blog.tinola.com/?e=22
Matías E. Fernández

1
Я думаю, що з htb, ви повинні використовувати, tc filterщоб розмістити пакети в класи. Вам також може знадобитися змінити деякі параметри htb (налаштуйте його так само, як tbf). Я пропоную розглянути tcng, що є передньою частиною до тс. (Це швидкі покажчики ...)
derobert

Я не бачив жодних фільтрів у вашій публікації. Які команди ви використовуєте для узгодження трафіку, щоб він міг обмежувати швидкість?

Відповіді:


2

Якщо ви не впевнені в тому, як працює tc, ви все ще можете контролювати tc і дивитись, як протікають пакети? Ви можете використовувати мій скрипт для моніторингу tc і потрібно запустити його в терміналі із знятими привілеями. Ви можете змінити wlan0 на інший інтерфейс, і вам також потрібні "grep and 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

0

Спробуйте збільшити значення burst/ limit. Алгоритми відра токена добре масштабуються, але мають обмежене співвідношення точності / швидкості.

Точність досягається за допомогою невеликого відра, швидкість за рахунок збільшення розміру жетонів. Великі лексеми означають, що швидкість, з якою вони поповнюються, зменшується (лексеми в секунду = байти в секунду / байти за маркер).

rateПараметр дає середню швидкість , яка не повинна бути перевищена, то burstчи limitпараметри дають розмір вікна усереднення. Оскільки відправлення пакета зі швидкістю лінії перевищує встановлену швидкість за час передачі пакета, вікно усереднення повинно бути принаймні великим, щоб відправлення одного пакета не відсувало все вікно за межі; якщо більше вікон поміститься у вікні, алгоритм матиме більше шансів точно влучити в ціль.


0

запустіть це перед тим, як додати дисципліну черги на інтерфейсі зв’язку (bond0 в цьому випадку)

ipconfig bond0 txqueuelen 1000

він не працює, тому що віртуальний пристрій програмного забезпечення, наприклад інтерфейс для зв'язку, не має черги за замовчуванням.


0

Оскільки на bondпристроях немає визначеної черги, встановлення qdiscрозміру явно вирішує проблему для мене.

Ось приклад для листя, qdiscякий буде використовуватися в HTBструктурі: tc qdisc add dev $dev parent $parent handle $handle pfifo limit 1000

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.