Fair Bandwidth Sharing for simple queues

Z Wiki UnArt Slavičín
Skočit na navigaciSkočit na vyhledávání
  • Úkolem tohoto skriptu je pomoc správci s nastavení QoS na jeho APčku.
  • Tento skript ale neřeší vše - pouze dělá tu nejhorší práci - tj nastavuje pravidla pro jednotlivé členy tak, aby všichni měli stejnou garantovanou rychlost.
  • Jediné, co je potřeba ve skriptu změnit, než ho nasadíte na své APčko, je proměnná

usersParent - místo "Ostatni" tam napište jméno přímé rodičovské fronty (třídy), pod kterou máte všechny členy.

  • Než skript spustíte, nastavte si správně hodnoty limit-at a max-limit u všech rodičovských front (tříd). Nastavení rodičovksých front (tříd) musí splňovat následující pravidla:
  1. Základní věc: na AP musí existovat jediná kořenová fronta, která je rodičem všech ostatních. U ní musí být max-limit=limit-at=90% maximální propustnosti spoje do zbytku sítě. Maximální propustnost spoje je různá pro různé stroje, musíte si ji změřit experimentálně (např.: připojte se na ethernet toho AP a zkuste stáhnout něco z FTP, které je co nejblíž místu, kde končí druhá strana spoje).

Bacha! Pokud je vaše AP připojeno na nějaké jiné AP, jehož správce vám "skřípne" konektivitu, pak vám QoS také přestane fungovat (packety se nebudou řadit do front a spravedlivě zahazovat na vašem APčku, ale na tom, která vás omezuje, tam ale už "nespravedlivě"). Propustnost ovlivňuje i výkon CPU - jestliž máte RB532, tak tento stroj asi neudělá 10M upload+10M download - je tam hodně slabé CPU. Realisticky odhaduji tak 12M up+down (záleží to na počtu pravidel ve frontách a ve firewallu). Teďka je otázka co s tím - Simple Queues totiž neumí udělat up+down. Tohle je ten rozdíl od Queue Trees - QueueTrees mají JENOM JEDEN údaj společný pro up+down, Simple Queues mají up a down rozděleno. Moje návrhy:

    1. možnost: místo 10M upload+10download dát např. 3M upload a 9M download (hodnoty je potřeba ověřit experimentálně - pokud dáte víc, nebude QoS fungovat vůbec).

Nevýhoda - zbytečně omezujeme upload i donwload

    1. možnost: předělat všechny AP, které jsou WiFi (ethernetových routerů se to netýká, ethernet je plně duplexní tj. tam zas jedině Simple Queues), na Queue Trees, aby měly up+down dohromady.

Nevýhoda: Kromě záznamů v Queue Trees se bude muset vytvářet záznam i ve firewallu (mangle) - víc práce pro správce, navíc to asi dost podstatně zvětší zátěž CPU - možná ale ne, chtělo by to vyzkoušet (na živém AP vyzkoušet nelze!).

  1. Pokud má APčko více karet/antén, pak pro každou kartu musíte mít frontu, jejíž rodičem bude rodičovská fronta z bodu 1.
  2. Součet hodnot limit-at všech "dětí" musí být roven hodnotě limit-at rodičovské fronty. Abyste to splnili, muselo by limit-at u front všech členů být vypočítáno jako limit-at rodičovské fronty/počet členských front. A při připojení každého člověka byste museli proklikat všechny ostatní členy a limit-at upravit. Jinak řečeno, tohle je nereálně dělat ručně, a k tomu právě slouží následující skript:
#Script name: "Fair Bandwidth Sharing" for simple queues
#Author: Tomas Dulik
#Date: Feb 2008
#Description: This script distributes the value of limit-at of a parent queue equally  
#among all its children 
#
########## Tuto promennou nastav - misto "Ostatni" napis jmeno primo nadrazene (parent) fronty vsech uzivatelu!
:set usersParent "Ostatni"
### nasledujici 2 promenne definuji hodnotu "max-limit", ktera se nastavi vsem uzivatelum
## Pokud je promenna $userDownloadMaxLimit nebo $userUploadLimit = 0, pouzijeme hodnotu max-limit rodicovske fronty 
## (hodnoty muzes ale zadat (v bits/sekundu) tak jak na nasledujicich radcich: 
:set userDownloadMaxLimit 0
:set userUploadMaxLimit 512000
#
########## Tady zacina skript - pokud tomu nerozumis, radsi do ne nerypej
:set usersParentMaxLimit [/queue simple get $usersParent max-limit]
:set slashPosition [:find $usersParentMaxLimit /]
## Pokud neni nastavena promenna $userDownloadMaxLimit, nastavime ji na max-limit  rodicovske fronty
:if ($userDownloadMaxLimit=0) do={
 :log info "max-limit for users' download was not set, using the max-limit of their parent queue..."
##z usersParentMaxLimit musime pomoci ":pick" vysekat max-limit pro download
 :set userDownloadMaxLimit [:pick $usersParentMaxLimit ($slashPosition+1) [:len  $usersParentMaxLimit]]
}
## Pokud neni nastavena promenna $userUploadMaxLimit, nastavime ji na max-limit rodicovske fronty
:if ($userUploadMaxLimit=0) do={
 :log info "max-limit for users' upload was not set, using the max-limit of their parent queue..."
 :set userUploadMaxLimit [:pick $usersParentMaxLimit 0 $slashPosition]
}
#
##usersParentLimitAt bude retezec napr. 1000000/4000000 (tj. upload/download)
:set usersParentLimitAt [/queue simple get $usersParent limit-at]
##z usersParentLimitAt musime vysekat limit-at pro upload:
:set slashPosition [:find $usersParentLimitAt /]
:set usersParentUploadLimitAt [:pick $usersParentLimitAt 0 $slashPosition]
##a take limit-at pro download:
:set usersParentDownloadLimitAt [:pick $usersParentLimitAt ($slashPosition+1) [:len  $usersParentLimitAt]]
#
#### A ted uz zbyva nastavit spravne limit-at a max-limit pro vsechny uzivatele:
### Sestavime si seznam front vsech uzivatelu  (maji parent-a zadaneho prvnim radkem tohoto skriptu]
:set usersQueues [/queue simple find parent=$usersParent]
## spocitame, kolik tech uzivatelu mame:
:set usersCount [:len $usersQueues]
##a vypocitame, jak velky ma byt limit-at pro jednotlive uzivatele:
:set userDownloadLimitAt ($usersParentDownloadLimitAt/$usersCount)
:set userUploadLimitAt ($usersParentUploadLimitAt/$usersCount)
#
#a tady uz to vsem uzivatelum nastavime:
:foreach queue in=$usersQueues do={
 /queue simple set $queue limit-at ($userUploadLimitAt . "/" . $userDownloadLimitAt) max-limit ($userUploadMaxLimit . "/" . $userDownloadMaxLimit) direction both
}