Я пытаюсь сформировать трафик, исходящий из моего 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, но сохраню qdisc HTB, то пропускная способность возрастет до прибл. 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
Энди Фернисс нашел виновника когда я спросил на LARTC список рассылки. О чем я не упомянул, так это о том, что я формировал трафик из интерфейса VLAN с тегами. Проблема в том, что Linux не создает очередь для интерфейса VLAN (т.е. txqueuelen
является 0
) и предпочитает вместо этого использовать очередь физического интерфейса.
Из-за этого мой bfifo
qdiscs по умолчанию имеет очередь 1514 байт (как показано в tc qdisc ls
output), который слишком мал, что создает узкое место.
Решение состоит в том, чтобы убедиться, что у интерфейса есть собственная очередь:
ifconfig dsl txqueuelen 20
bfifo
затем по умолчанию 30 КБ (txqueuelen * MTU
) очередь, которая решает проблему.