WebSupport blog

Ako sme zrýchlili výkon webov

Koncom mája 2015 sme začali hľadať alternatívne riešenie pre globálnu vyrovnávaciu pamäť na úrovni webservera. Dôvodom bolo, že dovtedy používaná Xcache nepracovala pod záťažou celkom ideálne a vnášala do systému nestabilitu. Rozhodli sme sa pre OPcache, ktorá je od verzie 5.5.0 štandardnou súčasťou PHP, čo predpovedalo dobrú podporu a aktívny vývoj v budúcnosti.

Pred hromadným nasadením tejto pomerne výraznej zmeny sme museli vykonať množstvo testov – overovali sme kompatibilitu s najviac používanými redakčnými systémami, systémové nároky novej cache, jej optimálne nastavenia a nakoniec výsledný dopad na rýchlosť načítavania webov. Rýchlosť je napokon dôvodom pre jej používanie, preto sme ju nemohli zanedbať.

Ako cache využiť na svojom hostingu?

Vyrovnávacia pamäť OPcache je automaticky aktívna pre všetky hostingy na novej architektúre, ktoré používajú PHP verzie 5.4 a vyššie. Odporúčame však zvýšenie PHP verzie na 5.6, čím môžete svoj web posunúť do ľavej časti grafu. Upozorňujeme však, že niektoré weby, najmä staršie redakčné systémy, môžu pod vyššou PHP verziou zobrazovať chyby na stránke. Ak je toto váš prípad, môžete sa rozhodnúť pre upgrade svojho webu alebo verziu prehodiť späť na pôvodnú. Pozrite si návod na zmenu PHP verzie.

Naopak, pokiaľ by vám OPcache vo výnimočných prípadoch prekážala, môžete ju pre svoj hosting deaktivovať pridaním nasledujúceho riadka do súboru .htaccess:

php_value opcache.enable 0

Metodika merania

Dĺžku odozvy sme merali na WordPress webe naplnenom testovacími dátami z http://wptest.io/. Každú kombináciu PHP verzie a cache mechanizmu sme zaťažili 10-tisíc načítaniami, ktoré bežali paralelne v piatich vláknach. Pomerne vysoké číslo načítaní sme zvolili, aby sme mali dostatočne reprezentatívnu vzorku dát. Naopak, počet súčasných spojení sme obmedzili – pri vyšších hodnotách (15 a viac) boli výsledky skreslené, pretože sme narážali na MaxClients limit zdieľaného hostingu (je vhodné podotknúť, že všetky merania prebiehali na produkčnom webserveri a testovaná stránka bežala zarovno s ostatnými webmi – cieľom bolo čo najviac sa priblížiť výsledkom v reálnej prevádzke).

V našom meraní chýbajú testy pre OPcache vo verzii PHP 5.3. Dôvodom je, že rozšírenie bolo vyvíjané primárne pre PHP 5.5 a vyššie, do starších verzií bolo backportnuté. V prípade PHP 5.4 sme ešte dosahovali stabilne dobré výsledky, no na odporúčanie vývojárov sme OPcache do PHP 5.3 nenasadili.

Ako OPcache funguje

OPcache je vyrovnávacia pamäť zo skupiny ‘opcode cache’, zameriava sa teda na uloženie skompilovaného PHP kódu do operačnej pamäte, odkiaľ je jeho opätovné načítanie veľmi rýchle. Taktiež však analyzuje, deduplikuje a optimalizuje samotný PHP kód až na úroveň slov (názvy funkcií, premenných atď.), v čom je jej ďalšia silná stránka. Verili by ste napríklad, že veľkosť všetkých rôznych slov v PHP kóde z celého webservera nepresiahne 150 MB? 🙂

Ďalšou vlastnosťou OPcache je absencia garbage collectora – alokovanú pamäť neuvoľňuje až do svojho reštartu. Na prvý pohľad môže ísť o nevýhodu, pretože každý web sa dostane do cache po prvom navštívení a už ju neopustí. Prínos prichádza v podobe stability – keďže cache sa neuvoľňuje, nevznikajú v nej „diery”, ktoré by boli neskôr iba čiastočne zapĺňané novým kódom. Pri extrémnej záťaži nedochádza ku segmentačným chybám pamäte, s ktorými sme mali skúsenosť práve v prípade Xcache.

Prečítajte si aj výborný článok na tému fungovania OPcache priamo od jedného z vývojárov PHP jazyka.

Výsledky nasadenia OPcache

Po nasadení OPcache sme zaznamenali zníženie priemernej odozvy testovaných webov, z čoho vyplýval kratší čas ich načítavania. Na nasledujúcom grafe sú žltou farbou znázornené časy odozvy s Xcache, zelenou farbou s OPcache.

Po zozbieraní dát z reálnej prevádzky sme boli milo prekvapení výsledkami – čas odozvy webov na novej architektúre sa v priemere znížil o 36 %. K najväčšiemu zlepšeniu prišlo v rámci verzie PHP 5.6, ktorej odozvy sú v priemere rýchlejšie o 41 %.

Okrem zvýšenia rýchlosti načítavania sme tiež dosiahli vyššiu stabilitu priemerných časov načítania – výkyvy sú oproti Xcache omnoho menšie a ojedinelé.

Nasledujúci graf zobrazuje celkové percento tých načítaní webovej stránky, ktoré boli kratšie ako čas na osi x, pričom každá línia zodpovedá inej kombinácii PHP verzie a cache mechanizmu. Môžeme napríklad vidieť, že každé z 10-tisíc načítaní stránky pod PHP 5.6 a OPcache bolo kratšie ako cca 1000 milisekúnd. No pod PHP 5.3 bez cache trvali niektoré načítania aj 2,5 sekundy.

V každej PHP verzii priniesla práve OPcache najlepšie výsledky – skupina modrých línií sa nachádza úplne vľavo, s mediánom načítania stránky cca 500 až 550 milisekúnd. Oproti oranžovým líniám, ktoré patria Xcache, je zrýchlenie viditeľné. Z pohľadu testovaných PHP verzií dopadlo celkovo najhoršie PHP 5.3, ktoré je aj s Xcache pomalšie ako ostatné verzie bez akejkoľvek cache.

Pozitívnym efektom bolo aj zníženie priemernej záťaže webserverov. Na sledovanej vzorke strojov kleslo zo 70 – 85 % na 55 – 65 %. Keďže OPcache sa postará o načítanie optimalizovaného a skompilovaného PHP kódu z operačnej pamäte, iba minimum požiadaviek je nanovo spracúvaných pod PHP. Weby tak získali viac výkonu, ktorý môžu využiť na obslúženie vyššieho počtu návštevníkov súčasne.

Komentáre