Quantcast
Channel: Zdroják » Jakub Onderka
Viewing all articles
Browse latest Browse all 2

PHP v rytmu Hip Hopu

$
0
0
hiphop

Vývojáři Facebooku se potýkali s výkonnostními problémy PHP, které používají pro generování frontendu Facebooku, a proto začali přepisovat kritické části aplikace do C++. Kód v C++ lze s PHP spojit skrz systém rozšíření, to se ale ukázalo jako problematické – jedna aplikace je tak psána zároveň ve dvou jazycích a ve dvou týmech, navíc jsou C++ programátoři dražší.

Řešením by tedy mohlo být přepsání části PHP, což by ovšem prý přineslo zrychlení jen o několik procent (zde je možné zapochybovat, protože například JavaScript v prohlížeči Google Chrome je několikrát rychlejší než PHP). Nakonec se tedy rozhodli vytvořit HipHop – převodník PHP skriptů do jazyka C++, který se po kompilaci vykonává mnohem rychleji. Podle slov jeho vývojářů snížil zátěž serverů o polovinu.

Princip funkce

Běžné zpracování PHP skriptů prochází přes několik vrstev. Nejprve se projde zdrojový kód, které se převede do jednotlivých jazykových elementů, tzv. tokenů. Z nich kompilátor vygeneruje bajtkód, tedy kód obsahující instrukce virtuálního stroje. Ten je zpracovává a převádí na instrukce procesoru, které se přímo vykonávají. Tento postup se nazývá interpretace a provádí se pro každý požadavek a každý vložený soubor.

Pro urychlení tohoto postupu se začaly používat PHP akcelerátory (například APC nebo eAccelerator), které v paměti uchovávají již zkompilovaný bajtkód, odpadá tedy načtení souboru, jeho parsování a kompilace.

HipHop tento postup kompletně obchází a používá vlastní. Zdrojový soubor zparsuje, provede optimalizace, určí datové typy, znovu zoptimalizuje a uloží jako zdrojový kód jazyka C++. Ten se poté zkompiluje pomocí běžného kompilátoru g++ (součást GCC), takže výsledný program obsahuje přímo nativní strojový kód pro cílový procesor. Tento postup se, na rozdíl od interpretace bajtkódu, provede pouze jednou, což výrazně zrychluje běh programu.

Omezení

Celé by to znělo příliš jednoduše, kdyby s kompilovaným přístupem nepřišla také některá omezení. HipHop podporuje pouze Unixové operační systémy (Linux, Mac OS X, BSD, …) a to pouze v 64bitové variantě. Navíc v současné verzi nedokáže fungovat s web serverem Apache; místo toho zkompilovaná aplikace přímo obsahuje HTTP server.

Další omezení jsou kladena přímo na PHP aplikaci, kterou chceme použít: oficiálně podporuje pouze vlastnosti z verze 5.2 (některé vlastnosti 5.3 již fungují, například anonymní funkce), většina PHP rozšíření není podporovaná, dokonce jsou podporovány pouze dvě databáze – MySQL a SQLite – a neexistují některé další funkce, obsažené přímo v PHP (třeba  function_exists).

Donedávna také nefungovaly „zlé“ funkce eval a create_function. Nyní už fungují, i když  kvůli nim musí HipHop obsahovat i interpret HPHPi. Takto vykonávaný kód ale nijak nevyužije výhod kompilace a je tedy mnohem pomalejší než zkompilovaná varianta.

Pozn.: Tyto funkce by se měly s obezřetností používat i při interpretování – nelze je uchovávat v cache bajtkódu a musí se tedy pokaždé parsovat znovu.

Naopak přímo obsažena jsou rozšíření, které pocházejí od Facebooku – XHProf a XHP.

Také je nutné mít na mysli, že jakákoliv změna kódu znamená překompilování celého projektu. Problematické jsou tedy například šablony v PHP kódu.

Instalace

HipHop se nedodává jako binární balíček a neoficiálně snad existuje pouze pro CentOS. Pro všechny ostatní systémy si musíte ručně zkompilovat aktuální git verzi (zatím neexistuje stabilní verze), což je na průměrném počítači „zábava“ na několik hodin. Pro kompilaci jsou vyžadovány asi dvě desítky závislostí. Nejjednodušší je kompilace na Ubuntu 10.10, protože autoři k ní dávají přímo návod a většina závislostí je dostupná ve výchozích repozitářích.

Výkon

Pozn.: Test byl prováděn na 64bitové distribuci Ubuntu 10.10 spuštěnou ve VirtualBoxu na MacBooku s 4 GB RAM, 2,2 GHz procesorem a 64bitového Mac OS X 10.6.

Nejdůležitější vlastností HipHopu je výkon výsledné aplikace. Pro porovnání jsem si vybral svou implementaci souborového žurnálu v Nette, který využívá struktury B+ stromu.

Kompilovaná verze tedy přinesla zrychlení přibližně o 40 %.

Takový žurnál ovšem není zrovna typické použití, mnohem důležitější je výkon reálných aplikací – například generování stránky s článek redakčního systému WordPress. Pro jeho kompilaci je ale potřeba použít mírně opravenou verzi.

Graf ukazuje, kolik server zvládl zobrazit stránek za sekundu, když se na něj zároveň posílalo 10 požadavků. Více než trojnásobné zrychlení přineslo použití cache bajtkódu, použití HipHopu dokonce více než osminásobné, resp. trojnásobné oproti verzi s cache.

Kompilace WordPressu trvala skoro hodinu a výsledná aplikace má 70 MB. Ta ovšem obsahuje už vše potřebné, včetně webového serveru, a lze ji jednoduše přenést na jiný server se stejným operačním systémem.

Chtěl jsem také otestovat HipHop na kompilaci Nette frameworku, to by si ale vyžádalo jeho částečné přepsání. Navíc tento framework cachuje šablony do PHP, což u kompilované verze nejde, ale šlo by pravděpodobně obejít pomocí funkce eval. – pozn.aut.

Závěr

Od HipHopu nelze očekávat, že se stane masově používaný. Má celkem specifické použití tam, kde současná infrastruktura už nestačí – po jeho aplikaci teoreticky stačí o polovinu méně výkonu pro vyřízení stejného množství požadavků. Žhavý kandidát na jeho nasazení je podle mne Wikipedie, která často trpí pomalostí generování stránek a systém MediaWiki, který ji pohání, je napsán právě v PHP.


Viewing all articles
Browse latest Browse all 2