Portada » Desarrollo
Mejorando el rendimiento de Magento
8 julio 2009 Sin comentarios

Magento Logo

Actualizado para incluir la instalación de APC (Alternative PHP Caché) y optimizar también la parte PHP de Magento.

Entre los usuarios de software de comercio electrónico (e-commerce) es de sobra conocida la edición Community de Magento. Lo tiene todo: es potente, modulable, versátil, estéticamente buena, gratis y de código abierto. Pero como todo en esta vida, tiene un gran pero: es bastante más lento que otros sistemas como el cuasi-difunto osCommerce, Zen Cart y similares. La explicación es sencilla: Magento NO es competencia de este tipo de software de carta de compras, sino de software empresarial de miles de euros que corren en servidores igual de caros.

En mi caso concreto, tengo en inminente estado de producción un servidor dedicado de bajo coste (con Intel Atom) y he mejorado muchísimo el rendimiento general de Magento “simplemente” ampliando el tamaño de la caché de MySQL. Aquí os dejo lo que hice:

Activando y ampliando la caché de MySQL

Primero comprobamos si la caché para consultas está habilitada en nuestra instalación de MySQL, ejecutando esta consulta (desde phpMyAdmin también vale):

SHOW VARIABLES LIKE 'have_query_cache';

Que devolverá YES si está correctamente activado.

mysql> SHOW VARIABLES LIKE 'have_query_cache';
+------------------+-------+
| Variable_name | Value    |
+------------------+-------+
| have_query_cache | YES   |
+------------------+-------+

Después comprobamos el tamaño asignado a la caché para queries . Si lo tenemos a cero, entonces está desactivado aunque en el paso anterior se obtuviésemos YES. Ejecutamos:

SHOW VARIABLES LIKE 'query_cache_size';

Y obtendremos el tamaño asignado en Bytes (por defecto creo que suele estar en 16777216 Bytes = 16 MB):

mysql> SHOW VARIABLES LIKE 'query_cache_size';
+------------------+----------+
| Variable_name | Value       |
+------------------+----------+
| query_cache_size | 16777216 |
+------------------+----------+
1 row in set (0.00 sec)

En mi caso 16MB de RAM se quedaban escasos y amplié el tamaño a 32MB. Dependiendo del uso, del hardware y de la cantidad de RAM instalada, quizá para muchos sea más conveniente ampliarlo hasta 64MB. No he probado cantidades mayores, pero se comenta que tampoco es conveniente poner más de esta cantidad.

Finalmente, para cambiar el tamaño sólo tenemos que editar el archivo mysql.cnf. En mi máquina Ubuntu está en /etc/mysql/my.cnf y lo edité mediante SSH con nano sin problemas. Debajo de la sección [mysqld] cambiamos:

query_cache_size=32M

Y reiniciamos MySQL (mysqld), aunque en mi caso parece que cogió las nuevas opciones sin necesidad de reiniciar, el cambio fue instantáneo. Y la mejora, también :jeje:

Instalación de APC para mejorar el rendimiento de PHP

APC es una extensión para PHP que mejora el sistema de caché de este lenguaje almacenando el código intermedio (“opcode”) sin tener que realizar modificaciones a nuestro código (en este caso, el de Magento). Todo funciona de forma transparente para el usuario y la propio aplicación, aunque en el caso de Magento tendremos que “avisarle” de que puede utilizar este sistema como veremos más adelante.

Al igual que para la optimización de MySQL, necesitaremos privilegios de administrador en nuestra máquina y acceso shell (recomiendo SSH) para instalar los paquetes necesarios. APC está disponible en casi todas las distribuciones Linux, pero los pasos a continuación sólo se aplican si utilizas una distro basada en Debian, como por ejemplo Ubuntu (8.04 Hardy en mi caso).

Primero actualizamos los paquetes de las fuentes:

sudo apt-get update

Instalamos los paquetes necesarios (nota: tanto php5-dev como apache2-threaded-dev son únicamente herramientas de desarrollo, no cambiarán ni arruinarán nuestra instalación actual de PHP5 ni Apache):

sudo apt-get install php5-dev php-pear apache2-threaded-dev

Si nos hace esta pregunta, simplemente pulsamos ENTER:

 1. Use apxs to set compile flags (if using APC with Apache)? : yes
1-1, 'all', 'abort', or Enter to continue: 

Y por último compilamos el módulo APC ejecutando:

sudo pecl install apc

Ahora incluiremos el módulo apc.so recién compilado en nuestra configuración de PHP, añadiendo las siguientes líneas al final de nuestro archivo php.ini (en mi caso en /etc/php5/apache2/php.ini), guardamos y reiniciamos el servidor Apache:

extension=apc.so

[APC]
apc.enabled = 1
apc.shm_segments = 1
apc.shm_size = 64
apc.max_file_size = 10M
apc.stat=1

Y para terminar del todo, el paso final: hacer que Magento utilice APC, para lo que editaremos el archivo de configuración local situado en app/etc/local.xml de nuestra instalación de Magento, entre los tags (aconsejo ponerlo al final de la sección global, una línea más abajo de ):


    apc
alphanumeric

Resultados

Con esto, deberíamos tener:

  • La propia caché de Magento activada en Options » Caché Management
  • La caché de consultas de MySQL activada y con un límite más amplio
  • Y el módulo APC cacheando el código intermedio de PHP

En mi servidor dedicado con Intel Atom, el tiempo de espera se ha reducido en cerca de un 40% al optimizar MySQL y posteriormente un 38% adicional al incluir APC. No tengo datos concretos de cuando active la caché interna de Magento, pero desde luego la diferencia fue mucho menor que cuando activé cada uno de estos sistemas por separado. Ahora sí, podemos decir que Magento ha llegado para quedarse sin miedo a hablar de rendimiento o lentitud para nuestros clientes.

¡Deja tu comentario!

Puedes dejar tu comentario aquí abajo, o hacer un trackback desde tu sitio web. También puedes suscribirte a los comentarios via RSS.

Se amable. Mantén el post limpio. Ajústate al tema. No spam.

Estas etiquetas están permitidas:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Esta web soporta Gravatar. Para que tu avatar sea globalmente reconocido en este y muchos otros blogs, por favor regístrate en Gravatar.