2009-11-25 34 views
27

Tengo un sitio de servidor único que está empujando 200k unidades por día, y el tráfico se duplica aproximadamente cada 40 días (para los últimos 5 meses de todos modos).Memcache vs APC para un almacenamiento en caché de datos de sitio de servidor único

Preveo almacenar en caché la salida de las funciones mysql_query durante una hora más o menos. Si la memoria caché es anterior a eso, ejecute la consulta y vuelva a colocar el resultado en la memoria caché durante otra hora.

Mi base de datos MySQL es de aproximadamente 200mb de tamaño (crece aproximadamente 10-20mb/mes).

Im haciendo una gran cantidad de almacenamiento en caché de archivos escribiendo salidas HTML y usándolas durante unos minutos, y luego regenerando el html.

Desafortunadamente, dado que es un sitio de base de datos, que permite muchos métodos de ordenación, búsqueda y ordenamiento, así como paginación .... hay más de 150,000 páginas en caché. Tampoco estoy almacenando en caché las consultas de búsqueda, que causan la mayor parte de la carga.

Me gustaría implementar un sistema de almacenamiento en caché, y quería saber cuál es más rápido. Me encantaría ver algunos puntos de referencia.

+3

+1, Este pregunta me ayudó, gracias stackoverflow. –

Respuesta

32

A quick Googling dice que APC es 5 veces más rápido que Memcached.

Mi experiencia dice que APC es casi 7-8 veces más rápido que Memcached ... pero a memchached se puede acceder por diferentes servicios (por ejemplo, si ejecuta principalmente en apache y delega tráfico, por ejemplo, contenido estático como imágenes o html puro, a otro servicio web, como lighttpd), que puede ser realmente útil, si no indispensable.

APC tiene menos funciones que las de memcached y es fácil de usar y optimizar, pero esto depende de sus necesidades.

+0

+1, no hice la nueva pregunta porque sería un duplicado y gracias @DaNieL, tu respuesta es mi solución. –

+0

@Imran: gracias por usar la función de búsqueda;) – Strae

+1

¿Puede proporcionar el enlace donde dice esto Google? Gracias por adelantado. – Gerry

3

Es casi imposible predecir con precisión cuál sería más rápido. Ejecutaría pruebas con ambos en un entorno de desarrollo con datos similares.

Cuando el rendimiento es importante, utilice siempre un generador de perfiles.

+0

Esta es una respuesta perezosa estándar. En realidad ** es ** posible predecir con exactitud cuál sería más rápido. Tenga en cuenta que no estamos interesados ​​en cuánto más rápido, estamos interesados ​​en ** que ** es más rápido. – Pacerier

9

Como mencionó, hay algunos aspectos diferentes del almacenamiento en caché. Probablemente me centrará en los siguientes aspectos de almacenamiento en caché en su aplicación PHP:

  • caché de código de operación, que almacena el código de bytes compilado de scripts PHP. Puede ver un punto de referencia aquí (aunque es un artículo más antiguo): http://itst.net/654-php-on-fire-three-opcode-caches-compared Nota: Recomiendo encarecidamente utilizar el almacenamiento en caché de opcode.

  • Almacenamiento en el caché de los datos del usuario: APC y otros hacen esto. Estos serían sus datos o datos de referencia que son bastante estáticos y no cambian a menudo. Puede borrar el caché todos los días o activar un caché limpio cuando cambien estos datos de referencia. Esto también es muy recomendable ya que los datos de referencia típicamente se usan con frecuencia y no cambian con frecuencia.

  • Caché de consultas SQL: sé que Zend hace que esta tarea sea fácil con una configuración simple. Dado que estas consultas no cambian este es otro obvia (como usted ha mencionado)

(si es posible) adicionales: páginas html

  • caché - obviamente almacenamiento en caché de una página estática es más rápido que una generó uno y, por lo general, esto es difícil de hacer, ya que la mayoría de las páginas de las aplicaciones son muy dinámicas. Vale la pena si puedes hacerlo, aunque si tus consultas están en caché y tu SQL es simple, no me enfocaría en esto.

  • caching sql resultados - personalmente Me mantengo alejado de esto. Dejaré que la base de datos haga su trabajo y lo que mejor hace, ya que el DBMS generalmente tiene almacenamiento en caché. Puedo almacenar en caché los resultados para el hilo de ejecución (es decir, acabo de recuperar esto, así que no lo vuelvo a hacer) pero no voy mucho más allá.

he utilizado con éxito APC y eAccelerator (personalmente me gusta trabajar con APC y que supone el almacenamiento en caché de código de operación y almacenamiento en caché de datos de usuario para mis datos de referencia y consultas SQL). Usa XDebug para perfilar tu código.

+0

No estoy seguro de entender la diferencia entre el caché de consultas sql ... y el almacenamiento en caché de resultados sql. ¿Por qué no quiero guardar esto en caché? –

+1

El almacenamiento en caché de consulta Sql almacena en caché las sentencias sql (es decir, selecciona el crédito de la cuenta donde id =?); Estas no cambian. Los resultados de esa consulta pueden ser de $ 200.00, pero esa cantidad puede cambiar según el tipo de datos con los que se trate. Por lo general, las consultas son solo "pocas" en comparación con los posibles resultados. –

+0

Aquí hay una explicación de Doctrine (ORM) - http://www.doctrine-project.org/documentation/manual/1_0/en/caching –

7

¿Desea comparar APC key-value store vs Memcache? Porque APC también tiene caché de código de operación, que es algo diferente.

Bueno, en una sola máquina, el caché APC k-v es mucho más rápido que Memcache. Memcache tiene más funciones, pero está destinado a entornos distribuidos, mientras que APC solo funciona en servidores únicos.

Hice un punto de referencia recientemente para establecer y luego obtener 1 millón de claves en ambos, cada clave era un entero secuencial, y los valores eran una cadena de 32 bytes.

Sobre localhost, Memcache podría recuperar 12k de claves/segundo en un solo hilo. APC devolvió 90K/segundo. Sin embargo, si usa multi-threads o "multi_get" con memcache, se acerca mucho al rendimiento de APC.

El índice de referencia se ejecutó en 1GB vps en slicehost.

1

Im use IPB 3.1.4 con APC funciona justo dos veces más rápido que sin él.

Requests per second: 43.46 [#/sec] (mean) 
Requests per second: 24.23 [#/sec] (mean) 

No prueba IPB con memcached todavía

7

en mi caso APC es 59 veces más rápido que Memcache

<?php 
ini_set('apc.enable_cli','1'); //if u run in cli you may need to do changes in php.ini 
error_reporting(E_ALL); 
$mem=new Memcache(); 
$mem->connect('127.0.0.1',11211); 
$mem->replace('testin','something'); 
$i=0; 
$time=time()+microtime(); 
apc_store ('testin','something'); 
$num=1000000; 
while($i<$num){ 
$mem->get('testin'); 
$i++; 
} 
echo "memcache took: ",time()+microtime()-$time," for 1 million gets","\n"; 
$time=time()+microtime(); 
$i=0; 
print_r(apc_fetch('testin')); 
while($i<$num) { 
apc_fetch('testin'); 
$i++; 
} 
echo "apc took: ",time()+microtime()-$time,"for 1 million gets \n"; 

aquí es la salida

memcache took: 37.657398939133 for 1 million gets 
somethingapc took: 0.64599800109863for 1 million gets 
Cuestiones relacionadas