Networking ve FreeBSD řady 5

20. 9. 2004
Doba čtení: 5 minut

Sdílet

Pátá řada FreeBSD bude obsahovat mimo jiné i novinky v síťování. Jelikož se nám blíží vydání první stabilní verze této řady, popíšeme si implementované novinky v následujícím článku.

Linux guys were pretty much floored that FreeBSD 5.3 can route 1Mpps and they can't do much more than 100kpps. ;-) Yes, way to go!

Tak i takhle vypadaji reakce na nový síťový stack ve FreeBSD 5.3, které je počátkem nové stabilní řady 5 a je každý den blíže (aktuálně to vypadá na začátek října). A protože hned druhé nejběžnější použití (po hraní her samozřejmě) tohoto operačního systému jsou různé síťové servery, neuškodí se podívat, co se v oblasti networkingu změnilo. André Opperman vytvořil presentaci, která tyto novinky a změny popisuje. Následující článek je na této presentaci volně založen a čerpá z ní základní informace.

Firewally

Předchozí verze FreeBSD měly možnost používat dvou firewallových systémů – nativního ipfw, které bylo implementováno jako hack přímo do zpracování netinet packetů, a ipf, které bylo importováno a používalo generickou abstraktní vrstvu takzvaný PFIL. S importem OpenBSD firewallu pf, který taky používá PFIL, bylo rozhodnuto (a posléze implementováno) přepsat ipfw, aby taky používal PFIL framework.

Jak už jsem psal výše, byl do FreeBSD řady 5 naportován OpenBSD firewall pf. Spolu s ním v systému přibyl traffic shaper ALTQ, který dříve existoval jako separátní patch. Osobně považuji kombinaci pf+altq za velmi silnou, přehlednou a ideální pro nasazení. Sám jsem přepsal zhruba 100řádkový iptables skript na 8 řádků v pf, velmi přehledné ;)

Samotný firewall ipfw byl v mnohém vylepšen – nyní umožňuje definovat takzvané množiny pravidel, se kterými pak lze manipulovat jako s celkem, umí filtrovat packety podle jailů (jakési polo-virtuální stroje, které FreeBSD používá pro oddelění různých procesů), dále jsou zde antispoof pravidla a ověřování validity zdroje packetu. Konečně jsme se také dočkali množin a tabulek.

Ve FreeBSD (od verze 4.1) existuje mechanismus KQUEUE, který zajišťuje O(1) implementaci pollingu na různé události. V jednoduchosti nahrazuje O(n) select/poll O(1) implementací (ie. doba vykonání je konstatní oproti době závislé na počtu sledovaných zdrojů událostí). Tento mechanismus byl mimochodem integrován do httpd demona Apache (make install -DWITH_EXPERIMEN­TAL_PATCHES) a slyšel jsem zvěsti o 30% nárůstu výkonu. Ve verzi FreeBSD 5 byla podpora systému KQUEUE zahrnuta i na stav ethernetové linky. Tohoto využijí především routovací démony hlídající, která linka je v provozu a která ne.

Project Evil

Vývojář *BSD William Paul vytvořil emulátor systému NDIS (formát síťových driverů pro Windows XP) a pojmenoval jej Project Evil (projekt zlo ;)). NDISulátor (jak bývá také nazýván) umožňuje použít Windows XP drivery ve FreeBSD, čímž velmi rozšiřuje škálu podporovaného síťového hardwaru (často kritizovaný nedostatek FreeBSD). Osobně bych to na produkčním stroji nikdy nenasadil, ale jako dočasné řešení popř. na doma je to určitě velmi příjemné (však také původní důvod vytvoření byla absence nativních driverů pro WiFi karty).

Náhodná IP ID

Protokol IP má v hlavičce IP packetu definovánu položku ID. Ta se používá pro znovusestavení fragmentovaných packetů, její počáteční hodnota však není nikde specifikována, a tak se obvykle používá jednoduché řešení, kdy jsou id generovány sekvenčně. Tím se však síť vystavuje riziku (pokud chápeme bezpečnost jako lidé z OpenBSD), a proto je ve FreeBSD 5 možnost zapnout náhodné generování tohoto id. (sysctl net.inet.ip.ran­dom_id)

TCP Inflight Bandwidth-Delay Limiter

Vzhledem ke způsobu, jakým funguje protokol TCP (při saturaci linky zmenší okno, které posléze zase zvětšuje přes saturaci, a tak pořád dokola) se stává, že při delších spojeních není linka optimálně využita, a proto si FreeBSD TCP stack udržuje jisté informace o spojení (vlastně rychlost linky), podle kterých poté řídí velikost TCP okna. Prý to při delších spojeních poměrně urychluje přenos. Tato volba je defaultně zapnuta.

RFC3390

Do řady 5 bylo implementováno RFC 3390, které v podstatě zajišťuje rychlejší otevření TCP okna, ie. zrychlení krátkých spojení. Zrychelní je dosaženo tím, že se místo jednoho packetu otevře okno až pro čtyři. Defaultně zapnuto.

Routování

Velmi drasticky byly zmenšeny routovací tabulky, jednak pomocí odstranění některých pozůstatků historických implementací (BSD TCP/IP je 20 let starý), jednak použítím slab alokátoru UMA, který je další výraznou novinkou v řadě 5. Slab alokátor je v podstatě princip alokace paměti pro struktury o stejné velikosti, tyto struktury jsou vlastně předalokovány a předinicializovány, takže vlastní alokace je velmi rychlá. Také je díky zmenšené obecnosti alokátoru (alokujeme jen to, co známe, ne vše) umírněn overhead alokačního procesu.

Přejmenovávání interfaců

FreeBSD tradičně pojmenovává zařízení podle jména driveru, to se týká i síťových karet. Nyní je zde možnost zařízení libovolně přejmenovat, velmi dobré pro přehlednost, nebo pokud vám ethX tak moc schází :)

TCP Hostcache

FreeBSD si pamatuje parametry spojení na různé hosty a podle toho nastavuje parametry dalšího spojení na tento host. Tj. při opakovaných krátkých spojeních je dosaženo výrazné optimalizace a zrychlení.

Správa „mrtvých“ spojení

TCP stack byl dále modifikován tak, že pokud je spojení v zavřeném stavu a už se pouze čeká na timeout, jsou o něm uloženy pouze nezbytně nutné informace místo celého PCB, čímž se dosahuje až 80% úspory paměti jádra. Takto je FreeBSD schopno obsloužit o dost větší počet krátkých spojení (např. při slashdottingu).

SACK

Selective ACK, jak je popsán v RFC 2018, zajištuje při packet loss pouze selektivní retransfer, čímž velmi šetří zašuměnou linku (WiFi např.)

Fastforwarding

Tato novinka zajištuje, že se celý IP packet (při forwardingu) zpracuje v jednom kroku a CPU použije pouze při zpracování IP hlavičky. Nikdy se tedy nefrontuje ani se nedělí jeho zpracování. Výsledkem je až o 60 % vyšší výkon při routování. Pokud si chcete tohle zrychlení vyzkoušet, můžete takto: sysctl net.inet.ip.fas­tforwarding=1 (není defaultně zapnuto).

bitcoin_skoleni

IP options

Protokol IP definuje pole options, které mělo sloužit k různým účelům. Realita je však taková, že se v 99.9 % buď ignorují, nebo některé routery takto modifikované packety dokonce zahazují. Navíc zpracování těchto options není jen zbytečné, ale je i poměrně náročné. Proto byla implementována možnost toto zpracovávání vypnout: sysctl net.inet.ip.pro­cess_options=0 (není defaultně zapnuto).

Všechna tato vylepšení už tak velmi dobrého síťového stacku FreeBSD (spolu s ostatními vylepšenímy) řady 5 z tohoto operačního systému dělají velmi dobrou volbu při rozhodování, co nainstalovat na server. Všem doporučuji FreeBSD minimálně vyzkoušet, popř. nainstalováním betaverze FreeBSD 5.3 pomoci s testováním.