Eye of the Beholder wrote:> Hello.
>
> I have a 1024/256kbit ADSL and tried to shape outgoing traffic in order
> to improve latency.
>
> Here is my config.
>
> UPLOAD_RATE="256"
> UPRATE="$[4*$UPLOAD_RATE/5]" (a little smaller)
Depends on traffic - you may need to go smaller if there are lots of
small packets, you can patch for dsl/atm overheads.
> UP70="$[7*$UPRATE/10]kbit"
> UP30="$[3*$UPRATE/10]kbit"
> UP20="$[2*$UPRATE/10]kbit"
> UPRATE="${UPRATE}kbit"
You should really make these add up to 100 not 120.
>
> IF="eth2"
> IPTABLES="iptables -t mangle -A POSTROUTING "
>
> (Initialize)
> tc qdisc del dev $IF root >& /dev/null
> iptables -t mangle -F
>
>
> (Root qdisc / class)
> tc qdisc add dev $IF root handle 1: htb default 20
Your arp will go to default which is not nice.
> tc class add dev $IF parent 1: classid 1:1 htb rate 100mbit
>
> (class for lan traffic)
> tc class add dev $IF parent 1:1 classid 1:100 htb rate 100mbit quantum
100000
> (parent class for adsl traffic)
> tc class add dev $IF parent 1:1 classid 1:3 htb rate $UPRATE (different
classes)
> tc class add dev $IF parent 1:3 classid 1:70 htb rate $UP70 ceil $UPRATE
prio 1
> tc class add dev $IF parent 1:3 classid 1:30 htb rate $UP30 ceil $UPRATE
prio 2
> quantum 1200
> tc class add dev $IF parent 1:3 classid 1:20 htb rate $UP20 ceil $UPRATE
prio 3
> quantum 1200
>
> (queues)
> tc qdisc add dev $IF parent 1:100 handle 100: sfq perturb 10
> tc qdisc add dev $IF parent 1:70 handle 70: sfq perturb 10
> tc qdisc add dev $IF parent 1:30 handle 30: sfq perturb 10
> tc qdisc add dev $IF parent 1:20 handle 20: sfq perturb 10
>
> (filters)
> tc filter add dev $IF parent 1:0 protocol ip handle 100 fw classid 1:100
> tc filter add dev $IF parent 1:0 prio 1 protocol ip handle 7 fw classid
1:70
> tc filter add dev $IF parent 1:0 prio 2 protocol ip handle 3 fw classid
1:30
> tc filter add dev $IF parent 1:0 prio 3 protocol ip handle 2 fw classid
1:20
>
> (Mark packets)
I would just -J RETURN for lan traffic here and not use htb defaut or
the 100meg class/marking
>
> (Interactive class (70%))
> $IPTABLES -p icmp -j MARK --set-mark 7
> $IPTABLES -p icmp -j RETURN
> $IPTABLES -p tcp --dport 22 -j MARK --set-mark 7
> $IPTABLES -p tcp --dport 22 -j RETURN
> $IPTABLES -p tcp --dport 6667 -j MARK --set-mark 7
> $IPTABLES -p tcp --dport 6667 -j RETURN
> $IPTABLES -p tcp --dport 53 -j MARK --set-mark 7
> $IPTABLES -p tcp --dport 53 -j RETURN
> $IPTABLES -p udp --dport 53 -j MARK --set-mark 7
> $IPTABLES -p udp --dport 53 -j RETURN
>
> (30% Class)
> $IPTABLES -p tcp -m multiport --dport 20,21,25,80,443,995 -j MARK
> --set-mark 3 $IPTABLES -p tcp -m multiport --dport 20,21,25,80,443,995
> -j RETURN
>
> (Lan class)
> $IPTABLES -d 192.168.1.0/24 -j MARK --set-mark 100
> $IPTABLES -d 192.168.1.0/24 -j RETURN
>
> (anything else)
> $IPTABLES -j MARK --set-mark 2
>
> (I changed the default "quantum" values because i got messages
"HTB: quantum of class
> 10001 is big/small. Consider r2q change." but my tc didn''t
accept r2q as a parameter.)
>
The 100meg class should go and I would set quantum to 1514 on the
remaining (1514 because a 1500 ip length packet is seen as 1514 on an
eth interface)
>
> I have tested that different packets get different marks (with iptables
> -v -t mangle -L) and also that they go to the different classes (with tc -s
-d class
> show dev eth2) so i guess my rules are correct.
>
> However, i put a large file to download in order to test and during the
> download i get 1500-2500ms ping times.
This only shapes upload, shaping download is harder. I have written lots
about this before - see archives.
Andy.