QOS - Quality of Service mit Linux


Zurück zur Linux Startseite

Inhalt


Intro

Ich habe eine ADSL Standleitung ins Internet. Da ich auf meinem Server eine Website und einen FTP Server hoste, hatte ich Probleme mit dem Traffic. Wenn nun ein Internetuser einige Downloads von meinem Webserver machte, dann blieb nicht mal genügend Upstream übrig um zu Surfen.

Deshalb habe ich mit QOS und Traffic Shaping unter Linux auseinandergesetzt. Nach endlosen Stunden am Computer beim lesen von langweiligen und schwierigen Dokus habe ich es geschafft ein Traffic Shaping nach meinen Wünschen einzurichten :o)

top.gifZurück zum Inhalt


QDisc - Queuing Disciplines

Die Funktionen zur Kontrolle des Traffic's werden mit mit dem "TC" (Traffic Control) Kommando gemacht. Eigentlich kann man sagen, dass mit den QDisc (Queuing Disciplines) einfach ein weiterer Queue (Warteschlange) erstellt wird. Mit Parametern kann man dann auf die Eigenschaften dieses Queues einwirken.

Es gibt verschiedene QDisciplines:

#Ist bereits ein QDisc vorhanden?
tc qdisc show dev eth1

#Ausgabe
qdisc tbf 1: rate 128Kbit burst 6399b lat 762.6s
#Es ist also ein QDISC mit dem TBF vorhanden, welcher den Traffic auf 128Kbit/s = 16KB/s begrenzt

top.gifZurück zum Inhalt


QDisc - Queuing Disciplines löschen

#Root QDisc löschen
tc qdisc del dev eth1

#Die Abfrage sollte jetzt keine QDisc mehr finden
tc qdisc show dev eth1

top.gifZurück zum Inhalt


HTB - Hirarchy Token Bucket

Mit dem TBF (Token Bucket Filter) kann man ein ganz einfaches begrenzen des Netzwerkverkehrs erreichen. In unserem Beispiel werden wir den Traffic auf 1 MBit/s (=128MB/s) begrenzen.

#Root QDisc TBF setzen
tc qdisc add dev eth1 root handle 1:0 tbf limit 100Mbit burst 50Kbit rate 1Mbit

#Die Abfrage sollte jetzt ungefähr so aussehen
tc qdisc show dev eth1
qdisc tbf 1: rate 1Mbit burst 6399b lat 762.6s

top.gifZurück zum Inhalt


CBQ Theorie

Mit dem CBQ (Class Based Queuing) wird der Verkehr in verschiedene Klassen eingeteilt. Jede dieser Klassen kann unterschiedlich behandelt werden. Es kann zum Beispiel dem FTP Verkehr die ganze Bandbreite zugeteilt werden, sofern kein Webtraffic herscht usw.

# Die Queues und die Klassen bilden

ROOT QDisc auf dem Interface setzen (1:0)
Klasse 1:1 mit 4096Kbit/s = 512KB/s setzen
Unterklasse 1:3 mit 1024Kbit/s = 128KB/s setzen
FIFO setzen
Verleih von Bandbreite zulassen
Ausleihen von Bandbreite zulassen
Unterklasse 1:4 mit 3072Kbit/s = 384KB/s setzen
FIFO setzen
Verleih von Bandbreite zulassen
Ausleihen von Bandbreite zulassen

# Die Filter für die Klassen einrichten
Filter mit Handle-ID 103 der Klasse 1:3 zuteilen
Filter mit Handle-ID 104 der Klasse 1:4 zuteilen

# Mit den Iptables dem Traffic die Handle-ID zuteilen
WWW Verkehr mit der Handle-ID 103 versehen
FTP Verkehr mit der Handle-ID 104 versehen

top.gifZurück zum Inhalt


CBQ Praxis

So, und nun werden wir das obengenannte Beispiel in die Praxis umsetzen...

# Die Queues und die Klassen bilden
# ROOT QDisc auf dem Interface setzen (1:0)
tc qdisc add dev eth1 root handle 1:0 cbq bandwidth 100Mbit avpkt 1000 cell 8

#Klasse 1:1 mit 4096Kbit/s = 512KB/s setzen
tc class add dev eth1 parent 1:0 classid 1:1 cbq bandwidth 100Mbit rate 128Kbit weight 12.8Kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded

#Unterklasse 1:3 mit 1024Kbit/s = 128KB/s setzen
tc class add dev eth1 parent 1:1 classid 1:3 cbq bandwidth 100Mbit rate 112Kbit weight 11.2Kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 sharing borrow

#FIFO setzen
tc qdisc add dev eth1 parent 1:3 handle 30: pfifo

#Unterklasse 1:4 mit 3072Kbit/s = 384KB/s setzen
tc class add dev eth1 parent 1:1 classid 1:4 cbq bandwidth 100Mbit rate 16Kbit weight 1.6Kbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 sharing borrow

#FIFO setzen
tc qdisc add dev eth1 parent 1:4 handle 30: pfifo

# Die Filter für die Klassen einrichten
# Filter mit Handle-ID 103 der Klasse 1:3 zuteilen
tc filter add dev eth1 protocol ip parent 1:0 prio 8 handle 103 fw flowid 1:3

# Filter mit Handle-ID 104 der Klasse 1:4 zuteilen
tc filter add dev eth1 protocol ip parent 1:0 prio 8 handle 104 fw flowid 1:4

# Mit den Iptables dem Traffic die Handle-ID zuteilen
# WWW Verkehr mit der Handle-ID 103 versehen
iptables -t mangle -A POSTROUTING -p tcp -s $EXT_IP --sport 80 -j MARK --set-mark 103

# FTP Verkehr mit der Handle-ID 104 versehen
iptables -t mangle -A POSTROUTING -p tcp -s $EXT_IP --sport 20 -j MARK --set-mark 104

top.gifZurück zum Inhalt


Links

Untenstehend findet Ihr einige Links zum Thema, bzw. einige Sites, welche mir geholfen haben QOS und Traffic Shaping zu realisieren...

top.gifZurück zum Inhalt


Zur Linux Startseite home.icewolf.ch/linux/ | Copyright © 2003 - Andres Bohren Icewolf Software