Linux Altında QOS - 5- TC ile TBF Queuing
Token Bucket Filter ( TBF)’in ne olduğunu daha önceki qos yazımda değinmiştim. Egress trafiği basitçe sınırlamak için kullanılabilecek en basit yöntemdir. sonderece düşük cpu ve ram kullanır.
Token Bucket Filter’ı açıklamak için tüm bulduğum kaynaklarda bir benzetme yapılmış sanırım nasıl çalıştığını anlamanın da tek yoluda bu.
Token Bucket Filter direk olarak türkçeye ” Jeton kova filitresi” şeklinde çevirilebilir. Paketlerin kuyrukta beklediklerini ve kernelden interface’e ( örneğin kernelden ethernete ) teleferik benzeri bir sistemle kova ile taşındıklarını düşünelim. bir kovanın 10 kbit taşıyabildiğini ve kuyrukta 100 kova olduğunu. Saniyede 100 kova nın sırada döndüğünü ve 1 inci kovaya sıra geldiğini düşünelim. 100 kova X 10 kbit = saniyede 1000 kbit taşınabileceği manasına gelir. ( 1mbits )
Peki 1Mbit’in üstünde paket geldiğinde ne olacak ? kovalar daha fazlasını taşıyamadığı için paketler sırada yığılıp beklemeye başlayacaklardır. gelen paketlere geçiş haklarını tanımlayıp sıraya koymak için jeton verelim.Böylece kuyrukta bekleye paketlere de bir düzen getirmiş olduk. Bu sisteme kısaca Token Bucket Filter’deniyor
Burada dikkat edilecek nokta TBF in bir paketin önceliğini değiştirmemesi. Sadece bir tarafdan bir tarafa 1 mbit den daha fazla paket geçirilememesini sağlamakta. kovalar saniyede 1 tur attığı 100 kova olduğu için ve her kova 10 kbit taşıya bildiği için üstü mümkün değildir.
Şimdi örneğimizi biraz gerçek hayata çevirelim. Linux umuz da 100 mbit/s ethernet bağlı yani üzerinden saniyede 1000 kova yük geçirebilir. ama internet bağlantımız ADSL ve upload’ımız 1 mbit. yani 100 kova yük taşıyabilmekte. Linux’umuzun ethernet üzerinden gönderdiği 1000 kova paket sadece 100 kova taşıyabilen ADSL hattımıza geldiğinde tıkanma ve yığılım meydana gelecek ve sorun yaratacaktır. bunu engellemek için linux da sadece 100 kova çıkmasını sağlamak amacıyla TBF yani bu telefirik sistemini kurarak çıkan paketleri 1 Mbit/s sınırlayabiliriz. ADSL hattında oluşabilecek muhtemel tıkanmaları önleyecektir.
Peki nedir bu 100 kova hikayesi ? Linux kernelinde CONFIG_HZ diye tanımladığımız bir zamanlayıcı vardır. ( jiffies ) , tc-tbf man’i yazıldığında default linux için 100 hz olduğu için TBF saniyede 100 bucket refereans alınarak yazılmış peki bizim sistemimizde bunun değeri kaçtır ?
bash-3.2# cat /proc/config.gz | gunzip - | grep ^CONFIG_HZ= | sed s/CONFIG_HZ=//g
300
bash-3.2#
Şu an var olan sistemimde 300 olduğunu görüyoruz. birazdan bunun önemine değineceğim.
Şimdi TBF parametrelerine göz atalım :
limit or latency “(size -in bytes- of the packets queue)” :
limit kendisine sıra gelmeden önce kaç byte bilginin kuyrukta bekleyebileceğini belirtir. latency ise ne kadar süreyle bekleyebileceğini belirtir. örneğin : linux üzerinden 100 mbits ile dosya transferi yapılmak isteniyor ve limitimiz 1 mbits. Kuyrukta bekleyen paketler yığılmaya başlayacaktır. limit 1 mbyte verdiğimizde kuyrukta bekleyen paketler 1 mbyte i geçtiğinde droplanmaya başlayacaktır. bunun yerine lanency vrdiğimizde ise paket belirlenen süre kadar kuyrukta bekleyip hala işlem yapılmadıysa droplanacaktır.
burst/buffer/maxburst “(size -in bytes- of the token queue)” :
Rate için bir kovanın taşıyabileceği maximum byte. yapmış olduğum denemelerde 1540 byte dan düşük bucketlerde iletişim de aksama oldu, daha ufağını kullanmamaya özen gösterin.
rate :
sanırım fazla açıklamaya gerek yok kısaca : rate 256kbit şeklinde kullanıyor 1 mbits hat için rate 1000kbit
peakrate :
kurmuş olduğumuz yapının maksimum taşıyabileceği bant genişliği.
mtu/minburst :
Kabaca peakrate . bir kovanın kaç byte taşıyabileceğini işaret eder. örneğin 1 mbits için bir TBF oluşturduğumuzda benim sahip olduğum sistemde HZ=300 olduğuna göre 1000/300=3.3… yani 3 kbyte lık bir bucket yeterli olacaktır.
örnek :
tc qdisc add dev wlan0 root tbf rate 220kbit latency 50ms burst 1540
bu şekilde wlan0 interface imiz üzerinde 220 kbit bant genişliği 50 ms gecikme ve 1540 byte bucket tanımlayıp 220 kbits bant genişliği elde etmemiz gerekiyor ki çalışmıyor ! 140 kbit gibi bir bant genişliği uyguluyor. hemen tbf-man inda ki örneği yapalım :
bash-3.2# tc qdisc add dev wlan0 root tbf rate 0.5mbit burst 5kb latency 70ms peakrate 1mbit minburst 1540
bash-3.2#
ilginç buda çalışmıyor. 0.5 mbit değil 368 kbit gibi bir değer görüyor.
bash-3.2# tc qdisc add dev wlan0 root tbf rate 0.5mbit burst 5kb latency 70ms peakrate 1mbit minburst 5kb
bash-3.2#
şeklinde örneğimizi değiştirdiğimiz de ise sorunsuz olarak çalışıyor ( ölçümleri local de yaptım ) 5kb minburst = 5*300 = 1.5 mbit gibi bir değere denk geliyor. ilk örneğimizin de sorunsuz çalışmış olması lazımdı. tc-tbf man inda verilmiş olan değerler HZ 100 için verildiği için en kötü ihtimal daha yüksek bant genişliği elde etmemiz gerekirdi. ama aksine değerler oldukça düşük çıkıyor. Sebepleri MTU ile alakalı veya HZ ile alakalı olabilir. açıkçası incelemiyorum, pek zevk almadığımı itiraf etmeliyim. internetteki çalışan tüm örneklerde burst 10k verildiğini belirteyim. 5k ve üstü burst verdiğiniz sürece prolemsiz olarak kullanabilirsiniz.
Comment from Abdullah ORMAN
Time 03/05/2010 at 2:37 pm
Değerli bilgilerinizi paylaşmanızdan ötürü teşekkürederim. İyi çalışmalar