Benchmark PHP 5.5, PHP 7, HHVM

Benchmark_img
15 ottobre 2015
1 commento

Continuano a susseguirsi le release candidates di PHP 7.0, quindi noi neeners abbiamo deciso di controllare le performance della versione PHP di default su Ubuntu 14.04 LTS PHP 5.5, PHP 7 e HHVM, il fork PHP di casa Facebook.

Ecco il setup che abbiamo utilizzato per il test:

  • Macchina virtuale 2 vCPU, memoria 2GB Ram, disco SAS 15K rpm su SAN Netapp
  • Ubuntu 14.04 LST
  • MySQL 5.5.44
  • Magento 1.9.2.1
  • Versioni PHP: HipHop VM 3.9.1 , PHP 7.1.0-dev, PHP 5.5.9
  • Jmeter con 5, 10, 20, 30, 40 e 100 utenti con 20s di warmup.
  • n98-magerun

Falsa partenza con PHP7

Partendo con PHP7 abbiamo dovuto subito effettuare una piccola patch a Magento a causa di un cambio di sintassi.
All’interno del file app/code/core/Mage/Core/Model/Layout.php nella funzione getOutput() si deve modificare la riga seguente:

$out .= $this->getBlock($callback[0])->$callback[1]();

con:

$fname = $callback[1];

$out .= $this->getBlock($callback[0])->$fname();

Una volta fatto ciò, tutto sembra funzionare regolarmente.
La causa alla radice del problema è dovuta a questa decisione: https://wiki.php.net/rfc/uniform_variable_syntax.

Il test

Il test si è concretizzato in un semplice stress test effettuato con Jmeter sulle pagine di Magento, in cui sono stati caricati dati fake tramite l’applicativo/utility n98-magerun.

Il test si è effettuato con 5, 10, 20, 30, 40 e 100 utenti con 20s di warmup che caricavano randomicamente le pagine estratte dalla sitemap di Magento.

Durante il test si sono misurati i dati di “tempo di caricamento delle pagine” e contestualmente abbiamo misurato il comportamento del server in termini di CPU load e utilizzo di memoria RAM.

I risultati delle misurazioni sono stati graficati, come da tabelle sottostanti

I grafici:

Tempo di caricamento medio singola pagina

 Grafico_benchmark

UTENTI 5.5 hhvm php7
5 498 777 428
10 462 363 405
20 417 330 381
30 537 302 384
40 1771 384 1215
100 8806 5002 7444


CPU Load

Grafico_Benchmark2

UTENTI 5.5 hhvm php7
5 0.16 0.3 0.25
10 0.52 0.19 0.49
20 0.63 .056 0.34
30 1.33 0.73 0.48
40 2.02 1.34 1.81
100 3.7 2.98 3.5


Utilizzo di RAM

UtilizzoRAM_imgRAM

php5.5 hhvm php7
300 350 280


Considerazioni e conclusioni

  1.  Nel grafico “Tempo di caricamento medio singola pagina” si nota come i tempi inizialmente e stranamente scendano ad un primo aumento di numero utenze, ma l’effetto è dovuto al fatto che opcache e i compilatori JIT sono più efficienti una volta arrivati ad un certo break even point: un pò come un motore Diesel che si deve scaldare. Il carico della macchina, in ogni caso, aumenta all’aumentare degli utenti.
  2. Si nota come PHP 7 abbia migliorato sensibilmente le prestazioni rispetto a PHP 5.5, ma come HHVM si dimostri ancora vincente dal punto di vista prestazionale e come (ad un’analisi sommaria) sembri avere maggiore compatibilità con PHP dello stesso PHP 7.
  3. Se il vostro e-commerce (Magento e non) è ospitato su un server dedicato, potrebbe essere una buona idea quella di valutare un porting su HHVM. Se il vostro hoster è neen, nei neeners troverete validi alleati nell’assecondare la vostra voglia di velocità.
  4. Ma vi mettiamo in guardia! Non sarà una passeggiata: fare ad esempio un porting di Magento su HHVM assicurandosi la piena compatibilità di tutte le funzionalità e relativi moduli (non solo delle funzionalità basiche del front end che abbiamo usato per il test) non è una lavorazione veloce, né priva di trade off negativi.

Dovrete armarvi di adeguati strumenti di profiling e analisi dei log per correggere tutte le incompatibilità, che in alcune versioni potranno implicare anche funzioni core di Magento.
Uno dei prezzi da “pagare” per una sicura velocità maggiore sarà quello di dover mantenere un “branch” di Magento con modifiche custom da riapplicare e verificare dopo ogni aggiornamento e update di versione.

Alessandro  Lorenzi Sys Admin