Optimalizace vykonu PHP aplikace rubrika: Programování: PHP
Zajimaly by mne zkusenosti s optimalizaci vykonu serveru s PHP. Mam na mysli zejmena PHP cast, vyuziti nejaky opcode cache? Zend opcache / XCache / APC. Momentalne se mi jedna o PHP 5.4 (upgrade na PHP 5.5 momentalne asi neklapne) - nicmene to, ze zend opcache nebo co presne tam je jiz soucasti PHP asi naznacuje ze to je spravna cesta. A co hiphop/hvvm?
Druha cast je spis k analyze aplikace? Xdebug profiling + nejaky cachegrind k analyze. Pouzivate? Jaky jsou s tim zkusenosti? Nejaky "materialy" kde se dozvim vic jak s tim zachazet spravne?
Hraju si s tim chvili, na par zajimavych veci jsem prisel, nicmene nakpnuti spravnym smerem, nebo varovani pred spatnym smerem by mi mohlo dost pomoci. O to co jsem zatim vyzkoumal se rad podelim bude-li mit nekdo zajem.
První co bys měl optimalizovat je samotná aplikace - zjisti, kde trácí čas a dodej cache, změň algoritmy apod. Tady určitě doporučuju kombinaci xdebug + cachegrid.
Pokud ti jde opravdu čistě o optimalizaci serveru jako takového tak pár tipů:
- pokud to je možná přejít na PHP 5.4 a výše - je tam fakt znatelný výkonnostní skok (na našich aplikacích máme změřeno že šlo o 20-30%)
- určitě použít opcode cache (my používáme Zend Optimizer+ v rámci Zend serveru)
- sessions neukládat do souborů ale do memcached
- v php.ini zvednout realpath_cache_size (tohle má vliv celkem malý, ale přece)
- zkus na server nasadit NewRelic (https://newrelic.com/) a monitorovat, kde máš úzká místa (disk I/O, paměť, procesor)
- pokud máš vysoké čekání na disk I/O zkus se podívat co všechno server loguje a jestli tam nejsou nějaké zbytečnosti (častý případ je, že se během každého requestu několikrát zaloguje PHP notice, že není nastavená timezone)
Pokud aplikace používá databázi (MySQL) tak bych potunil i tu:
- Vyzkoušej nástroj MySQL report (http://hackmysql.com/mysqlreport)
- Vyzkoušej nástroj MySQL tunner (http://www.howtoforge.com/tuning-mysql-performance-with-mysqltuner)
- Podle výsledků pak nastav vyšší cache, vyšší limity na počet připojení a podobně
Komentáře
- jkbnerad : session do memcached mi neprijdu uplne vhodne. Kdyz ji flushnu tak se mi vsichni odhlasi? A jak resis, aby se ti to neprepisovalo napr. pri dvou XHR pozadavcich odeslanych soucasne? — 3.12.2013
- Honza Břešťan : A proc bys ji flushoval? — 3.12.2013
- jkbnerad : Ok, neni to uplne denodenni operace, ale restart serveru neni neobvykla situace. A hlavne memcached (a vsechny cache obecne) uz ze sve podstaty neni persistentni uloziste (nemate zaruceno ze to tam bude) a session patri nekam kde ty data zustanou a muzete se na to spolehnout. Radeji tedy ukladat kdyz uz ne disk, tak do DB (mysql, redis, nosql). — 3.12.2013
- Honza Břešťan : Restart neni neobvykla situace? Jakou mate dostupnost? Jinak na cachovani se da samozrejme pouzit i uloziste s persistenci - kdyz uz tak neco, co umi jak data drzet v pameti, tak je odnekud znova nacist v pripade restartu. Treba Couchbase. — 3.12.2013
- jkbnerad : I kdyby ten restart byl jednou za rok, tak jednou za tok ztratite vsechny session. Jde mi o to, ze radit nekomu pouzit k ukladani session nepersistentni uloziste je proste spatne. Couchbase je treba vhodna volba, i kdyz nevim jestli v ni jde zamykat zaznamy, coz je pro session take dulezite. — 4.12.2013
- Martin Mystik Jonáš : Asi záleží na účelu k čemu session používáte. U nás máme v session více méně jen informaci o přihlášení a aplikace sama o sobě má automatické odhlášení při delší nečinnosti. To že se jednou za rok při nějakém nočním restartu serveru stane, že aplikace někoho odhlásí nevidím jako zásadní problém. Samozřejmě to ale není vhodné řešení pro všechny situace - pokud je náhlé odhlášení uživatelů problém tak to není nejlepší řešení. Konflikty při více požadavcích současně řeší přímo memcached modul v PHP (zamykáním stejně jako v případě session v souborech). — 4.12.2013
- jkbnerad : O Session-locking v memchaced jsem nevedel. Diky. — 5.12.2013
Pro zobrazení všech 6 odpovědí se prosím přihlaste:
Nebo se přihlaste jménem a heslem:
Komentáře