Profilazione di applicazioni PHP con XHProf.

18
Aumentare le prestazioni di un’applicazione PHP attraverso la profilazione con XHProf. Intesys, 13 Ottobre 2011 XHProf

description

Profilazione di applicazioni PHP con XHProf.

Transcript of Profilazione di applicazioni PHP con XHProf.

Page 1: Profilazione di applicazioni PHP con XHProf.

Aumentare le prestazioni di un’applicazione PHP attraverso la profilazione con XHProf.Intesys, 13 Ottobre 2011

XHProf

Page 2: Profilazione di applicazioni PHP con XHProf.

Intesys Talk

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.

Problema: le prestazioni di PHP

Page 3: Profilazione di applicazioni PHP con XHProf.

Intesys Talk

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%).

Conoscere gli strumenti

* CEO di OmniTI

Page 4: Profilazione di applicazioni PHP con XHProf.

Intesys Talk

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.

Che cos’è la profilazione?

Page 5: Profilazione di applicazioni PHP con XHProf.

Intesys Talk

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.

Misurare le prestazioni di un’applicazione PHP

Page 6: Profilazione di applicazioni PHP con XHProf.

Intesys Talk

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.

XHProf

Page 7: Profilazione di applicazioni PHP con XHProf.

Intesys Talk

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 all’interno del file php.ini

[xhprof]

extension=xhprof.so

xhprof.output_dir="/var/tmp/xhprof"

Successivamente si fa solo un semplice restart di apache.

Installazione di XHProf

Page 8: Profilazione di applicazioni PHP con XHProf.

Intesys Talk

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));

Come profilare con XHProf

Page 9: Profilazione di applicazioni PHP con XHProf.

Intesys Talk

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.

Utilizzare l'interfaccia di XHProf

Page 10: Profilazione di applicazioni PHP con XHProf.

Intesys Talk

Utilizzare l'interfaccia di XHProf

Page 11: Profilazione di applicazioni PHP con XHProf.

Intesys Talk

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.

Call Graph

Page 12: Profilazione di applicazioni PHP con XHProf.

Intesys Talk

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

Ottimizzazione dell'applicazione.

Page 13: Profilazione di applicazioni PHP con XHProf.

Intesys Talk

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

Differenze e aggregazione dei report

Page 14: Profilazione di applicazioni PHP con XHProf.

Intesys Talk

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.

Scalabilità

Page 15: Profilazione di applicazioni PHP con XHProf.

Intesys Talk

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.

Scalabilità

Page 16: Profilazione di applicazioni PHP con XHProf.

Intesys Talk

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.

Scalabilità

Page 17: Profilazione di applicazioni PHP con XHProf.

Intesys Talk

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.

Scalabilità

Page 18: Profilazione di applicazioni PHP con XHProf.

Intesys Talk

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

Risorse