Fair Bandwidth Sharing for simple queues: Porovnání verzí

Z Wiki UnArt Slavičín
Skočit na navigaciSkočit na vyhledávání
Bez shrnutí editace
Bez shrnutí editace
Řádek 9: Řádek 9:
# 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:
# 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
#Script name: "Fair Bandwidth Sharing" for simple queues
#Author: Tomas Dulik
#Author: Tomas Dulik
#Date: Feb 2008
#Date: Feb 2008
#Description: This script distributes the value of limit-at of a parent queue equally among all its children  
#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!
########## Tuto promennou nastav - misto "Ostatni" napis jmeno primo nadrazene (parent) fronty vsech uzivatelu!
:local usersParent "APStaraSkola"
:local usersParent "APStaraSkola"
### nasledujici 2 promenne definuji hodnotu "max-limit", ktera se nastavi vsem uzivatelum
### 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  
## 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:  
## (hodnoty muzes ale zadat (v bits/sekundu) tak jak na nasledujicich radcich:  
:local userDownloadMaxLimit 4000000
:local userDownloadMaxLimit 4000000
:local userUploadMaxLimit 1000000
:local userUploadMaxLimit 1000000
:local burstLimit 2000000/5000000
:local burstLimit 2000000/5000000
:local burstThreshold 900000/2500000
:local burstThreshold 900000/2500000
:local burstTime 20s/20s
:local burstTime 20s/20s
########## Tady zacina skript - pokud tomu nerozumis, radsi do ne nerypej
########## Tady zacina skript - pokud tomu nerozumis, radsi do ne nerypej
:set usersParentMaxLimit [/queue simple get $usersParent max-limit]
:set usersParentMaxLimit [/queue simple get $usersParent max-limit]
:set slashPosition [:find $usersParentMaxLimit /]
:set slashPosition [:find $usersParentMaxLimit /]
## Pokud neni nastavena promenna $userDownloadMaxLimit, nastavime ji na max-limit rodicovske fronty
## Pokud neni nastavena promenna $userDownloadMaxLimit, nastavime ji na max-limit rodicovske fronty
:if ($userDownloadMaxLimit=0) do={
:if ($userDownloadMaxLimit=0) do={
  :log info "max-limit for users' download was not set, using the max-limit of their parent queue..."
  :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
##z usersParentMaxLimit musime pomoci ":pick" vysekat max-limit pro download
  :set userDownloadMaxLimit [:pick $usersParentMaxLimit ($slashPosition+1) [:len $usersParentMaxLimit]]
  :set userDownloadMaxLimit [:pick $usersParentMaxLimit ($slashPosition+1) [:len $usersParentMaxLimit]]
}
}
## Pokud neni nastavena promenna $userUploadMaxLimit, nastavime ji na max-limit rodicovske fronty
## Pokud neni nastavena promenna $userUploadMaxLimit, nastavime ji na max-limit rodicovske fronty
:if ($userUploadMaxLimit=0) do={
:if ($userUploadMaxLimit=0) do={
  :log info "max-limit for users' upload was not set, using the max-limit of their parent queue..."
  :log info "max-limit for users' upload was not set, using the max-limit of their parent queue..."
  :set userUploadMaxLimit [:pick $usersParentMaxLimit 0 $slashPosition]
  :set userUploadMaxLimit [:pick $usersParentMaxLimit 0 $slashPosition]
}
}
##usersParentLimitAt bude retezec napr. 1000000/4000000 (tj. upload/download)
##usersParentLimitAt bude retezec napr. 1000000/4000000 (tj. upload/download)
:set usersParentLimitAt [/queue simple get $usersParent limit-at]
:set usersParentLimitAt [/queue simple get $usersParent limit-at]
##z usersParentLimitAt musime vysekat limit-at pro upload:
##z usersParentLimitAt musime vysekat limit-at pro upload:
:set slashPosition [:find $usersParentLimitAt /]
:set slashPosition [:find $usersParentLimitAt /]
:set usersParentUploadLimitAt [:pick $usersParentLimitAt 0 $slashPosition]
:set usersParentUploadLimitAt [:pick $usersParentLimitAt 0 $slashPosition]
##a take limit-at pro download:
##a take limit-at pro download:
:set usersParentDownloadLimitAt [:pick $usersParentLimitAt ($slashPosition+1) [:len $usersParentLimitAt]]
:set usersParentDownloadLimitAt [:pick $usersParentLimitAt ($slashPosition+1) [:len $usersParentLimitAt]]
#### A ted uz zbyva nastavit spravne limit-at a max-limit pro vsechny uzivatele:
#### 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]
### Sestavime si seznam front vsech uzivatelu  (maji parent-a zadaneho prvnim radkem tohoto skriptu]
:set usersQueues [/queue simple find parent=$usersParent]
:set usersQueues [/queue simple find parent=$usersParent]
## spocitame, kolik tech uzivatelu mame:
## spocitame, kolik tech uzivatelu mame:
:set usersCount [:len $usersQueues]
:set usersCount [:len $usersQueues]
##a vypocitame, jak velky ma byt limit-at pro jednotlive uzivatele:
##a vypocitame, jak velky ma byt limit-at pro jednotlive uzivatele:
:set userDownloadLimitAt ($usersParentDownloadLimitAt/$usersCount)
:set userDownloadLimitAt ($usersParentDownloadLimitAt/$usersCount)
:set userUploadLimitAt ($usersParentUploadLimitAt/$usersCount)
:set userUploadLimitAt ($usersParentUploadLimitAt/$usersCount)
#a tady uz to vsem uzivatelum nastavime:
#a tady uz to vsem uzivatelum nastavime:
:foreach queue in=$usersQueues do={
:foreach queue in=$usersQueues do={
  /queue simple set $queue limit-at ($userUploadLimitAt . "/" . $userDownloadLimitAt) \
  /queue simple set $queue limit-at ($userUploadLimitAt . "/" . $userDownloadLimitAt) \
  max-limit ($userUploadMaxLimit . "/" . $userDownloadMaxLimit) \
  max-limit ($userUploadMaxLimit . "/" . $userDownloadMaxLimit) \
  burst-limit $burstLimit burst-threshold $burstThreshold burst-time $burstTime \
  burst-limit $burstLimit burst-threshold $burstThreshold burst-time $burstTime \
  direction both
  direction both
}
}

Verze z 10. 2. 2008, 19:29

  • Ú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
    2. 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!).
  2. 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.
  3. 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:
  1. 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!
:local usersParent "APStaraSkola"
### 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: 
:local userDownloadMaxLimit 4000000
:local userUploadMaxLimit 1000000
:local burstLimit 2000000/5000000
:local burstThreshold 900000/2500000
:local burstTime 20s/20s
########## 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) \
  burst-limit $burstLimit burst-threshold $burstThreshold burst-time $burstTime \
  direction both
}