Přiznám se, že moje praktická zkušenost s konfigurací QoSu není nijak velká. Uvádím zde nějaké příklady, které jsem řešil nebo nalezl v dokumentaci a vyzkoušel. Uvítám vaše návrhy, vlastní zkušenosti a praktické konfigurace. Nebo komentáře k uvedeným příkladům. Několikrát jsem narazil na to, že praxe neodpovídala tomu, co jsem čekal dle teorie.
Co můžeme pomocí QoSu dělat?
- omezit provoz - tedy nastavit maximální pásmo, které může být použito
- vyhradit provoz - nastavit minimální (a občas stejné maximální) pásmo, které může být použito
- prioritizovat provoz - upřednostnit nějaký provoz před ostatním, aby nedocházelo ke zpoždění
- třídit provoz - rozdělit provoz do kategorií podle řady parametrů
- spravedlivě rozdělit pásmo - přichází různý provoz a všechen má odejít jedním (pomalejším) portem, můžeme zařídit, aby jeden provoz neobsadil odchozí pásmo a ostatní nebyl pouze zahazován, ale aby se pásmo spravedlivě rozdělovalo
Kde používáme QoS
Nejvíce se QoS využije na hranicích sítí. Standardně máme lokální síť, kde se používají switche a centrální L3 switch, který zařizuje routování. V LAN se používají relativně vysoké rychlosti (100Mbps, 1Gbps) a páteř bývá o řád rychlejší (1Gbps, 10Gbps). Tuto rychlou síť pak spojujeme s další sítí (pobočkou, internetem) přes jednu řádově pomalejší linku (třeba 10Mbps).
V rámci LAN se tedy většinou neobjevují problémy, protože příchozí rychlost je většinou menší než možná odchozí rychlost. Takže zde řešíme spíše omezování rychlosti pro nějaké speciální účely. Problém nastává v místě propojení dále, třeba do WAN. Zde nám často přichází data mnohem rychleji, než je můžeme odesílat. Proto musíme řešit problémy s prioritizací a vyhrazením a rozdělením pásma. Obecně se říká, že nejvíce je třeba řešit QoS na linkách do 768kpbs. Potom linky do 2Mbps a dále vše nad.
Konfiguraci QoSu tedy nejvíce provádíme na routeru (gateway), který propojuje naši LAN s další síti. A potom na přístupovém switchi (access layer), kde příchozí provoz rozdělujeme do kategorií a značkujeme, aby se s ním pak lépe pracovalo na routeru.
Auto-QoS - konfigurační makra
Pozn.: Na routeru je QoS standardně zapnutý. Na switchi je defaultně vypnutý a musí se zapnout pomocí příkazu mls qos
. Pokud ale použijeme Auto QoS, tak se provede i zapnutí QoSu.
Cisco IP telefon
Příklad konfigurace, kdy do portu g1/0/2 je připojen Cisco IP telefon (jeho komunikace jde do VLAN 110) a za ním je zapojeno PC (komunikace se řadí do VLAN 100). Auto QoS nastaví všechny potřebné QoS parametry, takže když se následně podíváme na konfiguraci portu, bude zde několik dalších příkazů (pro zrušení konfigurace stačí použít pouze no auto qos …
a ostatní příkazy se odstraní automaticky). Pro funkci je třeba povolené CDP.
SWITCH(config)#interface g1/0/2 SWITCH(config-if)#switchport mode access SWITCH(config-if)#switchport access vlan 100 SWITCH(config-if)#switchport voice vlan 110 SWITCH(config-if)#auto qos voip cisco-phone SWITCH(config-if)#spanning-tree portfast SWITCH(config-if)#no shutdown
Trunk port na Cisco switch
Příklad konfigurace trunk portu (uplinku do core switche) pomocí IEEE802.1q. Auto QoS zajistí důvěru hodnotám, tedy aby se označení provozu (například pro IP telefonii) přenášelo dále.
SWITCH(config)#interface te1/0/1 SWITCH(config-if)#switchport trunk encapsulation dot1q SWITCH(config-if)#switchport mode trunk SWITCH(config-if)#switchport nonegotiate SWITCH(config-if)#auto qos voip trust SWITCH(config-if)#no shutdown
Označování provozu
Vybírání provozu - router i switch
Jednoduchý příklad, který označuje http provoz. Nejprve vytvoříme ACL, které bude vybírat http
(port 80). Následně vytvoříme class-map http-class
, v které budeme pomocí ACL vybírat provoz. Potom vytvoříme policy-map http-policy
, kde pro provoz vybraný class mapou nastavíme DSCP na AF22. Na konci aplikujeme tuto policy-map
na interface g1/0/1
na příchozí komunikaci.
Pozn.: Pokud bychom chtěli nastavovat COS hodnoty, tak se musí jednat o trunk port.
SWITCH(config)#access-list 101 permit tcp any eq 80 any SWITCH(config)#access-list 101 permit tcp any any eq 80 SWITCH(config)#mls qos SWITCH(config)#class-map http-class SWITCH(config-cmap)#match access-group 101 SWITCH(config)#policy-map http-policy SWITCH(config-pmap)#class http-class SWITCH(config-pmap-c)#set dscp AF22 SWITCH(config)#interface gigabitEthernet1/0/1 SWITCH(config-if)#service-policy input http-policy
Veškerý provoz - switch
Na switchi můžeme nastavit, aby se všechny příchozí pakety označkovaly na danou hodnotu. První příkaz značkuje pouze pakety bez tagu, druhý zařídí přepisování u všech.
SWITCH(config)#interface gigabitEthernet1/0/1 SWITCH(config-if)#mls qos cos 3 SWITCH(config-if)#mls qos cos override
Omezení rychlosti - Rate Management
Rychlost portu
Nejjednodušší možnost, která nemá nic společného s QoSem, je nastavení rychlosti portu. Rychlost portu je defaultně nastavena na auto, kdy se vyjednává rychlost dle připojeného zařízení. Rychlost ale můžeme zadat i manuálně. U gigabitového portu máme k dispozici 10Mbps, 100Mbps a 1000Mbps.
SWITCH(config)#interface g1/0/30 SWITCH(config-if)#speed 10
Na switchi - srr-queue
Jednoduché řešení u switchů, které ale nelze nastavit příliš jemně. Natavují se procenta 10 - 90% z maximální rychlosti interfacu. Takže pro Gigabitový ethernet dosáhneme minima 100Mbps.
SWITCH(config)#mls qos SWITCH(config)#interface g1/0/30 SWITCH(config-if)#srr-queue bandwidth limit 10
Můžeme také použít fintu a zkombinovat srr-queue
spolu s nastavením rychlosti portu a tím se dostat na nižší rychlosti. V následujícím příkladu nastavíme gigabitový port do režimu FastEthernet (100Mbps) a následně omezíme na 20% rychlosti, tedy 20Mbps.
SWITCH(config)#interface g1/0/30 SWITCH(config-if)#speed 100 SWITCH(config-if)#srr-queue bandwidth limit 20
Pomocí policeru na switchi
Zde využijeme metodu zvanou Class Based Policing. Ta omezuje maximální šířku pásma, kterou provoz může spotřebovat. Provádí se to tak, že co je nad zadané pásmo, je ořezáno (pakety jsou zahozeny - drop
, je možno i pouze přeznačkovat pakety). Nijak ale negarantuje minimální pásmo.
Na switchi můžeme použít agregovaný policer (v tomto příkladu, konfigurace na začátku), který následně aplikujeme v jedné policy-map
na více class-map
(nelze aplikovat stejný agregovaný policer na více policy-map!). Hodnoty, které nastavíme, jsou maximem pro součet všech toků, na které se použije. Nebo můžeme použít individuální policer (v druhém příkladu), který se vloží do každé class-map
a omezuje pouze tento tok.
Konfigurace policeru je značně detailní, ale je třeba trochu rozumět použitému algoritmu Token Bucket (popsaný v 3. díle seriálu) nebo prakticky znát jakým nastavením dosáhneme jakých výsledků. V příkladu nastavujeme průměrný datový tok (average rate) a velikost shluku (burst size). I když nastavíme hodnoty správně, tak u TCP budou naměřené hodnoty výrazně nižší (proto se doporučuje nastavovat 2x více než požadujeme) díky chování TCP při zahazování paketů (zmenšování velikosti okna na polovic a následné narůstání rychlosti - provoz pak vypadá jako zuby na pile).
Následující příklad, který pochází z webu Cisco, je určen pro starší switche (C3550), které mají řadu omezení. Zde vybíráme veškerý provoz pomocí dvou ACL pro IP a ne IP provoz. Vytvoříme dvě class-map
, kde využijeme ACL. Potom vytvoříme policy-map
do které vložíme obě class-map
(na interface můžeme aplikovat pouze jednu policy-map pro jeden směr) a použijeme agregovaný policer, který by měl omezovat provoz na 1Mbps (pro lepší výkon nastavíme burst-size na 16kB). Nakonec aplikujeme policy-map
na port Gi1/0/30
.
SWITCH(config)#mls qos SWITCH(config)#mls qos aggregate-policer test-policer 1000000 16000 exceed-action drop SWITCH(config)#access-list 100 permit any any SWITCH(config)#mac access-list extended non-ip-acl SWITCH(config-ext-macl)#permit any any SWITCH(config)#class-map test-ip SWITCH(config-cmap)#match access-group 100 SWITCH(config)#class-map test-non-ip SWITCH(config-cmap)#match access-group name non-ip-acl SWITCH(config)#policy-map police-all-traffic SWITCH(config-pmap)#class test-ip SWITCH(config-pmap-c)#police aggregate test-policer SWITCH(config-pmap)#class test-non-ip SWITCH(config-pmap-c)#police aggregate test-policer SWITCH(config)#interface gi1/0/30 SWITCH(config-if)#service-policy input police-all-traffic
Na novějších switchích (C3750) můžeme předchozí konfiguraci provést jednodušeji. Zkusil jsem předchozí příklad upravit a prakticky vyzkoušet na Catalyst 3750. Zde máme k dispozici příkazy match all
a match interface g1/0/30
, bohužel když použijeme tento výběr, tak výslednou policy-map
nemůžeme aplikovat na L2 interface. Já zkusil využít toho, že veškerý provoz, který nikam nezařadíme, spadá do třídy class-default
, takže jsem omezil tuto třídu.
SWITCH(config)#mls qos SWITCH(config)#policy-map police-all-traffic SWITCH(config-pmap)#class class-default SWITCH(config-pmap-c)#police 1m 16000 exceed-action drop SWITCH(config)#interface gi1/0/30 SWITCH(config-if)#service-policy input police-all-traffic
Nastavení proběhlo vpořádku. Mou představou bylo, že budu omezovat port, na který jsem policer nastavil. Na něm jsem měl připojenou stanici a zkusil jednoduše ověřit rychlost. Pomocí Total Commanderu jsem kopíroval soubor po síti pomocí CIFS protokolu (Windows share). A byl jsem překvapen, provoz byl sice zpomalen (z původních 168Mbps), ale na rychlost asi 22Mbps a já očekával něco hluboko pod 1Mbps. Zkusil jsem jiné nastavení a třeba pro 100kbps policer jsem dosáhl hodnot 3,89Mbps. Chvíli mi trvalo přijít na to proč. Přitom stačí přemýšlet. Já jsem policy-map
nastavil sice na správný interface, ale pouze na jeden směr a to opačný.
Při aplikaci policy-map
na interface můžeme zadat směr input
nebo output
. Všude se uvádí, že input je směr dovnitř interfacu a output ven (což je logické). Ale nikde jsem nenašel, z které strany. Předpokládám, že je to podobně jako u ACL, a na směr se díváme z pohledu switche/routeru, takže co přichází z venku do portu je input a co odchází ze switche skrze port je output. Takže jsem v mém příkladu omezoval odchozí provoz, ale měřil příchozí.
Není nic lehčího než nastavit policy-map
na druhý směr, takže jsem se o to pokusil.
S2NP01(config-if)#service-policy ? input Assign policy-map to the input of an interface output Assign policy-map to the output of an interface S2NP01(config-if)#service-policy output ? WORD policy-map name S2NP01(config-if)#service-policy output police-all-traffic police command is not supported for this interface Configuration failed! Warning: Assigning a policy map to the output side of an interface not supported
Nápověda zobrazuje obě možnosti, ale když se o to pokusíme, tak dostaneme chybovou hlášku, protože policing je možný pouze pro vstupní porty (input). Takže nemůžeme takto omezit stahování dat pro jednoho uživatele připojeného na portu. Buď bychom museli nastavit omezení na port, z kterého data přichází. Nebo můžeme použít dříve uvedené možnosti.
Pozn.: Když jsem vyzkoušel kopírování opačně, že PC na konfigurovaném portu, byl zdroj dat, tak jsem dosáhl lepších výsledků asi 370kbps (čekal bych tedy trošku více).
Pomocí policeru na routeru
Další testování jsem přesunul na router. Zkoušel jsem na malém modelu z nejnižší řady Cisco 871. Routery mají více možností pro CB Policing. Obsahují také Dual Token Bucket algoritmus. Zde již můžeme všechen provoz vybrat pomocí match any
. Na routeru je třeba, aby bylo zapnuté Cisco Express Forwarding (CEF), což je na všech novějších modelech defaultně (CEF se používá i na multilayer switchích).
ROUTER(config)#ip cef ROUTER(config)#class-map all-traffic-class ROUTER(config-cmap)#match any ROUTER(config)#policy-map all-traffic-policy ROUTER(config-pmap)#class all-traffic-class ROUTER(config-pmap-c)#police 1000000 16000 conform-action transmit exceed-action drop ROUTER(config)#interface fastEthernet1 ROUTER(config-if)#service-policy output all-traffic-policy
Router 871 (moje verze) má 4 FastEthernet porty, jako LAN switch a 1 WAN port (také FastEthernet). Já jsem pro testování zapojil dvě PC do portů fa1
a fa2
. Na port fa1
jsem zkusil aplikovat politiku na odchozí směr a vše proběhlo bez chyby. Jenže moje nastavení nemělo žádný efekt, vyzkoušel jsem řadu věcí (i změnu na směr dovnitř), ale pořád nic. Když jsem se podíval na statistiky, tak je vidět, že datový provoz je zaznamenán, ale ignoruje se.
Router#show policy-map interface f1 FastEthernet1 Service-policy output: all-traffic-policy Class-map: all-traffic-class (match-all) 24 packets, 1440 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: any police: cir 1000000 bps, bc 16000 bytes conformed 0 packets, 0 bytes; actions: transmit exceeded 0 packets, 0 bytes; actions: drop conformed 0 bps, exceed 0 bps Class-map: class-default (match-any) 0 packets, 0 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: any
Po řadě zkoušek jsem zkusil jeden počítač zapojit do WAN portu fa4
a na něj nastavit politiku (zde již je možnost pouze na odchozí příchozí směr). A vše začalo fungovat. Když jsem použil kopírování ve správném směru, tak jsem dosáhl kolísavé rychlosti okolo 360kbps.
ROUTER(config)#interface FastEthernet4 ROUTER(config-if)#ip address 192.168.10.1 255.255.255.0 ROUTER(config-if)#service-policy output all-traffic-policy
Vyzkoušel jsem nastavit různé hodnoty policeru a provedl jednoduché měření s kopírováním ze sítě, výsledky jsou v následujícíc tabulce. Měření je hodně nepřesné, ale dává (doufám) základní představu o vlivu zadávaných hodnot na reálnou rychlost. Podle teorie by různé hodnoty burst size měli ovlivnit hlavně nárazové toky (kde se krátce přenáší nějaká data, pak je pauza a pak opět krátce data) a ne stálé kopírování.
average rate - CIR [kbps] | burst size - Bc [kB] | průměrná rychlost kopírování [kbps] |
---|---|---|
nenastaveno | nenastaveno | 60 000 |
1 000 | 32 | 416 (relativně stálá rychlost) |
1 000 | 16 | 360 (skáče od 320 do 390) |
1 000 | 8 | 180 (skáče od 160 do 216) |
1 000 | 1 | kopírování ani nezačalo |
100 | 32 | 88 |
100 | 16 | 85 |
100 | 8 | 83 |
Shaping na routeru
Class Based Shaping je metoda podobná CB Policingu, s tím rozdílem, že se přebytečné pakety hned nezahazují, ale zařazují se do fronty (a teprve při zaplnění fronty se zahazují). Mělo by tedy dojít k lepšímu využití pásma. CB Shaping je dostupný až na vysokých řadách switchů (C3750 jej neobsahuje) nebo na routerech (testoval jsem opět na 871).
Použil jsem stejný příklad jako minule a nastavil shaping na průměrnou hodnotu (average).
ROUTER(config)#class-map all-traffic-class ROUTER(config-cmap)#match any ROUTER(config)#policy-map shape-all-traffic ROUTER(config-pmap)#class all-traffic-class ROUTER(config-pmap-c)#shape average 1000000 ROUTER(config)#interface FastEthernet4 ROUTER(config-if)#service-policy output shape-all-traffic
Výsledek byl proti policingu mnohem lepší, dosáhl jsem stálého datového toku 936kbps. Ještě jsem vyzkoušel použít shaping na špičkovou hodnotu (peak), kdy jsem naměřil 1792kbps.
ROUTER(config-pmap-c)#shape peak 1000000
Vyhrazení pásma a prioritizace provozu
Na ukázku vyhrazení (rezervování) pásma pro určitý provoz, spolu s ukázkou prioritizace určitého provozu, jsem použil opět příklad z webu Cisco. Ten se týká IP telefonie. Pomocí ACL vybíráme VoIP signalizaci (H.323, TCP port 1720) a RTP media stream (což je velký rozsah UDP portů 16384 až 32767). Pro signalizaci vyhradíme pásmo 8kbps. A pro vlastní hlas vyhradíme a prioritizujeme 48kbps.
ROUTER(config)#access-list 102 permit udp any any range 16384 32767 ROUTER(config)#access-list 103 permit tcp any eq 1720 any ROUTER(config)#access-list 103 permit tcp any any eq 1720 ROUTER(config)#class-map voice-signaling ROUTER(config-cmap)#match access-group 103 ROUTER(config)#class-map voice-traffic ROUTER(config-cmap)#match access-group 102 ROUTER(config)#policy-map voice-policy ROUTER(config-pmap)#class voice-signaling ROUTER(config-pmap-c)#bandwidth 8 ROUTER(config-pmap)#class voice-traffic ROUTER(config-pmap-c)#priority 48 ROUTER(config)#interface fastEthernet4 ROUTER(config-if)#service-policy output voice-policy
Vyhrazení pásma
Pro garanci určitého pásma se používají fronty (queue). V tomto případě využijeme Class Based Weighted Fair Queuing (CBWFQ), které umožňuje rezervovat určité pásmo pro třídu. Ve výše uvedeném příkladu se jedná o následující příkaz.
ROUTER(config-pmap-c)#bandwidth 8
Můžeme kombinovat i s lepší metodou zahazování paketů při přeplnění front (aby nenastal efekt popsaný dříve - TCP si snižuje velikost okna a pak zas zvětšuje), jedná se o Weighted Random Early Detection (WRED). WRED můžeme použít i u policingu, ale můj malý router 871 jej nepodporuje. WRED funguje tak, že méně významný provoz zahazuje dříve než dojde k zahlcení. Následující příkaz využívá pro rozdělení IP Precedence.
ROUTER(config-pmap-c)#random-detect
Prioritizace provozu
Pokud chceme nějaký provoz upřednostnit před ostatním (například hlas), tak opět využijeme fronty a metodu zvanou Low Latency Queuing (LLQ). Ta vychází z CBWFQ, takže máme provoz s garantovaným pásmem a ten prioritizujeme. Přidává striktně prioritní frontu (nízká latence). V případě zahlcení i omezuje provoz na danou hodnotu. V předchozím příkladu se jednalo o příkaz.
ROUTER(config-pmap-c)#priority 48
Komentáře
LLQ nejen i omezuje,ale ono hlavne omezuje - viz hard QoS.
Jinak by totiz neslo zabezpecit konstani zpozdeni. Obecne pokud je pouzito LLQ, melo by byt pouzito i CAC(call admision control),takze ikdyz neni zacpa, nemuzou aplikace v LLQ vyuzivat vic,nez maji prideleny(nutny predpoklad je, ze CAC i LLQ musi byt v souladu,jinak by to nemelo vyznam)
ale hezky napsane
slinti
Ahoj, máš vynikající články! Uplně jsem se vtom zapotal...
Mám tu na experimentování jeden starší router 1760 a chtěl jsem se zeptat když bych chtěl omezit rychlost linky na IP adresu jak se tohle udělá?
Dobrý den, mám switch c2950 s posledním IOSem a potřebuji omezit rychlost na jednotlivých portech, stačí s přesností + - třeba 5Mbit. Je nekdě nějaký návod ? Podle tohoto článku se mi nedaří.
Jinak Super stránky, již mi mnohokrát pomohly.
Předem Moc Děkuji. Petr.
odpověď na [3]Petr: Nemám s 2950 žádné zkušenosti, ale co jsem nahlédl do dokumentace, tak skoro nic nepodporuje , takže to asi bude problém.
Ahoj,
`srr-queue bandwidth limit X` je mozne uplatnit iba v smere input. Testovane na catalyst 2960.
odpověď na [5]najt: Potvrzuji, bohužel je to tak. Lze jen input směr. Já to řeším tak, že nastavuji omezení linky mezi dvěma switchi stejnou konfigurací limitu na obou portech.
Omezit VOIP provoz na range portu 16384 az 32767 neni spatny napad ale pozor aby ti zamestnanci nezacali hrat napr. Call of Duty nebo Half - life :D
BTW. super popis QOS