Linux Altında QOS - 3 - TC kullanımı

30 March, 2009 (06:45) | Linux QOS | By: alper

TC nedir ?

TC iproute2 paketinin içerisinde gelen, hemen hemen her linux dağıtımında paket olarak bulunabilen bir qos yapılandırma aracıdır. ” Traffic Control ” tc komutunun nasıl kullanıldığını anlamak içn öncelikle daha önceki yazılarımı okumamış arkadaşların 1′inci ve 2′inci qos yazılarımı mutlaka okumalarını öneriyorum. aksi takdirde bir çok terim askıda kalacaktır. Hemen kullanımına geçelim.

iproute2 paketi Cisco CLI’i örnek alınarak dizayn edilmiştir. daha önceki yazılarımı okuyup buradaki terimlere yabancı olmayan arkadaşlar, genel switch ve router CLI larina yabancı değilse kolayca bundan sonrasını çözeceklerdir. Madem Cisco CLI örnek alınarak yapılandırılmış bizde ona yaklaşır gibi adım adım çözelim.

örneğin : interface wlan0 üzerindeki qos yapısını nasıl görürüz ?

bash-3.2# tc ?
Object “?” is unknown, try “tc help”.
bash-3.2# tc help
Usage: tc [ OPTIONS ] OBJECT { COMMAND | help }
tc [-force] -batch file
where  OBJECT := { qdisc | class | filter | action | monitor }
OPTIONS := { -s[tatistics] | -d[etails] | -r[aw] | -p[retty] | -b[atch] [file] }
bash-3.2#

Cisco CLI’i gibi “?” desteklemiyor ama bizi help için yönlendiriyor. güzel elimizde neler var bakalım. OBJECT olarak qdisc | class | filter | action | monitor girebiliyormuşuz qdisc ile devam edelim.

bash-3.2# tc qdisc help
Usage: tc qdisc [ add | del | replace | change | show ] dev STRING
[ handle QHANDLE ] [ root | ingress | parent CLASSID ]
[ estimator INTERVAL TIME_CONSTANT ]
[ stab [ help | STAB_OPTIONS] ]
[ [ QDISC_KIND ] [ help | OPTIONS ] ]

tc qdisc show [ dev STRING ] [ingress]
Where:
QDISC_KIND := { [p|b]fifo | tbf | prio | cbq | red | etc. }
OPTIONS := … try tc qdisc add <desired QDISC_KIND> help
STAB_OPTIONS := … try tc qdisc add stab help
bash-3.2#

Güzel  | add | del | replace | change | show | diyebiliyormuşuz . qos yapısını görmek istediğimiz için show dememiz gerekiyor.

bash-3.2# tc qdisc show
qdisc pfifo_fast 0: dev eth0 root bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
qdisc pfifo_fast 0: dev wmaster0 root bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
qdisc pfifo_fast 0: dev wlan0 root bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
bash-3.2#

tataaa ! kısa yoldan sonuca ulaştık . yukarıdaki ” tc qdisc help” dediğimizdeki parametrelere bakarsak device’ları ayrı ayrı görüntüleyebileceğimizide görüyoruz. Sanırım CLI da yolumuzu nasıl bulacağımızı kısaca anladık. şimdi kullanımı daha iyi anlamak için bir kaç örneğe göz atalım.

basit bir kural atayalım ve kaldıralım :

mevcut durum :
bash-3.2# tc qdisc show dev wlan0
qdisc pfifo_fast 0: root bands 3 priomap  1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1

kuralımızı ekleyelim :
bash-3.2# tc qdisc add dev wlan0 root handle 1:0 htb

eklediğimiz kuralı görüntüleyelim :
bash-3.2# tc qdisc show dev wlan0
qdisc htb 1: root r2q 10 default 0 direct_packets_stat 0
eklediğimiz kuralı silelim :

bash-3.2# tc qdisc del dev wlan0 root handle 1:0 htb

gayet basit hemen eklediğimiz kuralı inceleyelim :

tc qdisc :

bash-3.2#tc qdisc add \ (1)
> dev wlan0 \ (2)
> root \ (3)
> handle 1:0 \ (4)
> htb (5)

  1. qdisc kural ekliyoruz. kaldırırken gördüğümüz gibi “del” diyerek silebilirizde.
  2. eklemek istediğimiz device’i yani interface’i belirtiyoruz buradaki gibi wlan0 veya eth0 vb .
  3. eklediğimiz qdisc’in root yani en üst seviye bir qdisc olduğunu belirtiyoruz
  4. Handle değerlerini giriyoruz.  qdisc olduğu için minor 0 olmak zorundaydı. major değeri geleneksel olarak en üsteki handle 1 ile başladığı için bizde öyle yaptık. 1-65534 arası bir rakam olabilirdi. buna benzer bir örnekte “1:” şeklinde girilip minor verilmemesi minor=0 demektir.
  5. qdisc’in yani kullanacak olduğumuz qos algoritmasının ismini giriyoruz. bundan sonra htb ile ilgili diğer değerler girilecek. bu konulara daha sonra değineceğim için şimdilik geçiyorum..

tc class :

bash-3.2# tc class add dev wlan0 parent 1:1 classid 1:6 htb rate 256kbit ceil 512kbit

bash-3.2# tc class show dev wlan0
class htb 1:6 root prio 0 rate 256000bit ceil 512000bit burst 1599b cburst 1599b
bash-3.2#

açıklayalım :

bash-3.2# tc class add    \ (1)
>                  dev wlan0     \ (2)
>                  parent 1:1   \ (3)
>                  classid 1:6  \ (4)
>                  htb          \ (5)
>                  rate 256kbit \ (6)
>                  ceil 512kbit   (7)

  1. class ekleyeceğimizi belirttik.
  2. interface imizi belirttik. wlan0 device’i
  3. parent ( ana ) handle imizi belirtiyoruz. yukarıdaki örnekde ki 1:0 handle ini gösterdik 1:1 diyerek yeni bir class bağlıyoruz.
  4. bu class i tanımlayan unique handler i gösteriyoruz. bu sayede diğer objeler bu class a ulaşabilecekler. class lar qdisc içeremiyecekleri için classid’de minor handle 0 olamaz !
  5. htb algoritmasını belirtiyoruz
  6. ve 7. parametreleri daha sonra htb yi incelerken göreceğiz.

tc filter :

bash-3.2# tc filter add dev wlan0 parent 1:0 protocol ip prio 5 u32 match ip dport 22 0xffff match ip tos 0×10 0xff flowid 1:6 police rate 32000bps burst 10240 mpu 0 action drop/continue
bash-3.2# tc filter show dev wlan0
filter parent 1: protocol ip pref 5 u32
filter parent 1: protocol ip pref 5 u32 fh 800: ht divisor 1
filter parent 1: protocol ip pref 5 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:6
match 00000016/0000ffff at 20
match 00100000/00ff0000 at 0
police 0×3 rate 256000bit burst 10Kb mtu 2Kb action drop/continue overhead 0b
ref 1 bind 1

bash-3.2#

açıklayalım :

bash-3.2# tc filter add \ (1)

>    dev wlan0 \ (2)

> parent 1:0 \ (3)

>   protocol ip \ (4)

>   prio 5 \ (5)

>   u32 \ (6)

>   match ip port 22 0xffff \ (7)

>   match ip tos 0×10 0xff \ (8)

>   flowid 1:6 \ (9)

>   police \ (10)

>   rate 32000 bps \ (11)

>   burst 10240 \ (12)

>   mpu 0 \ (13)

>   action drop/continue (14)

  1. Filter ekliyoruz ( del ile de silebilirdik )

  2. wlan0 interface imiz üzerinde yapmak istediğimizi belirtiyoruz.
  3. bu filter in bağlayacağımız  qdisc’i belirtiyoruz.
  4. filter’in ip protokolünde çalışacağını belirtiyoruz.
  5. filter’in priority’sini belirliyoruz ( öncelik ). ip route da olduğu gibi priority ve pref aynı manada kullanılabilir.
  6. tc filter tarafından ihtiyaç duyulan classifier.
  7. 8 ile beraber u32 parametreleridir. burada interaktif olarak 22 nolu porta gelen ( ssh ) TOS belirtilmiştir. bu şartlara uyan paketler için filter’imiz aktif olacaktır.
  8. 7 ile birlikte u32 parametrelerini tamamlar.
  9. flowid filter şartlarına uyan paketlerin gönderileceği qdisc veya class in handle ini belirtiyoruz. bir önceki örnekte eklemiş olduğumuz class a gönderdik.
  10. policier. filterlarda opsiyonel olarak policier ekleyebilirsiniz.
  11. 32000 bits per second’ üzerine çıktığında policier in görev yapmasını istediğimizi belirtik.
  12. burst htb örnekleri yaptığımızda daha iyi anlaşılacak kısaca en fazla izin verilen paket.
  13. kısaca bir paketin içerebileceği minumum byte i gösterir ( minumum policed unit ) ethernet frame leri gibi paketlerde 64 byte a eşit gelir. ayırt etmeden tüm paketlerin işlenmesi için “0″ demeliyiz.
  14. policier de belirttiğimiz değerler aşılıyorsa ne yapılacağı ( burada drop ) aşılmamışsa ne yapılacağı gösteriliyor ( burada continue )

Kısaca ne yaptık ?

  1. Bir qdisc oluşturarak htb kullanacağımızı belirttik.
  2. oluşturulan qdisc e class atayarak bant genişliği tanımladık.
  3. filter oluşturarak özellikle hangi servisin ( burada ssh ) ve policier la hangi şartlar içinde bu class a dahil olacağını belirttik.

Comments

Comment from Ali E.İMREK
Time 03/30/2009 at 7:48 am

Linux Networking knusundaki yazılarınızı takip ediyorum ama bunları toparlayıp pdf olarak yayınlasanız daha iyi olur diye düşünüyorum.

Comment from alper
Time 03/30/2009 at 8:12 pm

Şu an için benimde planım o, ya daha düzgün bir sayfa yapısıyla sıralandırıp yapılandıracağım yada hepsini bir pdf haline getireceğim.

Write a comment