Jak jsem slíbil vytvořil jsem nějaké homemade řešení. Běhá mi to na 751U-HnD. Konfig v příloze.
Zvolil jsem metodu 2. z mého prvního příspěvku. Ve skriptu je pokus odhadnout aktuální rychlost agregované linky. Podle toho je nastaven trafic shaping PCQ. Skript se jmenuje shaping_domacnosti a není nastaven aby se spouštěl po spuštění.
Testoval jsem pouze letmo pomocí torrentu a odezvy. Testoval jsem to na výchozím HTB shapingu, nezkoušel jsem SFQ, ani FIFO metody na hlavním shaperu.
Náznak rovnoměrného rozdělení klientů, snížení latence a zamezení ztrátovosti tam je, ale:
1. procesor to nedává a při změnách rychlosti se objevuje ztrátovost
2. nevyužije to plně agregovanou linku, protože se to pořád drží pod maximální rychlostí
3. pomalu to reaguje kvůli procesoru
Je to před před vydání ničeho co je provozu schopné. Takže nemusíte psát že to má chyby a že je to na hovno, o syntaxi a formátování textu ani nemluvím (Hapi si tuto větu přečte 2x).
Pokud máte nějaké náměty, jak skript zlepšit, tak sem s tím. Zatím budu testovat v jen doma.
:global rychlost 30000; # kb/s
:global rychlostMax 30000; #kb/s
:global IPzatez "www.nix.cz"; # IP adresa na které se projeví packet lost, nebo vyšší zpoždění při přetížení linky
:global getRychlostAktualni do={
:local zacatek [/interface get ether1-gateway rx-byte]
:delay 2
:local konec [/interface get ether1-gateway rx-byte]
:local delta ($konec - $zacatek)
:local vysledek ($delta *8 / 1000 /2)
:return $vysledek
}
:global setRychlost do={
:local cisloDown 0;
:local cisloUp 1;
:set $rychlostUp ( $1 / 3 )
:set $rychlostTemp ( $1 . "k")
/queue tree set max-limit=$rychlostTemp numbers=$cisloDown
:set $rychlostTemp ( $rychlostUp . "k")
/queue tree set max-limit=$rychlostTemp numbers=$cisloUp
:put "rychlost upravena"
}
$setRychlost $rychlostMax
:global getOdezva do={
:return [/ping $1 count=1 interval=40ms]
}
:global setZpomal do={
:set $rychlost ($1 - 1500)
if ($rychlost < 1000) do={
:set $rychlost 1000 }
$setRychlost $rychlost
:return $rychlost
}
#:put [$getRychlostAktualni]
#:put [$getOdezva $IPzatez]
:local kvalita 100;
:do {
if ( [$getOdezva $IPzatez] = 1 ) do={
if ($kvalita < 100) do={
set $kvalita ($kvalita +1)
}
} else={
if ($kvalita > 92) do={
set $kvalita ($kvalita -1)
}
}
if ($kvalita < 93) do={
:set $rychlost [$setZpomal [$getRychlostAktualni]]
}
if ($kvalita < 95) do={
if ($rychlost > 1000) do={
:set $rychlost ($rychlost-50)
$setRychlost $rychlost
}
}
if ($kvalita = 100) do={
if ($rychlost < $rychlostMax) do={
:set $rychlost ($rychlost+50)
$setRychlost $rychlost
}
}
:put ("kvalita je: ".$kvalita)
:delay 1
} while=( true)