Inicio

Comparativa entre sistemas caché disponibles en cakephp

29 Junio, 2009 por xenxo

En el desarrollo de uno de nuestros proyectos nos hemos encontrado con la necesidad de utilizar un sistema caché. El Framework CakePHP tiene una librería denominada cache muy completa la cual permite seleccionar uno de los siguientes sistemas caché File, Memcached, Xcache y Apc.

Los dos primeros, son sistemas caché que permiten almacenar objetos o variables (uno en ficheros y el otro en memoria) y los dos restantes son sistemas especializados en cachear Opcodes “almacenan código compilado de php” permitiendo acelerar la ejecución de nuestra aplicación PHP.

Elegir un sistema cache va a depender del tipo de proyecto, pero lo normal es encontrarnos con que si queremos optimizar nuestro proyecto lo mejor será reducir el numero de consultas SQL. En un momento dado, todos los visitantes de nuestra página estarán intentando acceder a la misma información almacenada en nuestro sistema, es por ello que habrá gran cantidad de consultas repetidas.

Pongamos como ejemplo una página que no tiene activado el sistema de caché y que se actualiza como media una vez al día. Para generar la página de inicio, el sistema tendrá que realizar 20 consultas por cada visita, esto supone más del 50% del tiempo que consume para generar una respuesta.

Si esta página tiene gran cantidad de visitantes, en períodos de tiempo cortos, la información mostrada será siempre la misma. Por lo que todas las consultas realizadas por los usuarios obtendrán los mismos resultados.

Activando un sistema tipo memcached, podríamos hacer que los resultados de esas consultas se almacenasen en memoria. Únicamente la primera visita tendría que esperar el tiempo necesario para realizar esas consultas, el resto accedería directamente a los datos almacenados en memoria, con lo que el tiempo de respuesta mejoraría considerablemente.

Por otra parte, activando un cacheador tipo opcode lo que hará es agilizar la ejecución de nuestra página php almacenando en Ram el código php compilado. Esto no va a suponer una gran mejoría puesto que lo que realmente consume tiempo es el acceso a los datos y no la generación del código php compilado.

Para solventar esto lo recomendable es utilizar los sistemas de cache memcached o file, y cachear directamente los respuestas a las consultas que se van a repetir. Evidentemente lo mejor es cachearlo en memoria Ram ¿Pero cuánto?.

Para ello hemos probado la diferencia de los sistemas cache antes mencionados, utilizado la herramienta jmeter, muy útil para pruebas de carga, además open source.

Prueba:

Las pruebas consistieron en recorrer todas las páginas del proyecto (10 veces para poder obtener una media estable), teniendo en cuenta diferentes supuestos, que serán los siguientes:

  • Un usuario con el sistema cache memcached.

  • Un usuario con el sistema cache file

  • Diez usuarios concurrentes con el sistema cache memcached.

  • Diez usuarios concurrentes con el sistema cache file.

Con todos los tiempos obtenidos en cada muestra, jmeter calcula el tiempo medio y la desviación típica sobre la media de esta prueba.

Se recomienda para las pruebas de carga prescindir, en jmeter, del sistema de almacenamiento del cache de paginas. El motivo principal es que nos va interesar comprobar cuanto varía el valor de las muestras obtenidas.

Con sistemas caché vamos a tener muestras que han descargado todos los objetos y otras muestras que se aprovechan de esos objetos descargados siendo obviamente más rápidas.

Resultados:

Los datos obtenidos son los siguientes:

  • En la prueba de un usuario probando el sistema memcached tiene una media: 1512 milisegundos y una desviacion típica de 1031,224.

  • Los datos de la prueba con un usuario y sistema cache file serian 1230 milisegundos de media y una desviacion típica de 1352,202.

  • Con los diez usuarios y el sistema memcached se obtiene una media: 1595 milisegundos y una desviacion típica de 1039,463.

  • En la ultima prueba obtenemos una media de 1800 milisegundos y una desviacion típica de 1775,695.

Conclusión:

Como podemos observar el sistema caché memcached hace que nuestras respuestas http sufran muchas menos variaciones en el tiempo de respuesta aunque incrementa el tiempo de media. Pero como se puede comprobar, con el incremento de usuarios concurrentes, este sistema caché supone una gran mejoría.

En el desarrollo de uno de nuestros proyectos nos hemos encontrado con la necesidad de utilizar un sistema caché. El Framework CakePHP tiene una librería denominada cache muy completa la cual permite seleccionar uno de los siguientes sistemas cache File, Memcached, Xcache y Apc.

Los dos primeros son sistemas cache que permiten cachear objetos o variables (evidentemente uno en ficheros y el otro en memoria) y los dos restantes son sistemas especializados en cachear Opcodes “cachean código copilado de php” permitiendo acelerar la ejecución de nuestro código PHP.

Elegir un sistema cache va a depender del tipo de proyecto, pero lo normal es encontrarnos con que si queremos optimizar nuestro proyecto lo mejor será reducir el numero de consultas SQL. esto se debe las aplicaciones web son concurrentes y cuando se incrementa el numero de usuarios incrementan también el numero de consultas repetidas.

Pongamos como ejemplo una página que no tiene activado el sistema de caché y que se actualiza como media una vez al día. Para generar la página de inicio, el sistema tendrá que realizar 20 consultas por cada visita, esto supone más del 50% del tiempo que consume para generar una respuesta.

Si esta página tiene gran cantidad de visitantes, en períodos de tiempo cortos, la información mostrada será siempre la misma. Por lo que todas las consultas realizadas por los usuarios obtendrán los mismos resultados.

Activando un sistema tipo memcached, podríamos hacer que los resultados de esas consultas se almacenasen en memoria. Únicamente la primera visita tendría que esperar el tiempo necesario para realizar esas consultas, el resto accedería directamente a los datos almacenados en memoria, con lo que el tiempo de respuesta mejoraría considerablemente.

Por otra parte, activando un cacheador tipo opcode lo que hará es agilizar la ejecución de nuestra página php almacenando en Ram el estado compilado de nuestro código php. Esto no va a suponer una gran mejoría puesto que lo que realmente consume tiempo es vender productos.

Entradas más comentadas en el blog

4 Respuestas a “Comparativa entre sistemas caché disponibles en cakephp”

  1. carlos dijo:

    Y para comparar, cual es la media y desviación estándar sin ningún cache?
    Además creo que memcached necesita utilizar clusters, si la página es muy grande no creo que una sola máquina pueda mantener todo en memoria (o bueno, depende de la cantidad de memoria que se tenga)…

  2. xenxo dijo:

    hola

    Esta comparativa está pensada para cakephp, empleando el helper para la gestión de la cache que tiene integrado. Hacer la prueba nos obligaba a modificar gran parte del código del proyecto que en el proceso de desarrollo las pruebas unitarias nos mostraban mejorías considerables. Cuando tengamos tiempo tenemos pensado hacer un post sobre como utilizar ese helper.

    En cuanto lo que comentas sobre memcached no es que necesite un cluster más bien que en clusters de servidores apache te es conveniente por que podrás cachear esas consultas SQL que tanto se repiten, etc. Memcached es un servidor muy sencillo en donde vas a escoger la memoria RAM que vas a destinar para cache y en tu pagina web, que será el cliente, insertarás lo que te interese cachear y o borrar de cache. En resumen, Memcached se puede adaptar a muchos entornos según la forma que se use por los clientes y configure.

  3. web dijo:

    100 % razon …

  4. Diseño Web Tenerife dijo:

    Lo más peligroso es el consumo de recursos.

Dejar un comentario

 

 

 

 

 
Hospedaxes © 2010 . Todos los derechos reservados. A Coruña, Galicia (España).

RSS de Hospedaxes

Validar XHTML 1.0 Validar CSS