Dear reader, I'm not updating these pages anymore. If you have tc or ip related questions, you can post them on the LARTC mailing list.



TODO : Check prio because I think not working

What I wanna do

When you have a link that's 100% used and you want to do something interactive (telnet), the response time can be very bad. So I want to give the telnet traffic a higher priority.

To test it, I generate tcp traffic to fullfill the total bandwidth and I start a ping. I don't know it's a good indication, but that's the best I found.

First test : prio qdisc

The prio qdisc has 3 builtin bands. First everything will be send from the first band and this is all non-tcp traffic (so the pings). All the tcp packets are send secondly.

RATE_TOT=100kbps
IP=kriek
 
DEV="dev eth0"
OPTION="allot 1514 maxburst 20 avpkt 1000"

tc qdisc del $DEV root
tc qdisc add $DEV root handle 10: cbq bandwidth 10mbit avpkt 1000
tc class add $DEV parent 10:0 classid 10:1 cbq bandwidth 10mbit rate $RATE_TOT $OPTION prio 3 bounded isolated
 
tc qdisc add $DEV parent 10:1 handle 20: prio

tc filter add $DEV parent 10: protocol ip prio 3 handle 1 fw classid 10:1
tc filter add $DEV parent 10: protocol ip prio 3 handle 2 fw classid 10:1
tc filter add $DEV parent 20: protocol ip prio 3 handle 1 fw classid 20:1
tc filter add $DEV parent 20: protocol ip prio 3 handle 2 fw classid 20:3
 
iptables -F
iptables -X
iptables -N acc_0
iptables -N acc_1
iptables -A OUTPUT -t mangle -p ! tcp -j MARK --set-mark 1
iptables -A OUTPUT -t mangle -p   tcp -j MARK --set-mark 2
iptables -A OUTPUT -p ! tcp -j acc_0
iptables -A OUTPUT -p   tcp -j acc_1

Second test : cbq qdisc

In my second tests, I use CBQ to make two classes. One for the tcp traffic and one for the rest.

Used script (download) I also tried all possible combinations of the prio parameter, but the results didn't change.

Results

I generated traffic and started 10 pings to measure the response time. These are the results :

  Result
CBQ With qdisc 11.4 ms
CBQ With NO qdisc 20: 207.1 ms
PRIO : ping in band 1, rest in band 1 268.9 ms
PRIO : ping in band 1, rest in band 3 18.3 ms
PRIO : ping in band 1, rest in band 5 18.9 ms
PRIO : ping in band 3, rest in band 1 (X)83 s

(X) :
10 packets transmitted, 5 packets received, 50% packet loss
round-trip min/avg/max = 23233.2/83230.2/143223.3 ms

Other tests : telnet session

I adapted the script so I can give more priority to telnet traffic on port 23. Of course you can't prove this with numbers, but it was clear that I had a much faster response with the prio qdisc. Same with the cbq script.

adapted prio script:

Used script (download)

adapted CBQ script:

Used script (download)