V posledních přibližně sedmi letech se veškerý vývoj ve FreeBSD zaměřoval na podporu počítačů s více procesory. V řadě 5 byla představena základní podpora, která fungovala, ale nepříliš optimálně a nepřinášela velké zlepšení. Poté přišla řada 6, která se snažila, aby SMP nejen fungovalo, ale i fungovalo dobře. To se povedlo a teď přichází řada 7 jejímž hlavním mottem je „SMP, které funguje rychle“. Jak toho bylo dosaženo a co dalšího přináší FreeBSD 7?
Vylepšená podpora pro více procesorů
Hlavní motivací pro vývoj FreeBSD v posledních několika letech byla kvalitní podpora počítače s více procesory. Tato práce se zaměřila na fine-grained zamykání kernelu, podporu pthread vláknové knihovny, scheduleru atd. Po několik releasů FreeBSD byla tato podpora nedokončena a tudíž nebyla optimální, a právě ve FreeBSD 7.0 se toto úsilí v podstatě dokončilo a přineslo své plody. Co se tedy změnilo v této oblasti?
Nový ULE scheduler
ULE scheduler ve FreeBSD 5 a 6 byl nedokončený projekt Jeffa Robersona. Tento projekt však nepodával přesvědčivý výkon a měl spoustu problémů. Ve verzi FreeBSD 7.0 byl scheduler kompletně přepsán, a to dokonce dvakrát. Podstatnou změnou je výrazně lepší podpora pro mnoho procesorů, které se dosáhlo rozbitím jednoho velkého scheduler zámku na mnoho malých, jeden pro každý thread. Nyní ULE podává velmi přesvědčivý výkon a neobsahuje žádné chyby. Pro více procesorové stroje (od řekněme 4×CPU určitě) jiný scheduler nedává smysl. Tento scheduler je doporučen i pro desktopové použití, typicky s jedním procesorem. Další informace naleznete v mailing listu FreeBSD.
Nová implementace malloc()
Dlouholetý vývojář FreeBSD Jason Evans implementoval nový malloc(). Tento, takzvaný jemalloc, se od předchozího (phkmalloc) liší hlavně designem příznivým pro SMP, ale opravuje i některé jiné problémy phkmallocu. Obecně ve srovnání například s malloc() implementovaným v glibc (tj. tom který obsahuje 99 % linuxových distribucí) podává daleko vyrovnanější a lepší výsledky v SMP prostředí. Více v přednášce Jasona Evanse.
Změna standardní threadovací knihovny
FreeBSD verze 5 a 6 implementovalo „defaultní threadovací knihovnu“ na modelu M:N, kde se M user-space threadů mapuje na N kernel threadů. Tento model má své teoretické výhody, ovšem vzhledem k tomu, že Linux ho nepodporuje, se většina aplikací programuje pro 1:1 model, což v praxi znamená špatnou výkonnost s touto threadovací knihovnou. Paralelně s M:N knihovnou (takzvaná libkse) byla vyvinuta 1:1 knihovna. Mnozí ví, že přepnutím na tuto libthr knihovnu se zvedl výkon například MySQL o desítky procent. A právě tato libthr knihovna implementující 1:1 threadovací model byla zavedena jako defaultní.
Další SMP vylepšení
V průběhu vývoje FreeBSD 7.0 se Kris Kennaway zaměřil na výkon MySQL a z tohoto úsilí vzniklo několik patchů, které významně zvyšují výkon MySQL, a nejen jej. Bylo zlepšeno zamykání file descriptorů, unix socketů atd. Byla reimplementována některá zamykací primitiva, scsi subsystém byl fine-grained zamčen a integrovalo se mnoho dalších menších vylepšení.
Výkon SMP
Všechny tyto změny měly velmi pozitivní vliv na výkon FreeBSD v konfiguraci s více procesory. Například výkon DNS software BIND se oproti FreeBSD 6.X zvedl zhruba 2 - 4×. Výkon MySQL se zvedl také velmi výrazně. Dokonce se tento výkon pohybuje výrazně nad úrovní Linuxu (hlavně díky problémům s glibc mallocem). Stačí nahlédnout do grafu. Vylepšení výkonu se samozřejmě neomezuje na BIND a MySQL, ovšem na těchto aplikacích bylo zlepšení měřeno, vynikající výsledky se dají očekávat i jinde.
Zlepšení v síťové oblasti
Další oblastí, ve které ma FreeBSD dlouhou tradici uspěchů, je oblast síťování. Zde se událo také několik zajímavých věcí.
Zlepšení core algoritmů
V roce 2005 se Andre Opperman zaměřil na identifikaci málo propustných algoritmů v síťovém stacku FreeBSD. Plodů jeho práce jsme se dočkali ve FreeBSD 7.0 a doopravdy stojí za to. Andre se hlavně zaměřil na subobptimální výkon sendfile, který se mu podařilo zvýšit až 5×. Také implementoval podporu pro automatické nastavování velikosti in/out tcp bufferů. Vylepšeno bylo i několik dalších věcí. Tyto změny spolu s podporou pro TSO/LRO umožnily FreeBSD dosahovat vynikajících výsledku v 10gbps sítích.
Zlepšení podpory síťového hardwaru
Ve FreeBSD 7 byla implementována podpora několika hardwarových novinek, které výrazně zvedají výkon síťových aplikací. Jedná se o již zmiňované TSO/LRO. Tato vylepšení přesunují část zpracování TCP/IP na hardware síťové karty, tudíž samozřejmě zvyšují výkon. Mezi další vylepšení je třeba počítat změnu zpracování přerušení. Paolo Pisati implementoval takzvaný interrupt filtering mód, kdy příslušný driver implementuje pouze „filter“, který určí, zda se zajímá o zpracováni přerušení. Další zpracování je odloženo. V neposlední řadě John Baldwin implementoval podporu pro MSI a MSI-X, což je další změna v hardwarovém zpracování přerušení, kdy je přerušení realizováno pomocí zápisu do určitého segmentu paměti.
Protokol SCTP
Nový protokol SCTP, který je aktuálně vyvíjen, se primárně vyvijí na FreeBSD, a tak je zde podpora asi nejkvalitnější. SCTP je protokol určený jako náhrada za TCP, mezi jeho výhody patří multihoming, lepší výkon v zarušených prostředích atd. Podrobnosti najdete například na Wikipedii. V současné době probíhá velmi rychlý vývoj SCTP a změny se rychle integrují do FreeBSD. Pokud máte zájem o využití tohoto protokolu, doporučují sledovat vývoj blíže.
Výkon síťování
Všechna vylepšení v oblastí síťování zlepšila výkon FreeBSD v této oblasti tak, že je nyní schopno saturovat 10gbps linku, např. v případě odesílání souboru pomocí sendfile. Bohužel některé zajímavé novinky jako např. polling nové generace (lepší výkon v SMP), virtuální síťový stack nebo podpora pro multi-queue síťové karty, se do 7.0R nedostaly, což je ovšem příslibem ještě lepšího výkonu ve FreeBSD 8.
Souborový systém ZFS
Asi nejžhavější novinkou ve FreeBSD 7.0R je experimentální podpora pro souborový systém ZFS. ZFS je nový systém od firmy Sun, který se vyznačuje velmi zajímavými vlastnostmi, jako je built-in volume manager, scrubbing špatných bloků, crc součty bloků, neexistence fsck, vysoká rychlost atd. Podrobnosti například na Wikipedii. K podpoře ZFS nutno dodat, že je stále považována za experimentální a tudíž se nedoporučuje vzít datový sklad vaší banky a přemigrovat ho na ZFS, ovšem na druhou stranu ZFS ve FreeBSD je velmi slušně stabilní i rychlé. Pawel Jakub Dawidek na ZFS stále velmi aktivně pracuje a lze tedy očekávat další vylepšení v budoucnu.
Další diskové novinky
Z NetBSD byl naportován paměťový souborový systém tmpfs, který je efektivnější než současný mdmfs, ovšem podpora je ještě ne zcela stabilní. V rámci Summer of Code 2006 Ivan Voras implementoval geom třídu gvirstor, která virtualizuje diskový prostor, tj. vytvoříte 100T „disk“ a až v případě potřeby se staráte o to, kde sehnat fyzické disky. Další zajímavou geom třídou uvedenou ve FreeBSD 7 je gmultipath, který umožňuje fail-over disků, tj. zaalokujete N disků jako gmultipath device a v případě, že první disk selže, použije se druhý atd. až do N. V neposlední řadě je třeba zmínit gjournal, což je obecná žurnálovací vrstva do geomu, která umožňuje data-journaling pro libovolný souborový systém (je-li v tomto triviální podpora). Ve FreeBSD 7.0R je implementována podpora pouze pro souborový systém UFS. Poslední novinkou, kterou zmíním, je implementace iSCSI protokolu, což je scci protokol tunelovaný přes IP.
Další novinky
FreeBSD 7 nově funguje na platformách ARM a sun4v. ARM je zajímavá embedded platforma, kde se v poslední době FreeBSD a obecně BSD hodně používá a sun4v jsou velké serverové stroje od firmy Sun. Joseph Koshy implementoval knihovnu umožnující monitorování statistik procesoru (počet instrukcí, tlb flushes atd.). Byla výrazně rozšířena podpora HW o nové síťové karty, chipsety, zvukové karty (HDA) atd. Zajímavou funkcí je rozšíření podpory pro audit systému v rámci OpenBSM. V neposlední řadě byla vylepšena podpora pro běh linuxových aplikací tak, že nyní experimentálně podporuje emulaci Linuxu 2.6.
Výhled do budoucna
Bohužel některé dlouho očekávaná vylepšení nebyla do FreeBSD 7 integrována. Jedná se hlavně o superpages, což je způsob organizace paměti, při kterém se používá několik velikostí paměťových stránek naráz. Vysledkem je výrazně lepší využití TLB pamětí (tlb coverage) a tím i lepší výkon systému, viz superpages .
Současný stav kolem superpages je takový, že základní podpora (jiný fyzický alokátor paměti) byla integrována do FreeBSD 7 a superpages se očekávají ve FreeBSD 8. Další významnou novinkou, kterou můžeme očekávat až ve FreeBSD 8, je dtrace. Dtrace je tracovací framework firmy Sun, který byl kompletně portován na FreeBSD, ovšem kvůli licenčním problémům je třeba reimplementovat některé věci. Stav portace lze sledovat na DTRACE. Poslední novinkou, kterou bych zmínil, je virtuální síťový stack, který je rozšířením současného systémů jailu a umožňuje kompletní nastavení síťe v jailu.
Závěr
FreeBSD 7.0 přináší mnoho zajímavých vylepšení a novinek, které určitě stojí za to vyzkoušet. FreeBSD 7 můžete stahovat na ftp.freebsd.cz. Hodně štěstí a úspěchů s FreeBSD.