Linux tc htb + prio = link muito lento

1

Estou tentando moldar o tráfego que sai do meu link DSL (upload verificado de 1 mbit) usando o Linux (3.2) tc, HTB e PRIO. Minha caixa Linux está conectada através de um link Gigabit Ethernet ao modem ADSL. Eu quero limitar a taxa de upload usando HTB para que meus pacotes sejam enfileirados na caixa do Linux e não no modem, e então use o PRIO para colocar os pacotes em bandas prioritárias.

Então, eu fiz isso:

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

O problema é que, assim que faço isso, meu link de upload fica lento. Estou ficando aprox. 25 kbit / s, o que é 38 vezes mais lento do que o que eu deveria estar recebendo (950 kbit / s), mesmo que o link não seja usado.

Curiosamente, se eu remover o qdisc do PRIO, mas manter o qdisc do HTB, então o throughput aumentará para aprox. 550 kbit / s, o que é melhor, mas ainda não é o que eu deveria estar recebendo. Novamente, o link não é usado, portanto, a priorização não leva em conta esse comportamento.

Alguma ideia do que há de errado com o que estou fazendo? Eu tenho usado exatamente os mesmos comandos há anos para moldar um link Ethernet para 50 mbit / s sem nenhum problema, então eu realmente não tenho idéia do por que ele não funciona nesta situação.

Informações adicionais:

# 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
    
por Etienne Dechamps 27.05.2012 / 11:23

1 resposta

2

Andy Furniss encontrou o culpado quando perguntei sobre o LARTC lista de discussão. O que eu não mencionei foi que eu estava moldando o tráfego de uma interface de VLAN marcada. O problema é que o Linux não configura uma fila para uma interface de VLAN (ou seja, txqueuelen é 0 ) e prefere usar a fila de interface física.

Por causa disso, meus bfifo qdiscs foram padronizados para uma fila de 1514 bytes (como visto na tc qdisc ls output), que é muito baixa, criando assim um gargalo.

A solução é garantir que a interface tenha sua própria fila:

ifconfig dsl txqueuelen 20

bfifo , por padrão, é uma fila de 30 KB ( txqueuelen * MTU ), que resolve o problema.

    
por 02.06.2012 / 13:46