際際滷

際際滷Share a Scribd company logo
XHProf
Aumentare le prestazioni di
unapplicazione PHP attraverso la
profilazione con XHProf.
Intesys, 13 Ottobre 2011
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
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
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
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
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
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
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
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
Utilizzare l'interfaccia di XHProf




                     Intesys Talk
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
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
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
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
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
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
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
Risorse
http://pecl.php.net/package/xhprof

http://xdebug.org/docs/profiler

http://derickrethans.nl/xdebug-and-tracing-memory-usage.html

http://kcachegrind.sourceforge.net/html/Home.html

http://sourceforge.net/projects/wincachegrind/

http://www.maccallgrind.com/

http://www.slideshare.net/postwait/scalable-internet-architecture




                                        Intesys Talk

More Related Content

Profilazione di applicazioni PHP con XHProf.

  • 1. XHProf Aumentare le prestazioni di unapplicazione PHP attraverso la profilazione con XHProf. Intesys, 13 Ottobre 2011
  • 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
  • 10. Utilizzare l'interfaccia di XHProf 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