Linux Altında QOS - 9 - TC ile HTB queuing

19 April, 2009 (05:22) | Linux QOS | By: alper

Hierarchical Token Bucket

HTB, CBQ gibi bize link sharing yani bant genişliği yönetimi yapmamızı sağlayan bir queuing disiplinidir. kısaca 2 mbit interetimizi servislerimiz veya istemcilerimiz arasında bant genişliği olarak paylaştırmamızı sağlar.

örneğin :

HTB1

yada şu şekilde bir yapılandırmayı :

qospipe

Sanırım resimler HTB ile yapabileceklerimizi gayet güzel açıklıyor. CBQ ile HTB temel olarak aynı görevi yapsada Linux üzerinde HTB kullanımı çokndaha istikrarlı, sorunsuz ve yapılandırması kolaydır.

Hemen basit bir örnek yapalım : 10.70.20.0/24 networküne giden bağlantılara 1024kbit HTB ile bant genşiliği tanımlayalım.

bash-3.2# tc qdisc add dev wlan0 root handle 1:0 htb
bash-3.2# tc class add dev wlan0 parent 1:0 classid 1:1 htb rate 1024Kbit

bash-3.2# tc filter add dev wlan0 parent 1:0 protocol ip prio 1 u32 match ip src 10.70.20.0/24 flowid 1:1

neler yaptık : htb için root qdisc oluşturduk, ikinci satırda 1024kbit bir class oluşturup üçüncü satırda kaynağı 10.70.20.0/24 olan paketleri filter tanımlayarak bu class’a atadık. oldukça basit kullanımı.

şimdi koyduğumuz kurala bakalım :

bash-3.2# tc -s -d qdisc show dev wlan0
qdisc htb 1: root r2q 10 default 0 direct_packets_stat 296 ver 3.17
Sent 47788511 bytes 36235 pkt (dropped 0, overlimits 61757 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
bash-3.2# tc -s -d class show dev wlan0
class htb 1:1 root prio 0 quantum 12800 rate 1024Kbit ceil 1024Kbit burst 1599b/8 mpu 0b overhead 0b cburst 1599b/8 mpu 0b overhead 0b level 0
Sent 47730662 bytes 35950 pkt (dropped 0, overlimits 0 requeues 0)
rate 2072bit 1pps backlog 0b 0p requeues 0
lended: 35950 borrowed: 0 giants: 0
tokens: 11781 ctokens: 11781

bash-3.2# tc -d -s filter show dev wlan0
filter parent 1: protocol ip pref 1 u32
filter parent 1: protocol ip pref 1 u32 fh 800: ht divisor 1
filter parent 1: protocol ip pref 1 u32 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:1
match 0a461400/ffffff00 at 12
bash-3.2#

Gayet güzel şimdi biraz daha ayrıntıya girelim.

daha farklı bir yapımız olduğunu düşünelim, yukardaki örnekte, 10.70.20.0 network’üne komple 1 mbit bant genişliği tanımladık, peki farklı ipler için farklı bant genişlikleri tanımlasaydık ne olurdu ? 1 den fazla class oluşturup, tc filter ile ip adreslerine göre gelen paketleri sınıflandırıp bu classlara tanımlardık. hatta TOS, DS field, tcp port ptokol gibi istediğimiz tüm verilere göre. buradaki ana problem şudur. hiç kimse kullanıcılarını yada hizmetleri, belirli bir bant genişliğine sınırlayıp diğer hizmetlerin kullanmadığı bant genişliğini atıl durumda bırakmak istemez. bunun için HTB gibi protokollerde borrow ( ödünç alma ) mantığı geliştirilmiştir. temel olarak borrow, bir class in diğer class ların kullanmadığı bant genişliğini ödünç almasıdır.

HTB de borrow ( ödünç alma ) ceil parametresi ile belirtilir. bir class in ödünç alabileceği maksimum değer bir üst class in ulaşabileceği maksimum değerdir. örneğin : rate 1024Kbit ceil 2048Kbit şeklinde belirttiğimizde söz konusu class 1024Kbit garanti edilen hıza VE diğer class lar kullanmadığı takdirde 2048Kbit e kadar ödünç alarak çıkabileceK hızı belirtir.

Burst : anlık paket gönderimi daha önceki TBF yazımda da göreceğiniz üzere. Linux kernelinde belirtilen CONFIG_HZ olarak belirtilen bir zamanlayıcı vardır. ethernet interface i üzerinden bu değere bağlı oalrak her seferinde bir paket olmak üzere 1 sn de bu değerin gösterdiği kadar ayrı hızlarda giden paketlerin toplamı bize 1 saniye deki hızımızı örneğin 1024Kbits/sec verir. burst ve min burst her bir parçanın alabileceği maksimum ve minumum büyüklüğü tanımlayarak, 1 saniye içerisinde bir paketin diğerlerininkinden çok daha fazla oaarak onların gerçek değerlerinin dışına çıkmasını engeller. örneğin :

bash-3.2# cat /proc/config.gz | gunzip - | grep ^CONFIG_HZ= | sed s/CONFIG_HZ=//g
300
bash-3.2#

Sistemimde bu değer 300 hz olarak elde ettim, elde etmek istediğim değer, 1024KBits olduğuna göre 1024/300=3.413 1 sn içerisinde bazı HZ lerde gereken den yavaş aktarım olabileceğini ve paketlerdeki kayıplarıda göz önüne alarak yaklaşık 5Kbit burst değeri verecek olursak her bir Hz e denk gelen paket hızını optimize etmiş oluruz.

Priority : HTB priority fifo gibi diğer qdisc lerden farklı çalışır. HTB üzerinde belirtilen priority, ceil ile belirtmiş olduğumuz borrow ( ödünç alma ) işleminin gerçekleştiği durumda, hangi paketin bu ödünç almayı ilk yapacağını önceliklendirme için kullanılır.

Burst gibi kavramlarla HTB de uğraşmanın pratikte gerçek bir faydası olmuyor, hatta zaman zaman zararı olduğu dahi gözlemlenebiliyor. HTB manual inda da belirtidiği üzere özellikle paket gecikmelerinin çok önemli olduğu yapılarda HTB rate limitinin interface hızında bir miktar az tanımlanması önemli ölçüde verimliliği arttıracaktır örneğin : 1024 Kbits bantgenişliği olan bir interface için 900 Kbit gibi bir değer vermek son derece güzel bir çözümdür.

örneğin :

bash-3.2# tc class add dev wlan0 parent 1:0 classid 1:1 htb rate 900Kbit
bash-3.2# tc class add dev wlan0 parent 1:1 classid 1:10 htb rate 400Kbit ceil 900Kbit prio 1

ref : htb manual

Write a comment