Desmitificando Memcached (II), APC y Igbinary – Performance

Parece ser que el post anterior de Memcached ha tenido bastante éxito o por lo menos hay bastante gente que busca este tema en Google, así que me animo a completarlo con algunas cosas más y también dar alguna pincelada sobre sus grandes aliados en cuanto a performance: APC y IgBinary.

APC

Si alguna vez te has preocupado sobre performance en PHP, seguramente hayas encontrado algo sobre APC.

Existen otros sistemas de cache, algunos de ellos tan transparentes como APC (como puede ser por ejemplo Zend Optimizer) pero aparentemente el núcleo duro de PHP ha decidido apostar por él y incluso el gran Ilia Alshanetsky comentó que había discusiones sobre si incluir APC en la distribución básica del futuro PHP5.4.

Instalarlo es sumamente sencillo:

– Abrimos consola
– sudo pecl install apc (o su equivalente en las diferentes distros)
– Editamos un apc.ini con extension=apc.so
– Reiniciamos apache

Y si hacemos un phpinfo, veremos la extensión correctamente instalada.

Hay muchos parámetros a configurar, aunque con la configuración por defecto ya deberíamos notar una gran mejora, especialmente en acciones que repetimos a menudo.

Aparte de todo esto, podemos usar APC como cacheador de datos al estilo memcached. Podéis consultar la API completa en PHP.net.

Como dato a tener en cuenta, comentar que APC cachea los datos en el Apache en el cual se está ejecutando. Eso hace que si tenemos por ejemplo una granja de 20 servidores Apache sirviendo nuestra página, para que sea efectivo, deberá entrar la petición a cachear varias veces en el mismo servidor para notar alguna mejora.

Igbinary

IgBinary es en palabras de Ilia Alshanetsky “The Great Serializer”. Y… ¿dónde usamos serializado de datos en nuestras aplicaciones? Pues quizás las opciones más habituales son:

– Envío de objetos / arrays completos a través de Webservices o sistemas de mensajería por colas
– Guardado de datos en Memcached
– Guardado de datos complejos serializados en campos tipo TEXT o BLOB en la BBDD

Y la verdad es que IgBinary es extremadamente más rápido (a menudo casi el doble) y los datos serializados ocupan aproximadamente la mitad. Lógicamente, estas métricas son variables ya que dependen mucho de la complejidad de los objetos / arrays a serializar pero estas medias serían bastante habituales.

Para instalarlo, de nuevo muy sencillo:

– Abrimos consola
– sudo pecl install igbinary (o su equivalente en las diferentes distros)
– Editamos un igbinary.ini con extension=igbinary.so
– Como opción complementaria, os recomiendo desactivar la opción de compactar strings con
igbinary.compact_strings = Off (en igbinary.ini)
– Reiniciamos apache

Y con ello, por un lado tendremos disponibles las funciones igbinary_serialize y igbinary_unserialize y por otro podremos instalar memcached con soporte igbinary.

Comentar como detalle que igbinary tiene ciertos problemas en Windows. Existen primeras versiones que aparentemente funcionan pero sinceramente no tengo ni idea de si funcionan bien o no.

Tenedlo en cuenta si parte de vuestro equipo usa Windows para desarrollar!!!

Memcached + IgBinary

Como comenté en mi anterior post, existe algo de confusión con las librerías Memcache y Memcached de PHP. La primera es algo más antigua y no soporta muchas cosas del servidor de Memcached. Sin embargo, la segunda es bastante más completa y nos permite cosas como cambiar el serializador usado antes de almacenar los datos en memoria.

Como casi todo en esta vida tiene contras, la instalación de la librería memcached con soporte igbinary es algo más complicada. Deberíamos hacer lo siguiente:

1. Instalar la librería libmemcached en el/los servidor/es donde vayamos a utilizar todo esto. En el momento de escribir este artículo, la librería activa de PECL es memcached-1.0.2 y la compilación solamente funciona correctamente si tenemos libmemcached 0.39 o superior. En los repositorios de Lucid Lynx existen versiones anteriores, por tanto deberemos instalarlo a mano. Los pasos serían (adaptando un poco a la distribución donde estemos).

– wget http://launchpad.net/libmemcached/1.0/0.49/+download/libmemcached-0.49.tar.gz
– tar xvzf libmemcached-0.49.tar.gz
– cd libmemcached-0.49
– ./configure –without-memcached
– sudo make
– sudo make install

2. Para instalar la librería libmemcached con todo, tendremos que realizar la compilación de la librería a mano y añadir un parámetro en el configure. Los pasos son:

– pecl download memcached
– tar xvzf memcached-1.0.2 (o la que haya cuando leáis esto)
– cd memcached-1.0.2
– phpize
– ./configure –enable-memcached-igbinary
– sudo make
– sudo make install

Después de todo esto y antes de reiniciar apache, hay que añadir un memcached.ini con extension=memcached.so.
Con todo esto, finalmente tendremos la librería memcached con soporte igbinary.

Para decirle a memcached que use igbinary como serializador, deberemos hacer lo siguiente cuando instanciamos Memcached en nuestro código PHP

<?php
  $md = new Memcached();
  $md->setOption(Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_IGBINARY);
?>

En cuanto al rendimiento de todo esto, la verdad es que la librería Memcached a solas es pelín más lenta que la Memcache (o por lo menos así sucede en mis entornos de desarrollo). Sin embargo, al activar el serializador IgBinary, recuperamos estas pérdidas y conseguimos que globalmente vaya más rápido que solamente con Memcache. La ganancia es muy variable pero la media estaría entre un 15 y un 30% más rápido, y en cualquier caso nunca más lento.

Vaya, hoy el post ha quedado bastante de sistemas, pero creo que un buen desarrollador debe saber tocar también las tripas de PHP y si es necesario descargar y compilar extensiones!

Para terminar con esta serie sobre Memcached, próximamente un artículo con algo más de código con todo esto!

You may also like...