Ben dus eindelijk ook eens met linux qos gaan spelen. Was een kwestie van veel skimmen door veelste ingewikkelde howto's, wat knippen en plakken uit websites en nog wat vragen stellen op usenet, maar nu doet ie het hoor 
Viel me op dat er hier wel een en ander over qos te vinden is, maar dat dat vooral algemene tips/info en individuele problemen betreft.
Wat me wel leuk leek om eens wat te vergelijken onderling wat nou een goeie setup is voor een linux bak die aan een ADSL of kabel internet verbinding hangt. En laat ik de qos setup dan zo definieren dat er minstens sprake is 2 typen netwerk verkeer, dus setups waarbij er gewoon alleen een limiet op al het verkeer gezet wordt vallen af.
Goed dit is wat ik heb:
Chello classic (1500/128)
linux routertje - LAN
doel: client en server verkeer netjes verdelen en een acceptabele latency min of meer onafhankelijk van de belasting.
En dit is wat ik na veel geklooi heb bedacht (en dat werkt):
---------------------------
#!/bin/bash
#Qdisc
/usr/local/bin/tc-htb qdisc del dev eth1 root
/usr/local/bin/tc-htb qdisc add dev eth1 root handle 1: htb default 12
#Classes
/usr/local/bin/tc-htb class add dev eth1 parent 1: classid 1:1 htb rate 128kbit ceil 128kbit
/usr/local/bin/tc-htb class add dev eth1 parent 1:1 classid 1:10 htb rate 16kbit ceil 128kbit prio 6
/usr/local/bin/tc-htb class add dev eth1 parent 1:1 classid 1:11 htb rate 32kbit ceil 128kbit prio 7
/usr/local/bin/tc-htb class add dev eth1 parent 1:1 classid 1:12 htb rate 80kbit ceil 128kbit prio 8
#Latency
/usr/local/bin/tc-htb qdisc add dev eth1 parent 1:10 handle 2: tbf latency 100ms burst 1540 rate 128kbit
/usr/local/bin/tc-htb qdisc add dev eth1 parent 1:11 handle 3: tbf latency 125ms burst 1540 rate 128kbit
/usr/local/bin/tc-htb qdisc add dev eth1 parent 1:12 handle 4: tbf latency 150ms burst 1540 rate 128kbit
#Server
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 1 u32 match ip sport 80 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 2 u32 match ip sport 81 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 3 u32 match ip sport 82 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 4 u32 match ip sport 20 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 4 u32 match ip sport 21 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 3 u32 match ip sport 88 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 1 u32 match ip sport 443 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 1 u32 match ip sport 25 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 2 u32 match ip sport 119 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 2 u32 match ip sport 563 0xffff flowid 1:11
#Client
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 5 u32 match ip dport 20 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 5 u32 match ip dport 21 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 0 u32 match ip dport 80 0xffff flowid 1:10
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 4 u32 match ip dport 27900 0xffff flowid 1:12
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 4 u32 match ip dport 27950 0xffff flowid 1:12
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 4 u32 match ip dport 27952 0xffff flowid 1:12
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 4 u32 match ip dport 27960 0xffff flowid 1:12
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 4 u32 match ip dport 27965 0xffff flowid 1:12
#end
En dat ziet er zo uit:
### eth1: queueing disciplines
qdisc tbf 4: rate 128Kbit burst 1539b lat 183.1ms
Sent 83260359 bytes 602283 pkts (dropped 765, overlimits 187051)
qdisc tbf 3: rate 128Kbit burst 1539b lat 152.6ms
Sent 12794156 bytes 47239 pkts (dropped 2157, overlimits 63797)
qdisc tbf 2: rate 128Kbit burst 1539b lat 122.0ms
Sent 8462287 bytes 107385 pkts (dropped 15, overlimits 3991)
qdisc htb 1: [Unknown qdisc, optlen=40]
Sent 104518519 bytes 756932 pkts (dropped 2937, overlimits 141943)
-------------------------
Negeer svp de rare binary, dat is puur vanwege RedHat 6.2, waar m'n routertje nog steeds op draait. Het is een upload only setup. Het idee is dat elke classe een minmale bandbreedte heeft (voor zover te realiseren) en verder bandbreedte mag gebruiken tot de grens van 128kbit. Hiervoor gebruik ik de htb qdisc. En verder gebruik ik tbf om tevens een maximale latency te definieren.
Goed en dan de praktijk: Als ik bv alleen via ftp upload haal ik zo goed als 128kbit maar een ping naar m'n gateway of een nederlandse host blijft varieeren tussen normale waardes en +/- 200 msec. Als ik echt ga stresstesten (bv uploaden via ftp EN http EN ook nog een p2p app op de achtergrond) wordt de bandbreedte netjes verdeelt, maar wint de htb qdisc het van de tbf qdiscs. Pings blijven echter rond de 600msec hangen en dat is nog altijd stukken beter dan zonder qos.
PS ja ik had graag die latancy met een enkel regeltje gedefinieerd, maar het lukte me niet om m met class 1:1 (waar de rest onder hangt) te verbinden, foutmelding , dus dan maar zo....
Viel me op dat er hier wel een en ander over qos te vinden is, maar dat dat vooral algemene tips/info en individuele problemen betreft.
Wat me wel leuk leek om eens wat te vergelijken onderling wat nou een goeie setup is voor een linux bak die aan een ADSL of kabel internet verbinding hangt. En laat ik de qos setup dan zo definieren dat er minstens sprake is 2 typen netwerk verkeer, dus setups waarbij er gewoon alleen een limiet op al het verkeer gezet wordt vallen af.
Goed dit is wat ik heb:
Chello classic (1500/128)
linux routertje - LAN
doel: client en server verkeer netjes verdelen en een acceptabele latency min of meer onafhankelijk van de belasting.
En dit is wat ik na veel geklooi heb bedacht (en dat werkt):
---------------------------
#!/bin/bash
#Qdisc
/usr/local/bin/tc-htb qdisc del dev eth1 root
/usr/local/bin/tc-htb qdisc add dev eth1 root handle 1: htb default 12
#Classes
/usr/local/bin/tc-htb class add dev eth1 parent 1: classid 1:1 htb rate 128kbit ceil 128kbit
/usr/local/bin/tc-htb class add dev eth1 parent 1:1 classid 1:10 htb rate 16kbit ceil 128kbit prio 6
/usr/local/bin/tc-htb class add dev eth1 parent 1:1 classid 1:11 htb rate 32kbit ceil 128kbit prio 7
/usr/local/bin/tc-htb class add dev eth1 parent 1:1 classid 1:12 htb rate 80kbit ceil 128kbit prio 8
#Latency
/usr/local/bin/tc-htb qdisc add dev eth1 parent 1:10 handle 2: tbf latency 100ms burst 1540 rate 128kbit
/usr/local/bin/tc-htb qdisc add dev eth1 parent 1:11 handle 3: tbf latency 125ms burst 1540 rate 128kbit
/usr/local/bin/tc-htb qdisc add dev eth1 parent 1:12 handle 4: tbf latency 150ms burst 1540 rate 128kbit
#Server
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 1 u32 match ip sport 80 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 2 u32 match ip sport 81 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 3 u32 match ip sport 82 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 4 u32 match ip sport 20 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 4 u32 match ip sport 21 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 3 u32 match ip sport 88 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 1 u32 match ip sport 443 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 1 u32 match ip sport 25 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 2 u32 match ip sport 119 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 2 u32 match ip sport 563 0xffff flowid 1:11
#Client
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 5 u32 match ip dport 20 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 5 u32 match ip dport 21 0xffff flowid 1:11
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 0 u32 match ip dport 80 0xffff flowid 1:10
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 4 u32 match ip dport 27900 0xffff flowid 1:12
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 4 u32 match ip dport 27950 0xffff flowid 1:12
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 4 u32 match ip dport 27952 0xffff flowid 1:12
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 4 u32 match ip dport 27960 0xffff flowid 1:12
/usr/local/bin/tc-htb filter add dev eth1 parent 1:0 protocol ip prio 4 u32 match ip dport 27965 0xffff flowid 1:12
#end
En dat ziet er zo uit:
### eth1: queueing disciplines
qdisc tbf 4: rate 128Kbit burst 1539b lat 183.1ms
Sent 83260359 bytes 602283 pkts (dropped 765, overlimits 187051)
qdisc tbf 3: rate 128Kbit burst 1539b lat 152.6ms
Sent 12794156 bytes 47239 pkts (dropped 2157, overlimits 63797)
qdisc tbf 2: rate 128Kbit burst 1539b lat 122.0ms
Sent 8462287 bytes 107385 pkts (dropped 15, overlimits 3991)
qdisc htb 1: [Unknown qdisc, optlen=40]
Sent 104518519 bytes 756932 pkts (dropped 2937, overlimits 141943)
-------------------------
Negeer svp de rare binary, dat is puur vanwege RedHat 6.2, waar m'n routertje nog steeds op draait. Het is een upload only setup. Het idee is dat elke classe een minmale bandbreedte heeft (voor zover te realiseren) en verder bandbreedte mag gebruiken tot de grens van 128kbit. Hiervoor gebruik ik de htb qdisc. En verder gebruik ik tbf om tevens een maximale latency te definieren.
Goed en dan de praktijk: Als ik bv alleen via ftp upload haal ik zo goed als 128kbit maar een ping naar m'n gateway of een nederlandse host blijft varieeren tussen normale waardes en +/- 200 msec. Als ik echt ga stresstesten (bv uploaden via ftp EN http EN ook nog een p2p app op de achtergrond) wordt de bandbreedte netjes verdeelt, maar wint de htb qdisc het van de tbf qdiscs. Pings blijven echter rond de 600msec hangen en dat is nog altijd stukken beter dan zonder qos.
PS ja ik had graag die latancy met een enkel regeltje gedefinieerd, maar het lukte me niet om m met class 1:1 (waar de rest onder hangt) te verbinden, foutmelding , dus dan maar zo....