Menu:
  :. HomePage
  :. Linux
  :. Solaris
  :. Windows
  :. Programování
  :. Java + Tomcat
  :. HW obecně
  :. VoIP - Asterisk
  :. Cisco - Mikrotik - Síť
  :. O mě
  :. Fotogalerie

 Testovací:
  :. ASP projekt
  :. JSP projekt



 Doporučuji:

Savvy - profesionální webhosting, webdesign a serverhosting
Internetový obchod Stromeček.cz - hardware, software a mobily za super ceny
AirCon Miroslav
Galerie fotek
Notebooky
Webdesign Praha

www.eprdel.cz
www.root.cz
Lumimont

NAVRCHOLU.cz
A



Vaše IP:
3.22.61.246

Praktické využití CBQ

Stále rostoucí požadavky na přenosovou kapacitu sítí, směřují ke zvyšování nákladů na provoz. Jistou alternativou jak čelit tomuto fenoménu, je zvýšení efektivity využívání již existujících technologií. Jednou z možností jak toho dosáhnout je vyhrazení respektive garantování části přenosové kapacity pomocí CBQ (Class-Based Queueing) pro přenos těch dat, u kterých je z pohledu uživatele nízká přenosová rychlost nejméně přijatelná.

Pozn. redakce: rozšířená a upravená verze původního článku.
Úvod
Tento článek si neklade za cíl podrobně rozebírat teorii CBQ, o tom už bylo publikováno mnoho [1], nýbrž na jednoduchém praktickém příkladu vysvětlit postup návrhu a konfigurace.

Požadavky na software
Pro úspěšné zprovoznění CBQ je třeba mít nainstalován následující software:

kernel 2.2.x nebo 2.4.x s přeloženou podporou CBQ,
konfigurační utilitu tc,
inicializační skript cbq.init (není podmínkou, můžete si napsat vlastní nebo volat tc ručně z konzole).
Podpora CBQ v kernelech 2.2.x a 2.4.x
Pro obě verze kernelu (2.2.x a 2.4.x) jsou volby pro překlad stejné. Osobně doporučuji pro experimentování přeložit kernel se všemi volbami v sekci QoS and/or fair queueing. Nicméně pro náš příklad potřebujeme minimálně následující:

CONFIG_NET_SCHED=y
CONFIG_NETLINK=y
CONFIG_RTNETLINK=y
CONFIG_NET_SCH_CBQ=m
CONFIG_NET_SCH_SFQ=m
CONFIG_NET_SCH_TBF=m
CONFIG_NET_CLS=y
CONFIG_NET_CLS_U32=m

To znamená, že pokud máte vše správně přeloženo, měli byste mít k dispozici moduly sch_cbq.o, sch_sfq.o, sch_tbf.o a cls_u32.o.

Konfigurační utilita tc
Konfigurace CBQ se provádí utilitkou tc. Tato utilita Alexeje Kuznětsova je součástí balíku iproute a pokud ji vaše instalace neobsahuje, můžete si ji stáhnout například zde [2].

Inicializační skript cbq.init
A konečně posledním prostředkem k provozování CBQ je inicializační skript. Tento skript volá již zmíněnou utilitu tc s příslušnými parametry. Nejrozšířenějím skriptem tohoto druhu je cbq.init Pavla Golubeva. Pokud se nerozhodnete napsat si vlastní, tak si jej můžete stáhnout zde [3].

Popis konfigurace
Pro podrobné vysvětlení teorie CBQ doporučuji prostudovat dokument [4]. Zde se omezíme pouze na konfiguraci cbq.init. Ta je obsažena v konfiguračních souborech v adresáři /etc/sysconfig/cbq. Syntaxe názvů těchto souborů je následující:

cbq-XXXX.název
kde XXXX jsou dva bajty, určující identifikaci (id) třídy a název je libovolný popis.
Poznámka: při volbě id dbejte na to, aby pořadí tříd odpovídalo prioritám jednotlivých tříd, protože pořadí vytváření tříd je podle jejich id. A pokud se vytvoří třída s nižší prioritou před třídou s vyšší prioritou, může to způsobovat problémy (toto neplatí pro třídy s volbou LEAF=none).
Následuje popis nejdůležitějších voleb (jejich kompletní výpis najdete v úvodní části cbq.init):

DEVICE=ifname,bandwidth,weight
ifname: název rozhraní na kterém se řídí provoz,
bandwidth: fyzická propustnost rozhraní,
weight: 1/10 fyzické propustnosti rozhraní.
RATE
požadovaná rychlost pro třídu.
WEIGHT
1/10 požadované rychlosti pro třídu.
PRIO
priorita třídy od 1 do 8 (nižší číslo znamená vyšší prioritu).
LEAF=none|tbf|sfq
nepovinná volba, zvolení queueing discipline, pokud není specifikováno jinak, používá se tbf. Pro třídy propůjčující svou kapacitu použijte none, pro třídy půjčující si kapacitu od nadřazené třídy použijte sfq.
PARENT
nepovinná volba, určuje id nadřazené třídy v případě, že se od ní bude půjčovat kapacita.
QUANTUM
při použití sfq specifikuje velikost paketu.
BOUNDED=yes|no
nepovinná volba, zakazuje půjčování kapacity od nadřízené třídy (parent), implicitně yes.
RULE=srcip/prefix:srcport,dstip/prefix:dstport
nastavení filtru, určuje, které packety patří do této třídy.
Příklad
A nyní si vše ukážeme na praktickém příkladu, který si jistě dokážete hravě představit. Jste pracovníkem ve firmě XY, která využívá malou LAN připojenou do internetu přes linuxový router linkou 128 kbps (viz obr. 1). Do LAN jsou připojeny pracovní stanice uživatelů. Na těchto stanicích pracujete vy (pro ilustraci vám budeme říkat technik), který se zoufale snažíte přes ssh spojení pracovat na serveru kdesi v internetu a pak několik dalších uživatelů, kteří surfují, stahují mp3, mailují a poslouchají internetové rádio (těm budeme čistě po ilustraci říkat obchodníci). Na vaši žádost o posílení linky do internetu jste od vedení dostal zamítavou odpověd, prý z ekonomickych důvodů... Takže pokud máte rootovské heslo na váš linuxový router, tak vzhůru na obchodníky!


Vaším cílem je nakonfigurovat CBQ na eth1 vašeho routeru tak, aby se pro pakety, které přicházejí z internetu z portu 22 (ssh), garantovala propustnost 64 kbps. V praxi to znamená, že zřídíme třídu pro celou kapacitu internetové linky (A na obr.2), která nebude mít nastaven žádný filtr, ale bude jen propůjčovat svojí nevyužitou kapacitu dvěma podtřídám. Jedna podtřída bude definovat rychlost pro ssh (B na obr.2), druhá pro veškerý ostatní provoz (C na obr.2).


V adresáři /etc/sysconfig/cbq vytvořte následující čtyři soubory:

cbq-1001.internet.all
definuje kapacitu linky do internetu, která se propůjčuje podřízeným třídám:
DEVICE=eth1,10Mbit,1Mbit
RATE=128Kbit
WEIGHT=13Kbit
PRIO=8
LEAF=none

cbq-3001.local
tento soubor sice nepatří do popisovaného příkladu, ale pokud na linuxovém routeru provozujete jakékoliv aplikační služby, tak je žádoucí, aby se provoz mezi routerem a LAN nijak nebrzdil (následující konfigurace předpokládá, že IP adresa eth1 je 10.0.0.1):
DEVICE=eth1,10Mbit,1Mbit
RATE=10Mbit
WEIGHT=1Mbit
PRIO=3
RULE=10.0.0.1/32,10.0.0.0/24

cbq-4001.internet.ssh
zde definujete propustnost pro ssh. Tato definice zachytává veškeré pakety z portu 22 (ssh) do LAN. Rychlost je zde sice definována 64 kbps, ale protože je zde odkaz na cbq-1001.internet.all (direktiva PARENT=1001), tak výsledná rychlost bude od 64 do 128 kbps dle vytížení linky do internetu:
DEVICE=eth1,10Mbit,1Mbit
RATE=64Kbit
WEIGHT=6Kbit
PRIO=4
PARENT=1001
LEAF=sfq
QUANTUM=1514
PERTURB=15
BOUNDED=no
RULE=:22,10.0.0.0/24

cbq-5001.internet.other
tak už zbývá jen definovat pravidla pro všechny ostatní pakety, které nespadají do výše uvedených pravidel. Všimněte si, že tato definice má nižší prioritu (PRIO=5) než cbq-4001.internet.ssh. Je to proto, že množina paketů z portu 22 do LAN je podmnožinou všech paketů do LAN. Kdyby tomu tak nebylo (například byste místo garantování rychlosti pro ssh versus zbytek chtěl garantovat rychlost pro technické oddělení versus obchodní oddělení dle cílových IP), tak by mohla být priorita stejná jako u cbq-4001.internet.ssh:
DEVICE=eth1,10Mbit,1Mbit
RATE=64Kbit
WEIGHT=6Kbit
PRIO=5
PARENT=1001
LEAF=sfq
QUANTUM=1514
PERTURB=15
BOUNDED=no
RULE=10.0.0.0/24

Konfigurační soubory máte vytvořeny. Nyní můžete spustit inicializační script /etc/rc.d/init.d/cbq.init start invalidate

Pro kontrolu a ladění funkčnosti je možné opět využít utilitu tc. Například zadáním tc -s class show dev eth1 obdržíte výpis jednotlivých tříd, včetně počtu přenesených paketů, podle kterého se dá snadno určit zda CBQ pracuje podle vašich představ.

Odkazy na použité zdroje
Teorie CBQ:http://www.aciri.org/floyd/cbq.html
Balík iproute:ftp://ftp.inr.ac.ru/ip-routing/
Skript cbq.init:https://sourceforge.net/projects/cbqinit
Floyd, S., and Jacobson, V., Link-sharing and Resource Management Models for Packet Networks:http://www.icir.org/floyd/papers/link.pdf
 
« Zpět na seznam