Linux tc htb + prio = очень медленная ссылка

Я пытаюсь сформировать трафик, исходящий из моей DSL-ссылки (подтвержденная загрузка 1 Мбит) с использованием Linux (3.2) tc, HTB и PRIO. Моя коробка Linux подключена через Gigabit Ethernet к модему ADSL. Я хочу ограничить скорость загрузки с помощью HTB, чтобы мои пакеты помещались в очередь на Linux-боксе, а не на модеме, а затем использовали PRIO для размещения пакетов в приоритетных полосах.

Итак, я сделал это:

tc qdisc add dev dsl root handle 1: htb default 1
tc class add dev dsl parent 1: classid 1:1 htb rate 950kbit
tc qdisc add dev dsl parent 1:1 handle 2: prio bands 6
tc qdisc add dev dsl parent 2:1 bfifo
tc qdisc add dev dsl parent 2:2 bfifo
tc qdisc add dev dsl parent 2:3 bfifo
tc qdisc add dev dsl parent 2:4 bfifo
tc qdisc add dev dsl parent 2:5 bfifo
tc qdisc add dev dsl parent 2:6 bfifo

Проблема в том, что как только я это сделаю, моя ссылка на загрузку сильно замедлится. Я получаю ок. 25 кбит / с, что в 38 раз медленнее, чем я должен был получить (950 кбит / с), даже если ссылка не используется.

Интересно, что если я удалю qDisc PRIO, но оставлю HTB qdisc, то пропускная способность возрастет до прибл. 550 кбит / с, что лучше, но все же не то, что я должен получить. Опять же, ссылка не используется, поэтому расстановка приоритетов не учитывает это поведение.

Есть идеи, что не так с тем, что я делаю? В течение многих лет я использовал одни и те же команды, чтобы без проблем создать соединение Ethernet со скоростью 50 Мбит / с, поэтому я действительно понятия не имею, почему он не работает в этой ситуации.

Дополнительная информация:

# tc -s -d qdisc ls dev dsl
qdisc htb 1: root refcnt 2 r2q 10 default 1 direct_packets_stat 0 ver 3.17
 Sent 447262 bytes 1168 pkt (dropped 90, overlimits 38 requeues 0)
 backlog 0b 0p requeues 0
qdisc prio 2: parent 1:1 bands 6 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
 Sent 447262 bytes 1168 pkt (dropped 90, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
qdisc bfifo 8043: parent 2:1 limit 1514b
 Sent 84138 bytes 928 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
qdisc bfifo 8044: parent 2:2 limit 1514b
 Sent 363124 bytes 240 pkt (dropped 90, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
qdisc bfifo 8045: parent 2:3 limit 1514b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
qdisc bfifo 8046: parent 2:4 limit 1514b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
qdisc bfifo 8047: parent 2:5 limit 1514b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
qdisc bfifo 8048: parent 2:6 limit 1514b
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0

# tc -s -d class show dev dsl
class htb 1:1 root leaf 2: prio 0 quantum 11875 rate 950000bit ceil 950000bit burst 1599b/8 mpu 0b overhead 0b cburst 1599b/8 mpu 0b overhead 0b level 0
 Sent 478804 bytes 1316 pkt (dropped 90, overlimits 0 requeues 0)
 rate 42232bit 17pps backlog 0b 0p requeues 0
 lended: 1316 borrowed: 0 giants: 0
 tokens: 195781 ctokens: 195781
class prio 2:1 parent 2: leaf 8043:
 Sent 97560 bytes 1064 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
class prio 2:2 parent 2: leaf 8044:
 Sent 381244 bytes 252 pkt (dropped 90, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
class prio 2:3 parent 2: leaf 8045:
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
class prio 2:4 parent 2: leaf 8046:
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
class prio 2:5 parent 2: leaf 8047:
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
class prio 2:6 parent 2: leaf 8048:
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0

1 ответ

Решение

Энди Фурнисс нашел виновника, когда я спросил в списке рассылки LARTC. То, что я не упомянул, было то, что я формировал трафик из помеченного интерфейса VLAN. Проблема в том, что Linux не устанавливает очередь для интерфейса VLAN (т.е. txqueuelen является 0) и предпочитает вместо этого использовать очередь физического интерфейса.

Из-за этого мой bfifo qdiscs по умолчанию установлен в очередь размером 1514 байт (как видно на tc qdisc ls выход), который слишком низкий, создавая узкое место.

Решение состоит в том, чтобы убедиться, что интерфейс имеет свою очередь:

ifconfig dsl txqueuelen 20

bfifo тогда по умолчанию 30 КБ (txqueuelen * MTU) очередь, которая решает проблему.

Другие вопросы по тегам