PHP backend performance

https://github.com/bilde2910/Hauk/pull/10#issuecomment-528279624

The problem with PHP is that, as far as I know, PHP does not cache anything on the file system by default. PHP has an opcache extension that does some form of caching, but I’m not sure how this works entirely, and it is disabled by default. If my understanding is correct, that means for every request, all the scripts and include files are read from disk. Each request requires four files to be parsed (post.php/fetch.php, inc.php, config.php, memcache.php/memcached.php). At 2 req/s, that is 8 files read per second. If you have group shares, or multiple people watching, that I/O load starts increasing pretty quickly. It would be interesting to run some load testing against the PHP backend and monitor IOPS and I/O performance, particularly if Hauk is run from a traditional HDD.

Trebuie sa recunosc faptul ca experienta mea in PHP este suficient de limitata incat sa nu am incredere intr-o simpla cautare pe Google.

Ma puteti ajuta cu opinia voastra in privinta paragrafului de mai sus? Si modul in care opcache sau alte extensii similare ar imbunatati performanta?

Context: chiar daca nu voi folosi Hauk, din cand in cand mai instalez cate o aplicatie bazata pe PHP.

Nu se executa asa multe citiri, doar una singura dupa care datele vin din memoria buffer cache a sistemului de operare (exceptand situatia cand nu exista destul RAM pentru asta). Anumite framework-uri php au un pas de optimizare in care concateneaza toate fisierele php intr-unul singur pentru performanta.

Translateaza codul sursa php intr-un format intermediar care e procesat mai rapid de interpretorul PHP si se stocheaza de obicei in memorie dupa prima procesare a fisierelor.

Mai multe informatii despre evolutia performantei interpretorului php:

1 Like

Aici am gasit 3 variante de cache generice plus una dedicata pentru Windows (Wincache): https://www.php.net/manual/en/refs.basic.php.php

Exista un clasament (oficial sau nu) dpdv al eficientei? Mai ales pe Windows? (pana acum am avut la indemana mai multe servere cu Windows decat cu Linux)

Nu înțeleg partea cu parsarea fișierelor. Orice framework încarcă o tonă de librarii, sute de fișiere, la fiecare cerere. Durează 40 - 70 milisecunde.

1 Like

Cred ca astea sunt probleme de oameni care n-au avut niciodată vreo aplicație cu mai mult de 10-20 de utilizatori simultan. Discuții ca asta se întâmplă și pe aici, pe forum, unde oameni cu un minimum de experiență profesională au păreri foarte tranșante despre ce ar trebui sau nu să faci. Nu ignora faptul că respectivul a decis să rescrie o aplicație pentru că el nu avea PHP pe server.

Despre diferențele de performanță între sistemele de cache: nu neg că ai putea avea nevoie de unul, dar, cel mai probabil, nu vei ajunge în punctul în care diferențele de performanță dintre APC și OPCache (de exemplu) chiar contează.

Uite ce a zis un nene:

2 Likes

Poate ar fi util sa ne spui ce anume vrei sa obtii (mai multa viteza de la codul php, performanta mai buna a aplicatiei, ce tip de aplicatie etc…). Optimizarea vitezei se poate face in multiple feluri si nu este o solutie universal valabila.

In general cand am vrut sa imbunatatesc viteza unui cod PHP nu ma uitam niciodata la interpretor ci la codul php care se executa, schimbarea unui algoritm de la O(n) la O(1) sau cache-uirea rezultatului (cel mai rapid cod php e cel care nu se executa :slight_smile:) duc in general la rezultate mai bune.

1 Like

Un limbaj e lafel de performant ca cel ce scrie codul.
Ruby si Python par excelente pana in secunda cand trebuie sa calci pe rvm rbenv si virtualenv si atunci incepe distractia

Dupa cum zicea tipul … el e prolific in Java :slight_smile: si probabil va scoate un backend super rapid la doar un minim de 2vcpu si 8Gb ram pt ~10 conexiuni simultane

Am fost curios odata de impactul unui framework PHP in performanta globala a unui server web masurand numarul de request-uri pe secunda ce pot fi deservite, comparand mere cu pere numerele erau ceva de genul:

  1. Fisiere statice - o imagine mica servita cu Apache - 10k req/sec
  2. Fisiere dinamice - hello world scris in php servit cu un Apache - 1.5K req/sec
  3. Framework PHP lightweight/micro cu Apache - 500-700 req/sec
  4. Framework PHP heavy cu Apache - 50-100 req/sec

Numerele variaza de la caz la caz dar ca si ordin de marime cam astea sunt valorile deci un impact exista si poate fi important in anumite situatii (costuri cu servere etc…).

2 Likes

In trecut am folosit Piwik, MediaWiki, DokuWiki; acum mai folosesc doar WebPageTest.
In toate cazurile, optimizarea codului PHP nu este o optiune rezonabila.

Multumesc mult, mi-ai salvat cateva ore/zile :smiley:

1 Like

Din ce vad, autorul si-a sters paragraful respectiv si a adaugat un comentariu nou cu testele sale.
Ai aici benchmarks pt multe limbaje / frameworks: TechEmpower Framework Benchmarks

Depinde ce stii sa faci sau ce buget ai…

1 Like

In cazul meu particular, alegerea softului a fost facuta pe alte criterii, nu pe faptul ca este scris in PHP.

Bugetul a fost mereu 0, iar invatarea PHP la un nivel decent pentru optimizarea unei aplicatii care maine ar putea fi inlocuita fara regrete nu ar fi o decizie inteleapta.

Stiti ceva tool-uri pentru testarea performantei unui endpoint pe Laravel? Ma tot chinui cu microtime() sa scot timpul de incarcare si imi cam ia mult timp

Ar fi mai multe posibile abordari functie de ce anume vrei sa masori:

  1. Performanta API din exterior - printr-un proxy gen https://istio.io/ folosit mai ales in configuratii cu microservicii. Asta te poate ajuta sa monitorizezi in general aplicatia sa vezi daca sunt anumite requesturi cu probleme.
  2. Performanta API mai in detaliu - de obicei e nevoie de o extensie php instalata care trimite date centralizat, este o piata destul de dezvoltata in jurul acestor tooluri, nu stiu sa fie tooluri free bune: https://blackfire.io/, https://docs.newrelic.com/docs/agents/php-agent/getting-started/introduction-new-relic-php, https://www.inspector.dev/
  3. In final xhprof daca stii care endpoint e cu probleme si sunt probleme la executarea codului php.

Poti folosi intotdeauna ab de la apache:
https://httpd.apache.org/docs/2.4/programs/ab.html

1 Like