Vizualizace Traffic Control v Linuxu
Během posledního půlroku jsem se musel hodně zabývat Traffic Control (TC, „regulace síťového provozu”) v Linuxu. Pokročilé možnosti tohoto systému mi doslova vzaly dech. Všestrannost zde samozřejmě má svou obvyklou cenu: složitost. Rozhodně nelituji času, který jsem strávil studiem principů tříd, qdiscs, filtrů, major a minor čísel atd. Myslím si ale, že jsem nalezl způsob, jak s tím vším pracovat jednodušeji.
Chcete-li vidět svou TC konfiguraci v celé kráse, obvykle musíte nechat vypsat qdiscs, třídy a filtry zvlášť a výstupy si v hlavě pospojovat. Například:
$ tc qdisc show dev eth0 qdisc htb 1: root r2q 10 default 10 direct_packets_stat 0 qdisc sfq 10: parent 1:10 limit 127p quantum 1514b perturb 10sec qdisc sfq 11: parent 1:11 limit 127p quantum 1514b perturb 10sec qdisc sfq 19: parent 1:19 limit 127p quantum 1514b perturb 10sec qdisc sfq 31: parent 1:31 limit 127p quantum 1514b perturb 10sec $ tc class show dev eth0 class htb 1:11 parent 1:1 leaf 11: prio 0 rate 256000bit ceil 256000bit burst 15Kb cburst 1599b class htb 1:10 parent 1:1 leaf 10: prio 0 rate 128000bit ceil 128000bit burst 15Kb cburst 1599b class htb 1:1 root rate 10000Kbit ceil 10000Kbit burst 15Kb cburst 1600b class htb 1:31 parent 1:1 leaf 31: prio 0 rate 128000bit ceil 128000bit burst 15Kb cburst 1599b class htb 1:19 parent 1:1 leaf 19: prio 0 rate 512000bit ceil 512000bit burst 15Kb cburst 1599b $ tc filter show dev eth0 filter parent 1: protocol ip pref 1 fw filter parent 1: protocol ip pref 1 fw handle 0x1 classid 1:11 filter parent 1: protocol ip pref 1 fw handle 0x9 classid 1:19 filter parent 1: protocol ip pref 1 fw handle 0x15 classid 1:31
Protože je v konfiguracích TC určitá hierarchie, brzy jsem si TC setupy začal kreslit ve stromech. Nápad nahradit papír a tužku programem Graphviz na sebe nenechal dlouho čekat. Napsat jednoduchý skript, který parsuje výstup tc a tvoří z něho graf, bylo překvapivě snadné. Hle, pohleďte na pýchu 181 řádek Pythonu nesoucích jméno tcviz.
Poznámka: Vlastně jsem někde na síti našel skript v PERLu, který dělal přesně to stejné. Výstup však byl skutečně odporný. Úprava skriptu nepřipadala v úvahu, protože PERLový zdroják vypadal ještě odporněji. Proto jsem přinesl sovy do Athén a napsal kousek vlastního software. Byla to zábava.
Výše uvedená konfigurace může být skriptem tcviz magicky převedena na tento obrázek:
Qdiscs jsou zobrazeny jako obdélníky, třídy jako elipsy. Filtry jsou reprezentovány šipkami, které vedou od rodiče filtru k jeho cíli.
Skript pouze generuje příkazy pro dot (část Graphvizu). Pro skutečné vygenerování grafu musí být výstup tcviz předán programu dot. Například:
$ ./tcviz.py eth0 | dot -Tpng > tc.png
S použitím programu display z balíku ImageMagick je možné graf zobrazit rovnou, bez uložení:
$ ./tcviz.py eth0 | dot -Tpng | display
tcviz je stále v raném stádiu vývoje. Otestoval jsem jej pouze s verzemi tc iproute2-ss060323 a iproute2-ss071016. Je možné, že v jiných verzích je formát výstupu tc odlišný a tcviz mu nebude rozumět. Bug reporty jsou vítány. Mám dokonce i mlhavý plán vývoje, takže v budoucnu mohou přibýt nové možnosti (nejen opravy chyb).
Klidně tcviz vyzkoušejte. Rád uslyším vaše názory a připomínky.
P.S.: Nejlepší studijní materiál k TC je Linux Advanced Routing & Traffic Control.
Přidat komentář
Povolené HTML tagy jsou a, blockquote, em, code, li, ol, p, pre, strong, ul. Odkazy na komenáře ve tvaru „[IV]” nebo „[4]” jsou rozpoznávány automaticky.