xCache: Mejorando la potencia de PHP (I)

xCache es una utilidad que guarda en una memoria caché de código operativo (opcode) los scripts PHP que el sistema compila para evitar realizar dicho paso en siguientes peticiones,y soporta principalmente los servidores web Lighttpd y Apache.

Este sistema aumenta la velocidad de nuestros sitios web entre 4 y 5 veces, y aún podemos llegar más lejos usando la caché de variables que incorpora y que veremos más adelante.
Sólo es necesario que nuestra versión PHP esté comprendida entre la 4.3 y la 5.3 (y algunas versiones en desarrollo de 6.0), excepto la 5.0.

Instalando xCache

En un sistema basado en paquetes Debian bastaría con un:


$ sudo aptitude install php5-xcache

$ sudo cat /etc/php5/conf.d/xcache.ini >> /etc/php5/cgi/php.ini

Para otros sistemas o distribuciones, bastaría con ejecutar los comandos apropiados (yum,pacman,etc) y cambiar las rutas por las que correspondan.

Una vez dispongamos de la instalación básica y de una configuración por defecto, debemos editar el fichero /etc/php5/cgi/php.ini y cambiar los valores xcache.size y xcache.var_size por unos valores adecuados (dependiendo de la RAM de la que dispongamos).


xcache.size = 128M

xcache.var_size = 2M

Aunque parece que el tema de caché sólo tiene que ver con memoria también podremos beneficiarnos del uso de varios procesadores en esta tarea, para lo cual, en este caso, le digo que tengo cuatro procesadores:


xcache.count = 4

xcache.var_count = 4

(Para ver el número de procesadores de nuestro servidor basta con ejecutar cat /proc/cpuinfo |grep -c processor)

Aplicando la configuración

Una vez hemos cambiado los valores es necesario reiniciar nuestro servidor web, que en caso de Apache2 será:

$ sudo /etc/init.d/apache2 restart

Y en caso de Lighttpd será:

$ sudo /etc/init.d/lighttpd restart

Una vez reiniciado ya tendremos la xCache funcionando. Para comprobarlo basta con ejecutar un fichero PHP con una llamada a phpinfo():

< ?php phpinfo(); ?>

Y debemos obtener algo parecido a esto:

Este resultado es producto de una instalación sobre una Debian Squeeze y usando Apache2 como servidor web.

Comprobando las mejoras

xCache es más efectivo, como sucede en las cachés, cuantas más peticiones de los mismos scripts se realicen para así amortizar el gasto de memoria que estamos efectuando.

Para hacer unas mediciones rápidas podemos usar la herramienta ab, que viene incorporada con el servidor Apache.

$ ab -c25 -n750 http://misitio.com

Y obtendremos un resultado similar (en formato, obviamente) a este:


Concurrency Level: 25
Time taken for tests: 3.733 seconds
Complete requests: 750
Failed requests: 0
Write errors: 0
Total transferred: 50539500 bytes
HTML transferred: 50403000 bytes
Requests per second: 200.93 [#/sec] (mean)
Time per request: 124.421 [ms] (mean)
Time per request: 4.977 [ms] (mean, across all concurrent requests)
Transfer rate: 13222.60 [Kbytes/sec] received

Connection Times (ms) min mean[+/-sd] median max
Connect: 0 8 14.9 5 156
Processing: 25 113 40.1 104 525
Waiting: 20 70 26.8 69 227
Total: 44 121 44.9 108 525

En este caso la mejora ha sido de un 15% aproximadamente, pero este aumento será más apreciable en un sitio con muchas visitas y comprobando la experiencia de navegación y las gráficas de uso de CPU.

Portada de Genbeta