Linux Altında QOS - 7- TC ile RED queuing

6 April, 2009 (05:30) | Linux QOS | By: alper

RED algoritmasına daha önce kısaca değinmiştik.

Random Early Detection (RED)

QOS yapılandırmamız ne kadar mükemmel olursa olsun, servislerin ve kullanıcıların internet kullanımına yüklenmesinden dolayı bazı paketlerimiz kuyrukta yığılarak düşürülmek zorunda kalacaktır. RED algoritmasi bize bu meydana gelmeden  hangi paketin düşürüleceğine öncelik tanıma hakkı verir. RED genellikle backbone sistemlerde tercih edilen bir algoritmadır.

Şimdi RED’i biraz daha açalım.

Tüm queuing disiplinlerinde FIFO, PRIO, TBF, SFQ ve HTB gibi, belirlenen değerlerin üzerinde bir paket akışı olursa, FIFO mantığı ile hareket ederek kuyruktaki en son paket düşürülür. bu yüzden tüm bunlar droptail algoritmalar olarakta bilinir. Peki bir çok kaynaktan bir çok paketin gelerek overflow yaptığını, yani qdisc kuyruğundaki paketkerin drop’lanmaya başladığını düşünelim. sistemimiz kuyruğun en sonuna gelen paketleri drop’ladığı için bir çok bağlantıya cevap veremez hale gelecektir. özellikle TCP bağlantılarda bu pek istenen bir durum değildir. söz konusu durum yaşandığında kuyruktaki tüm paketler düşürüleceği için, TCP bağlantılar bant genişliği kullanımlarını düşürecekler buda network performasımızın altında bir değer yaratacaktır.

Biraz daha basite imdirgemeye çalışacağım. flasget,wget,IDM gibi download hızlandırıcıları hepiniz bilirsiniz. standart download yollarıyla yaptığınız downloadlardan belirli bir oranda daha iyi olduklarını gözlemlemişsinizdir. peki bunu nasıl yapıyorlar ?

reed1

Yukardaki şekilde göreceğiniz gibi, kırmızı ile çizilen tcp bağlantı için anlık hızı gösteriyor, yeşil ise avarage yani ortalama hızı gösteriyor. bir TCP bağlantı oluşturulduğunda örneğin http ile dosya download ettiğimizde; TCP olabilecek en yüksek hızı deneyecektir. Bu denenmekte olan hız router’ımızın limitlerinin üzerinde olacaktır. örneğin 56mbit wifi ile bağlandığımız ADSL router’ımızın 1 Mbit olması. bu durumda FIFO da gelen fazla paketin düşürülmesinden başka çıkar yol yoktur. TCP bağlantımız paket kaybını gördüğünde olabilecekten daha hızlı aktarım yapmaya çalıştığını anlayacaktır. yalnız çok büyük paket kayıplarında özellikle  gerçekten ne kadar hızlı aktarım yapması gerektiğini anlayamayaktır. sonuç olarak hız sağlanabilecek değerin çok daha altına inecektir. bir süre sonra TCP yeniden en yüksek değeri deneyecek ve aynı şey tekrar tekrar yaşanacaktır. bizim gerçek download hızımız ise, 1 saniyede elde ettiğimiz maksimum ve minumum dosya aktarım hızlarının ortalamasından  kaybolan paketlerin miktarının çıkartılması sonucu elimizde kalan yeşil ile çizilmiş ortalama değer olacaktır. Download hızlandırıcıların ise genel olarak yaptıkları birden çok bağlantı açarak minumum değerlerin görüldüğü yerlerde başka bir tcp bağlantının daha hızlı transfer yapmasını sağlayıp, bu değerlerin avarage yani ortalamasını yükseltmek olur.

RED’ ile yaptığımız ise, max threshold değeri girerek. bir nevi TCP istemciyi daha önceden uyarıp, paket kayıplarını azaltarak verimi yükseltmektir.

red2

Cisco Sitesinden almış olduğum resim RED’in bu faydasını açık olarak göstermektedir. mavi ile gösterilmiş kontrol edilmeyen trafiğin durumunu ve kesik çizgilerle belirtilmiş ortalama değerini. yeşil ile RED uygulanmış bir bağlantının değerlerini görüyorsunuz. RED’in yaptığı randomize olarak önceden paketleri droplamak olsada, kayıplar kontrolsüz trafikteki kayıplardan çok daha az olduğu için verimi arttırmaktadır. RED genel olarak diğer QOS algoritmaları ile beraber kullanılır. Bu noktada ECN ye değinelim.

ECN nedir ?

ECN , RED ile beraber çalışmakla beraber ana farkı iki ayrı host ( firewall router veya client ) üzerinde çalışır client RED ile paketi düşürmek yerine etiketleyerek server’a gönderir, server client in isteği doğrultusunda gerekiyorsa  bu paketi düşürür. söz konusu ikinci router RED’in yapması gerekeni yaparak optimizasyonu sağlar.

RED ile kullanılan parametreler :

Min : paketlerin kuyrukta biriktiğinde RED tarafından dikkate alınıp işaretlenmesi için gereken minumum değer. birimi byte dır. örneğin : 12000 byte Min değerinin hesaplanması arzu edilen bant geişliği / arzu edilen gecikmedir. örnek verecek olursak. 1024 kbits bağlantımız için 200 ms kuyrukta paketler beklemeye başladığında RED’in drop için işaretlemeye başlamasını  istiyoruz.  hızımız 1024 kbit/s 200ms saniyenin 5/1′i 1024000/5=204800 byte a çevirelim 204800/8=25600byte 1024k bant genişliği arzu edilen en düşük dikkate alınacak 200 ms değeri için atanması gereken Min değeri olur. Bu değeri çok düşürmek efektif bant genişliğimizi düşürür. çok artırmak ise paket gecikmelerini çok yüksek değere taşıyabilir. çok yavaş bant genişliği sağlayan bağlantılarda MTU değeri küçültülerek daha iyi verim alınabilir.

Max : paketlerin kuyrukta birikebileceği en yüksek değer. Bir çok dökümanda Min değerinin 2 katı olmak zorundadır şeklinde değinilmiş, ama hiç bir örnekte uygulanmamış. Cisco dökümanlarının da kaynak olarak kullanılmasıyla çıkmış olduğum sonuç max=3*min veya max=2*min değerleri arasında olmalıdır. Min değerinin hesaplanması ile aynı mantıkla hesaplanabilir Bant genişliği / arzu edilen maksiumum gecikme.

probability : Kuyruktaki paketlerin droplanmak için işaretlenme ihtimali ( yani direk olarak düşürülmesi ), 0.0 1.0 arasıdır. tavsiye edilen değerler 0.01 ve 0.02 dir. ( %1-2 ye denk gelir )

limit : hard limit. kuyrukta bekleyen paketlerin bu ölçüye ulaştığında paket ayırt edilmeksizin hepsinin droplanması amacı ile konulur. limit değeri kesinlikle max + Burst dan fazla olmalıdır. tavsiye edilen hesaplamam max*8 dir örneğin : 32000 byte max için 256000 . limit konulmaması durumunda RED tarafından düşürülen paketler yeterli olmadığı durumlarda ( örneğin DDOS ) kuyruktaki aşırı yığılım kaçınılmaz olacaktır. limit yığılımın belirtilen limit’te kesin olarak sonlandırılmasını sağlar.

burst : paketlerde ani yığılma başladığında, tepe noktaya ulaşmadan önce önlem alınması için yapılması gereken hesaplamalarda kullanılan değerdir. . hesaplama formülü : (min+min+max)/(3*avpkt) dir. burst değeri asla min/avpkt değerinden düşük olmamalıdır.

avpkt : değeri byte’dir. Burst ile birlikte kullanılır. burst ile beraber yaptıkları görev sonuç olarak, kuyruktaki değişimlerin süreleri hesaplanarak. hızlı değişimler olduğunda, kuyrukta yığılıma mahal vermeden önlem almak için gerekli hesaplamalarda kullanılır. 1000 avpkt için iyi bir değer olduğu TC dökümanlarında belirtilmiş.

bandwidth : değeri kilobit/s’dir internet interface’inizin bant genişliğini ifade eder . idle olan zamanlarda, ortalama kuyruk boyutunu hesaplamak için kullanılır. RED bant genişliğinizi kontrol etmez ! opsiyonel olarak kullanılır.

ECN : yukarda ECN’yi açıkladığımız şekilde. RED paketleri drop edebilir veya işaretleyebilir. ECN parametresi kullanıldığında paketler droplanmak yerine işaretlenerek sonraki noktaya gönderilecektir.

Şimdi TC ile RED kullanımına bakalım :

red komut dizimi

Örnek bir uygulama ile çalışır hale getirelim.

1024 Kbits bağlantımız için RED yapılandırmak istiyoruz.resimdeki sarı ile belirtilmiş verileri dolduralım.

ilk olarak min değerimizi hesaplıyoruz : min için istediğimiz değer 200 ms olsun :  hızımız 1024 kbit/s 200ms saniyenin 5/1′i 1024000/5=204800 byte a çevirelim 204800/8=25600byte

min=25600

şimdi max değerimizi hesaplıyoruz : max değerimiz 500ms olsun 1024kbit /500 1/2 saniye 1024000/2=512000 byte a çeviriyoruz. 512000/8=64000byte ( yukarda belirttiğimiz 2-3 katı değerlerine yakın istersek direk olarak 25600*3 kullanabiliriz. )

max=64000

limit değerimiz : max*8 max=64000 bulmuştuk. 64000*8= 512000 bytes

limit=512000

avpkt = önerildiği üzere 1000 kullanalım 1000bytes

avpkt=1000

burst= packets formülümüz (min+min+max)/(3*avpkt) idi yani (25600+25600+64000)/3*1000)=38.4 39 diyelim.

burst=39

probability = tavsiye edilen değer üzerine 0.02 kullanalım

probability = 0.0.2

bandwidht = band genişliğimiz 1024 Kbits ( kbits olarak değer )

bandwidth = 1024


örneğimizi uyguluyoruz :


bash-3.2# tc qdisc add dev wlan0 root red limit 512kb min 25600 max 64kb avpkt 1000 burst 39 probability 0.02 bandwidth 1024
bash-3.2# tc -s -d qdisc show dev wlan0
qdisc red 8005: root limit 512Kb min 25Kb max 64Kb ewma 4 Plog 21 Scell_log 23
Sent 132 bytes 2 pkt (dropped 0, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
marked 0 early 0 pdrop 0 other 0
bash-3.2#

örnekde gördüğünüz üzere, byte değerlerini yazılımı kısaltmak için kbyte a çevirebilirsiniz.

Eğer router’ımız destekliyorsa opsiyonel olarak ECN kullanabiliriz.

tc qdisc add dev wlan0 root red limit 512kb min 25600 max 64kb avpkt 1000 burst 39 probability 0.02 bandwidth 1024 ecn

Write a comment