Generátor sítového provozu Přemysl Hrubý, HRU221 Abstrakt: Nalezení nebo naprogramování (v přenositelném jazyce) konfigurovatelného generátoru provozu simulátoru zátěže charakteristické pro různé typy služeb. Generátor musí běžet v OS Linux. Klíčová slova: sít, Linux, provoz, generování 1 Úvod..............................................................................................................................2 2 Vlastní řešení.................................................................................................................2 2.2 Server.....................................................................................................................2 2.2 Klient......................................................................................................................3 2.3 Vyhodnocovací program........................................................................................3 Instalace a požadavky pro provoz.....................................................................................5 Testování...........................................................................................................................5 Závěr.................................................................................................................................5
červen 2008
1/5
1 Úvod Účelem této práce bylo nalézt nebo naprogramovat použitelný a konfigurovatelný generátor provozu na úrovňi generování datových toků, ne paketů. Práci jsem započal průzkumem již hotových řešení. Ty se pro toto použití ukázaly jako nevhodné ať už z důvodu zaměření na přenášení již zachycených paketů (Mauszahn, projekt PATH, bittwist, packeth), obtížné konfiguraci (generátor paketů jenž je součástí jádra OS Linux) nebo zaměřením spíše na generování velkého počtu spojení a testování latencí apod. (uPerf). Proto jsem se rozhodl pro tvorbu vlastního generátoru provozu.
2 Vlastní řešení Samotný výsledný program je rozdělen do celkem tří částí: server, klient a program na vyhodnocení výsledků. Server je program, který načte konfiguraci, provede spojení se všemi klienty dle uvedené konfigurace a začne generovat datový provoz. Po ukončení testu pak server od klientů stáhne naměřené údaje a uloží je k pozdějšímu zpracování. Klient je program, který přijímá testovací datové streamy a umožňuje jejich měření. Program pro zpracování výsledku je v aktuální podobě představován vykreslením průběhu testu do podoby grafu přenosové rychlosti v čase. Pro potřeby prototypování a ověrování funkce správného časování odesílání paketů jsem nejdříve zvolil programovací jazyk Perl. Po zjištění, že i v tomto lze dosáhnout dostatečných rychlostních limitů jsem upustil od původní myšlenky generatoru psanem v C/C++ a celý projekt je tak psán v Perlu. To poskytuje výhodu v rychlosti vývoje a jednoduché rozšiřitelnosti.
2.2 Server Funkcí serveru je provádět samotné testování dle zadané konfigurace. Na příkazové řádce přijímá několik parametrů: ● p port – definuje port na kterém probíhá komunikace s klienty (default je „9988“) ● c configfile – definuje alternativní konfigurační soubor (default je „config“) ● h – vypíše nápovědu ● o outfile – definice výstupního souboru, do kterého se uloží naměřené výsledky (povinný parametr) Jako jazyk pro konfigurační soubor byl zvolen Perl, čímž je možné jednoduchým a přehledným, ale přitom silným a rozšiřitelným způsobem konfigurovat. Ukázka konfiguračního souboru: streams => { local1 => "udp/127.0.0.1:4000", remote1 => "udp/192.168.100.1:4000", remoteTcp => "tcp/192.168.100.2:4004" }, 0 => { local1 => [15000, 500], remote1 => [15000, 500], remoteTcp => [15000, 500], }, 10 => { local1 => undef, }, 15 => { remote1 => [150000, 1000], remoteTcp => [150000, 1000], }, 25 => undef červen 2008
2/5
Tento konfigurační soubor definuje celkem 3 datové streamy – dva typu UDP, jeden pak typu TCP. Všechny tyto datové streamy jsou v čase 0 testu nastaveny na generování dat rychlostí 15000 B/s s velikostí datového zápisu 500B. V čase 10s je pak stream pojmenovaný local1 vypnut. V čase 15s jsou pak změněny parametry dvou zbývajících streamů na 150000 B/s a velikost zápisu 1000B. Celý test je pak ukončen po 25s běhu. Celý konfigurační soubor se skládá ze sekcí, oddělených čárkami. Sekce, jejíž název je složen pouze z číslic, představuje změnu konfigurace v daném čase běhu testu. Jeli místo obsahu sekce uvedeno klíčové slovo undef, je ukončen test. V opačném případě probíha změna parametrů zadaných streamů. Změna se provádí takto: nazevStreamu => [bandwidth, writeSize] Takto nastavíme jak přenosovou rychlost v B/s, kterou se mají data generovat, tak i velikost bloku dat, které se posílají najednou. Speciální sekcí je sekce se jménem streams. Pomocí této sekce definujeme streamy a jejich vzdálené koncové body a použitý přenosový protokol. Záznamy jednotlivých streamu jsou opět oddělovány čarkami. Definice streamu se provádí takto: nazevStreamu => 'protokol/vzdalenaStrana:port' Název streamu je limitován pouze na alfanumerické znaky, bez omezení délky. Podporované protokoly jsou TCP a UDP. Vzdálenou stranu lze zadat jak pomocí IP, tak pomocí DNS jména. Po spuštění programu je načtena konfigurace a po zjištění ze je syntakticky spravně, a obsahuje jen a právě potřebné údaje (kontrola sekcí, použití nedefinovaných streamů apod.) se začnou postupně kontaktovat klientské testovací programy (z toho plyne, že testovací server je možno spustit až po spuštění všech testovacích klientů). Po úspěšném navázání spojení se všemi klienty a po předání konfigurace (na kterých portech mají naslouchat) započne samotný test v jehož průběhu jsou odesílána data klientským stranám. Po skončení testu jsou ze všech klientů stažena naměřená data. Ty je pak možno dalším programem vykreslit do podoby grafu přenosové rychlosti v čase.
2.2 Klient Klient po spuštění čeká na spojení ze serveru. Po jeho uskutečnění dostane konfiguraci a začne naslouchat na zadaných portech. Po obdržení signálu pro započetí testu pak začne přijímat data z datových spojení a měřit čas příchodu a velikost dat. Tyto údaje pak po skončení testu předává zpět serveru. Klient dále přijímá tyto možnosti skrze parametry příkazové řádky: • p port – port na kterém bude klient očekávat spojení od serveru • h – vypíše nápovědu
2.3 Vyhodnocovací program Tento program provádí vyhodnocení naměřených dat jejich vykreslením do grafu přenosové rychlosti v čase. Při vykreslování je na naměřená data aplikováno vyhlazení pomocí plovoucího průměru. Program přijímá tyto parametry příkazové řádky: • o soubor.png – udává jméno souboru, do kterého bude uložen graf • r resultFile – udává cestu k souboru s výsledky naměřenými pomocí testovacího programu • s časVSekundách – specifikuje s jakou přesností bude graf vykreslen (tj. hustotu bodů) • a časVSekundách – udává interval pro aplikaci plovoucího průměru • S šířka,výška – udává (v pixelech) velikost vykreslovaného grafu • h – vypíše nápovědu Ukázka vytvořeného grafu pro celkově 6 streamu:
červen 2008
3/5
Tento graf je výsledkem měření za pomocí konfiguračního souboru: streams => { local1 => "udp/127.0.0.1:4000", local2 => "udp/127.0.0.1:4001", local3 => "udp/127.0.0.1:4002", remote1 => "udp/192.168.100.1:4000", remote2 => "udp/192.168.100.1:4001", remote3 => "udp/192.168.100.1:4002", }, 0 => { local1 => [15000, 500], local2 => [15000, 500], local3 => [15000, 500], }, 5 => { remote1 => [15000, 500], remote2 => [15000, 500], remote3 => [15000, 500], }, 10 => { local1 => undef, local2 => undef, remote1 => undef, remote2 => undef, }, 15 => { local3 => [150000, 1000], remote3 => [150000, 1000], }, 25 => undef červen 2008
4/5
3. Instalace a požadavky pro provoz Instalace zpočívá pouze v nakopírování souboru z distribuce. Na klientských stranách je pak potřeba pouze soubor paclient.pl. Program využívá modulů zahrnutých jako CORE moduly Perlu, jsou tedy dodávány vždy již v distribuci perlu. Jedinou vyjímkou je modul File::Temp. Tento modul je však hojně instalován, bývá součástí balíku podpůrných, automaticky instalovaných, modulů většiny moderních Linuxových distribucí. Pro vykreslování grafů je pak ještě zapotřebí mít nainstalovaný program Gnuplot.
4. Testování Ověření funkčnosti jsem prováděl na několika různých PC, s různými distribucemi OS Linux a Perlu samotného. Testování probíhalo na architekturách x86 a x8664. Samostatně pak byl proveden výkonostní test kde serverem bylo PC kancelářské kvality – CPU Celeron 2.6GHz, 512MiB RAM, běžná síťová karta. Maximální stabilní dosaženou hodnotou bylo generování přibližně 56Mbit/s datového toku, s velikostí zápisu 1000B. Toto množství odpovídá 7000 paketům za vteřinu.
5. Závěr Díky použití Perlu je program jednoduše rozšiřitelný. Při potřebě generování větších datových toků by však zřejmě bylo vhodné program přepsat například do jazyka C. Použitý komunikační protokol mezi klienty a serverem, stejně jako format souboru s výsledky je čistě textový. Jeho formát ja pak zdokumentován ve zdrojovém kodu.
červen 2008
5/5