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.
15 odpovedí na “Ako sme zrýchlili výkon webov”
To akoze glibalna opcache pre vsetkych?
Globalna opcache pre vsetkych?
Áno, s výnimkou pôvodnej architektúry je OPcache aktívna globálne. Architektúru na ktorej sa web nachádza môžete overiť vo Webadmine v Správe domény, sekcia Info.
Kde presne v sekcii Info by to malo byť vidieť? Máme starší multihosting, a v sekcii info pri doménach vidím len veľkosť, počet emailov, atď. Zatiaľ jednu z domén multihostingu sme nedávno dávali presunúť z architektúry 2.0 na 1.2 lebo moodle (ale aj WP) bol po „upgrade“ výrazne pomalší.
Máte pravdu, pri určitých doménach ktoré sú súčasťou Multihostingu alebo The Hostingu nie je táto informácia uvedená. Našim cieľom je totiž postupne presunúť všetky The Hostingy aj Multihostingy na rýchlu SSD architektúru 1.2 a „nerozbíjať“ ich tak medzi viaceré typy serverov.
Ďalšie informácie o Vašom multihostingu a stave jeho webov sme Vám zaslali na email. O aktuálne informácie môžete kedykoľvek požiadať náš helpdesk.
Treba to testnut aj na inych typoch systemov, ako je napr. e-commerce. Ako priklad davam prestashop 🙂
Je pravda že testy sme vykonávali na viacerých CMS, aj na Prestashope, Drupale a Joomle. Avšak ku týmto sme nenašli tak obsiahle testovacie dáta ako pre WordPress, preto výsledky neboli výpovedné – poloprázdne webstránky sa načítavali porovnateľne rýchlo nezávisle od PHP verzie a cache mechanizmu.
Toto spôsobuje to, že keď uploadnem novú verziu PHP súbora tak sa zmena prejaví až o 1-10 minút? 🙂
Presne tak,
mám zopár webov kde mi to robilo problémy, tak som to vypínal všade. Je to fajn, ale až keď na webe na 100% nepracuješ.
Ps.: Podobný problémik som mal aj s nastavením cache na všetko v htaccsess, kde mi začal browser cachovať výsledky z DB a pre nové výsledky bolo neustále potrebné použiť F5 alebo CTRL+F5, klasický redirrect nespravil nič. Takže som musel cache nastaviť manuálne len na určité súbory.
Buri : toto sposobuje uz davno nie len teraz preto pri ladeni webu mozes cache vypnut
eMDI : prave prestashop teraz optimalizoval novsiu verziu ktora je az o 40 rychlejsia a prave s touto novou cache by to bolo perfektne odmerat – celkovo moze byt rapidne rychlejsi co predtym moc nebol… stale na mna posobil ako slimak oproti jednoduchsim eshopom „namieru“…
pre websupport : skusite odmerat cisto nahrany posledny prestashop ? ako pomoze cache ? celkom by ma to zaujimalo… ma ju odteraz kazy defaultne zapnutu ? dakujem
Zaujimave je ze 5.4 pracuje s opcache (ale aj xcache) lepsie ako vyssie verzie… najme u 5.5 tam je celkom „prepad“ neviete preco ? 🙂 prave som googlil ze v 5.6 moze byt pre prestashop problem a vyhadzovat chyby tak neviem ci neprehodim z 5.5 na 5.4 🙂
pardon za spam mozte mi to spojit do jedneho prispevku ale stale ma nieco neskor napadne… to % of request znamena ze cca pri 40% requestoch (cize 40% z 10k) je v podstate odozva rovnaka cca 0,5 sek. pri verziach 5.4 az 5.6 takze ked mam malu navstevnost webu tak vykonovo to je zhodne na php 5.4 az 5.6 dobre tomu rozumiem ? 🙂
Ako sme už spomínali v odpovedi pre eMDi-ho, jediné CMS ku ktorému sme získali výpovedné výsledky bol WordPress. Pokiaľ viete o nejakej kvalitnej sade testovacích dát pre Prestu, dajte nám vedieť a meranie môžeme v budúcnosti vykonať 🙂
So spomínanou anomáliou pri PHP 5.5 som si tiež lámal hlavu. Nakoniec mi náš CTO Tomáš odporučil pozrieť sa na changelogy PHP verzií – podľa množstva nových featur a bugfixov sa zdá ako keby bolo PHP 5.5.0 (http://php.net/ChangeLog-5.php#5.5.0) trochu unáhlený krok a až 5.6.0 (http://php.net/ChangeLog-5.php#5.6.0) prinieslo množstvo skutočných vylepšení a opráv.
Ku grafu – ide o kumulatívne rozdelenie, čiže napríklad pri PHP5.6+OPcache bolo 40% (4000) requestov rýchlejších ako cca 450 milisekúnd, čiže v tých 40% sú započítané všetky requesty ktoré sa načítali za 450 milisekúnd alebo menej.
Hlavne, ze DB servery grcaju jedna radost 😀
[…] má príliš vysoký dosah na celý zvyšok systému. Ako sme spomínali v komentároch k nedávnemu článku, webové stránky už nejaký čas presúvame na čisto-SSD infraštruktúru. Teraz sme podobný […]