Optimiser la vitesse d'une application PHP par l'Opcode XCache

Console XCache

XCache est un cache d'opcode, qui accélère les performances des applications PHP.

Il conserve en mémoire le résultat de la compilation des scripts PHP pour les appels ultérieurs.
Les pages PHP sont alors exécutées environ 5 fois plus rapidement et la charge du serveur est ainsi réduite en évitant la recompilation systématique et en utilisant les programmes en cache. Cet article présente la mise en oeuvre de cette optimisation et la mesure des performances réelles.

Installer XCache

XCache a été initialement développé pour le serveur Web Lighttpd, un petit serveur web simple et rapide idéal pour les sites sans contrainte d'audience mais il peut être utilisé avec un serveur Web Apache.

Pour un serveur Apache2 sous Ubuntu Feisty 7.04, le paquet s'installe comme il suit :

audo apt-get install php5-xcache 

La release 1.0.3 de XCache ne se configure pas automatiquement lors de l'installation. Il faut créer manuellement le fichier xcache.ini dans le répertoire /etc/php5/apache2/conf.d et faire un lien symbolique vers xcaches.so.

[xcache-common] 
extension = xcache.so ; La librairie est copiee dans `/etc/php5/apache2/conf.d` 

[xcache.admin] 
xcache.admin.user = "admin"
;xcache.admin.pass = md5($your_password) 
xcache.admin.pass = "xxxxxxx6d956dee1b4cdbc9d6da3" 

[xcache] 
xcache.shm_scheme = "mmap" 
xcache.size = 64M ; set to cpu count (cat /proc/cpuinfo |grep -c processor) 
xcache.count = 2 
xcache.slots = 8K ; ttl of the cache item, 0=forever 
xcache.ttl = 0 ; interval of gc scanning expired items, 0=no scan, other values is in seconds 
xcache.gc_interval = 0 ; same as aboves but for variable cache 
xcache.var_size = 2M 
xcache.var_count = 2 
xcache.var_slots = 8K 
xcache.var_ttl = 0 
xcache.var_maxttl = 0 
xcache.var_gc_interval = 300 
xcache.test = Off ; N/A for /dev/zero 
xcache.readonly_protection = Off 
xcache.mmap_path = "/tmp/xcache" 
xcache.coredump_directory = "" ; per request settings 
xcache.cacher = On 
xcache.stat = On 
xcache.optimizer = On 

[xcache.coverager] 
xcache.coverager = Off 
xcache.coveragedump_directory = "" 

Relancer le serveur Web :

/etc/init.d/apache2 force-reload 

Pour valider que XCache est actif, utiliser le classique fichier phpinfo.php

<\?php //remove \
phpinfo();
?>

Vous devez trouver l'information suivante

 This program makes use of the Zend Scripting Language Engine:
 Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
    with XCache v1.2.2, Copyright (c) 2005-2007, by mOo

Installer la console d'administration xcache-admin

La console d'administration permet d'ajuster les réglages de XCache.
Dans le fichier de configuration du virtual-host Apache, ajouter la déclaration de la configuration de la console d'administration de XCache.

Alias /xcache-admin/ /usr/share/doc/php5-xcache/misc/admin/ 
<Directory "/usr/share/doc/php5-xcache/misc/admin"> 
     Options Indexes MultiViews 
</Directory> 

Relancer Apache

/etc/init.d/apache2 force-reload 

Et accéder à la console http://localhost/xcache-admin/index.php

En une heure, le hit ratio a atteint 99.3 % et 65.000 compilations de scripts évitées sur mon serveur.

Mesure de performance

Le but de cette mesure est de contrôler un éventuel gain de vitesse pure.
La robustesse immédiate, dans la durée et la scabilité sont ignorés dans ce test.

Le protocole est le suivant :

  • avec et sans activation de xcache,
  • 100 connexions sont lancées sur le serveur 3 fois de suite.
  • La dernière mesure est prise en compte.

L'outil de test de charge httperf est utilisé :

httperf --hog --num-con=100 --server=www.strategic-management.fr

Les résultats sans XCache sont :

Total: connections 100 requests 100 replies 100 test-duration 3.182 s

Connection rate: 31.4 conn/s (31.8 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 28.1 avg 31.8 max 53.0 median 31.5 stddev 2.9
Connection time [ms]: connect 2.3
Connection length [replies/conn]: 1.000

Request rate: 31.4 req/s (31.8 ms/req)
Request size [B]: 80.0

Reply rate [replies/s]: min 0.0 avg 0.0 max 0.0 stddev 0.0 (0 samples)
Reply time [ms]: response 21.8 transfer 7.7
Reply size [B]: header 535.0 content 17009.0 footer 2.0 (total 17546.0)
Reply status: 1xx=0 2xx=100 3xx=0 4xx=0 5xx=0

CPU time [s]: user 0.18 system 2.79 (user 5.5% system 87.7% total 93.3%)
Net I/O: 540.8 KB/s (4.4*10^6 bps)

Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0

Les résultats avec XCache donnent :

Total: connections 100 requests 100 replies 100 test-duration 1.785 s

Connection rate: 56.0 conn/s (17.8 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 14.7 avg 17.8 max 35.1 median 17.5 stddev 2.8
Connection time [ms]: connect 2.8
Connection length [replies/conn]: 1.000

Request rate: 56.0 req/s (17.8 ms/req)
Request size [B]: 80.0

Reply rate [replies/s]: min 0.0 avg 0.0 max 0.0 stddev 0.0 (0 samples)
Reply time [ms]: response 7.7 transfer 7.3
Reply size [B]: header 535.0 content 17009.0 footer 2.0 (total 17546.0)
Reply status: 1xx=0 2xx=100 3xx=0 4xx=0 5xx=0

CPU time [s]: user 0.09 system 1.55 (user 4.9% system 86.7% total 91.7%)
Net I/O: 964.4 KB/s (7.9*10^6 bps)

Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0

Résultats du test de charge simplifié

Ces mesures montrent que l'usage de XCache :

  • permet de doubler le nombre de connexions à la seconde
  • offre des temps de réponse plus stable
  • multiplie la vitesse de réponse du script PHP par 3
  • consomme deux fois moins de CPU

A consommation CPU identique, le cache d'opcode XCache multiplie par 6 la capacité du serveur.

Commentaires

Bonjour,

J'avais déjà installé xcache sur Debian Lenny. Je vois parfaitement le module xcache dans phpinfo() mais depuis une mise à jour de PHP il ne semble plus être activé:

php -v

PHP 5.3.6-6~dotdeb.0 with Suhosin-Patch (cli) (built: Apr 17 2011 13:37:29) Copyright (c) 1997-2011 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies with Suhosin v0.9.32.1, Copyright (c) 2007-2010, by SektionEins GmbH

Aussi, je n'ai pas de console d'administration xcache. Le répertoire /usr/share/doc/php5-xcache/misc/admin/ n'existe pas ...!

Je n'ai rencontré aucun problème avec XCache sur mes serveurs sous Ubuntu 10.04 dont la version officielle de PHP est 5.2.6-3, ni sur mes serveurs sous Ubuntu 11.04 dont la version officielle de PHP est 5.3.5.
La version officielle de PHP sous Debian Lenny est actuellement est PHP 5.3.3-7.

Tu utilises donc une version instable, qui est malheureusement... instable ;)

Tu peux tenter dans un premier temps de réinstaller le paquet :

$ aptitude reinstall php5-xcache

Si le problème persiste, il te reste à étudier les logs, identifier les fichiers manquants pour les déployer à la main et indiquer au responsable du paquet le problème et la correction.

Tu peux également utiliser l'opcode APC qui est probablement mieux maintenu sous Debian.

Bonjour, Sous la 9.04, l'installation de XCache s'effectue correctement. Plus besoin de créer manuellement le lien symbolique.

Very good post, thanks a lot.

yw
Have a good day