2. Problema: le prestazioni di PHP
Come sappiamo PHP 竪 un linguaggio con prestazioni poco elevate, questo perch辿 :
- un linguaggio interpretato
- non 竪 tipizzato
Questi 2 fattori fanno s狸 che le prestazioni siano scarse.
Intesys Talk
3. Conoscere gli strumenti
Esistono varie tecniche e strumenti per migliorare notevolmente questo aspetto, alcuni servono
solo a valutare dove migliorare altri intervengono pi湛 in profondit.
Citazione di Theo Schlossnagle*
- Gli strumenti sono solo strumenti
- Sono essenziali per fare bene il tuo lavoro
- Non potranno mai fare il lavoro al posto tuo
- Non potranno mai rimpiazzare esperienza e disciplina
- Possono aiutarti a tenere disciplinato il tuo lavoro
Abbiamo strumenti come i profilatori (PHPSpeed, XHProf, ecc.),
che servono a misurare le prestazioni;
mentre abbiamo altri strumenti come quelli per il caching
(MemCache, xCache, ecc.) oppure di modifica del codice
come Facebook Hip Hop (prende codice php e lo compila in C++, aumento delle prestazioni
della cpu del 50%).
* CEO di OmniTI
Intesys Talk
4. Che cos竪 la profilazione?
La profilazione 竪 un sistema di analisi dinamico di applicazioni, i cui dati si ottengono dalle
esecuzioni dell'applicazione.
L'obiettivo di questo tipo di analisi 竪 di determinare quali sezioni dell'applicazione sono da
ottimizzare, aumentando la velocit complessiva o
diminuendo l'utilizzo di memoria, o magari entrambi.
Intesys Talk
5. Misurare le prestazioni
di unapplicazione PHP
Molto spesso gli sviluppatori pensano di sapere quali parti della loro applicazione la rende lenta
e spendono molto tempo nell'ottimizzazione di quella parte ma magari capita che il collo di
bottiglia si trova da qualche altra parte.
Per evitare questo problema si possono utilizzare degli strumenti detti profilatori.
Di questi strumenti ne esistono parecchi, soprattutto per PHP, il pi湛 utilizzato 竪 Xdebug che
combinato con WinCacheGrind permette di mostrare il grafico delle chiamate e il tempo speso
per ogni funzione.
Intesys Talk
6. XHProf
XHprof 竪 un altro tool, sviluppato da Facebook ed 竪 open source.
E' un profiler di tipo a gerarchia di funzioni scritto in C.
E' dotato di un'interfaccia grafica per la presentazione dei dati raccolti
Permette di avere anche uno storico delle profilazioni raccogliendo i dati in una tabella del
database.
Al momento le versioni ufficiali del tool sono solo per Linux e FreeBDS.
Esiste una versione per Windows, ma sembra che non sia veritiera nei report come le versioni
per i sistemi Unix.
Intesys Talk
7. Installazione di XHProf
Per installarla:
wget http://pecl.php.net/get/xhprof-0.9.2.tgz
tar xvf xhprof-0.9.2.tgz
cd ./xhprof-0.9.2/extension/
phpize
./configure --with-php-config=/usr/local/bin/php-config
make
make install
make test
Poi bisogna abilitare l'estensione allinterno del file php.ini
[xhprof]
extension=xhprof.so
xhprof.output_dir="/var/tmp/xhprof"
Successivamente si fa solo un semplice restart di apache.
Intesys Talk
8. Come profilare con XHProf
Per profilare un blocco di codice basta inserire le chiamate a 2 funzioni prima e dopo:
// inizio profilazione
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
// codice da profilare
// fine profilazione
$xhprof_data = xhprof_disable();
La funzione xhprof_enable() accetta varie opzioni per controllare cosa profilare. Di default vengono
profilati sia il numero di chiamate delle funzioni che il tempo di esecuzione.
Si possono aggiungere anche le misurazioni relative alla memoria e alla CPU usate (attenzione al carico
della cpu).
Per problemi di carichi delle risorse, si possono disabilitare le funzioni native di php e le
call_user_functions.
// ignore builtin functions and call_user_func* during profiling
$ignore = array('call_user_func', 'call_user_func_array');
xhprof_enable(0, array('ignored_functions' => $ignore));
Intesys Talk
9. Utilizzare l'interfaccia di XHProf
L'interfaccia che ci verr mostrata cliccando sul link in fondo alla pagina 竪 una tabella con le
funzioni ordinate per tempo di esecuzione esclusivo.
I dati che possiamo vedere sono:
- numero di chiamate per funzioni
- utilizzo di cpu (tempo esclusivo ed inclusivo)
- utilizzo della memoria (tempo esclusivo ed inclusivo)
- picco massimo di uso della memoria
- wall time (tempo di esecuzione reale)
Tempo inclusivo e tempo esclusivo.
Il tempo inclusivo rappresenta il tempo di esecuzione della funzione stessa e di tutte le funzioni
discendenti.
Il tempo esclusivo rappresenta solo il tempo di esecuzione della funzione escludendo il tempo
delle funzioni discendenti.
Wall time
Il tempo di esecuzione della funzione mentre la CPU ha altri processi in corso.
Intesys Talk
11. Call Graph
Un altro strumento davvero utile 竪 il grafico delle chiamate.
XHprof mette a disposizione questa funzione attraverso uno strumento: Graphviz.
Ogni rettangolo 竪 una funzione con le statistiche visibili nella schermata precedente.
Il colore di sfondo di ogni rettangono indica quale funzione 竪 da ottimizzare.
Intesys Talk
12. Ottimizzazione dell'applicazione.
Quando si inizia ad ottimizzare l'applicazione, si deve ordinare la lista delle funzioni in base al
tempo di utilizzo della CPU perch竪 quelle sono le funzioni che vanno ottimizzate per prime.
E' buona norma, dopo aver ottimizzato/refattorizzato le funzioni rilanciare il profiler per vedere i
progressi fatti.
Dopo che siamo soddisfatti delle ottimizzazioni fatte ordiniamo per utilizzo di memoria e wall
time.
Breve sommario per l'ottimizzazione:
- Profila
- Ordina per tempo della CPU, utilizzo di memoria e wall time.
- Parti dalla cima della lista
- Analizza e ottimizza
- Rilancia il profiler e misura i miglioramenti
- Ripeti ancora, ancora e ancora
Intesys Talk
13. Differenze e aggregazione dei report
Altra feature molto utile di XHprof 竪 la possibilit di aggregare pi湛 report e vedere le differenze
tra pi湛 lanci e quindi i miglioramenti.
Ogni lancio 竪 identificato da un ID, per vedere la differenza tra 2 report basta sostituire
gli ID nel seguente URL:
http://xhprof_address/index.php?run1=XXX&run2=YYY&source=myapp
Intesys Talk
14. Scalabilit
Se si ha la necessit di avere un'applicazione scalabile si devono preventivare degli obiettivi da
raggiungere a livello di prestazioni (utilizzo cpu, memoria, tempo di generazione della pagina,
ecc.) e conoscere i propri limiti (framework, risorse, macchina sulla quale gira l'applicazione,
ecc.).
Misurare la baseline
Per applicare questo anche a livello di profiler, un buon punto di partenza 竪 la misurazione delle
prestazioni di base del framework della nostra applicazione.
Questo pu嘆 essere utile per capire l'(in)efficienza del framework e cosa si pu嘆 ottimizzare
d'esso.
Intesys Talk
15. Scalabilit
Zend_Config
Un esempio su Zend, nello specifico i file di configurazione .ini.
Se abbiamo una variabile che si chiama error.logger.level, e si usa Zend_Config per accedere
al valore avremo qualcosa del genere:
$config足>error足>logging足>level
Ogni operatore freccia implica 2 chiamate di funzioni, per un totale di 6 chiamate di funzioni?!
Pensate se erroneamente lasciate quest'accesso alla variabile all'interno di un ciclo lo spreco
di risorse.
Intesys Talk
16. Scalabilit
Zend_View
Un altro esempio su Zend (il framework che utilizziamo di pi湛).
Quando si utilizza un helper della view lo stack di chiamate 竪 questo:
E ancora quando si usa la funzione partial() per renderizzare un template viene clonato l'oggetto
View e annullate tutte le variabili non private.
Queste operazioni vengono fatte attraverso funzioni di reflection e ad un sacco di chiamate a
substr().
Altri oggetti come i modelli, o le chiamate alla funzione Zend_Json:encode(), mettono a dura
prova le prestazioni dell'applicazione.
Tuttavia Zend 竪 solo un esempio di framework dalle basse prestazioni su certi componenti.
Intesys Talk
17. Scalabilit
Identificare i colli di bottiglia
E' preferibile, nel report di Xhprof, avere pi湛 dati sulle operazioni pi湛 lente, come quelle di
accesso al disco, al database o la chiamata ad un web service.
Se non troviamo queste funzioni in cima al report 竪 molto probabile che ci sia un collo di bottiglia
altrove e che quindi sia il caso di refactorizzare il componente o addirittura l'intera architettura
dell'applicazione ove possibile.
Prima di ottimizzare
E' buona norma, prima di andare a lavorare su parti di codice lento andare a fare delle
valutazioni del tipo:
- 竪 proprio necessaria questa funzione?
- 竪 il posto giusto per questa funzione?
- 竪 possibile ridurre il volume di dati da processare?
Se 竪 vero che PHP non 竪 mister velocit noi no diamogli una mano ad essere ancora pi湛 lento!
Profilazione sotto carico
Per avere un report di dati realistico bisognerebbe lanciare XHprof sotto carico, ad esempio
tramite dei toolscome apache ab o avalanche.
Intesys Talk