Actualizado, vea al final de la pregunta larga (lo siento).
Mirando nuestras estadísticas de Memcached, creo que he encontrado un problema que no conocía antes. Parece que tenemos una cantidad extrañamente alta de espacio desperdiciado. Verifiqué con phpmemcacheadmin para un cambio, y encontré esta imagen mirándome:
Ahora tenía la impresión de que el peor de los casos sería que haya un 50% de desperdicio, aunque soy el primero en admitir que no conozco todos los detalles. He leído - entre otros- esta página que es de hecho un poco viejo, pero también lo es nuestra versión de memcached. Creo que entiendo cómo funciona el sistema ( por ejemplo ), creo, pero me cuesta entender cómo podemos llegar al 76% de espacio desperdiciado.
La tasa de desalojo que muestra phpmemcacheadmin es 2 ev/s
, por lo que hay algún problema aquí.
La pregunta principal es: ¿qué puedo hacer para solucionar esto ? Podría arrojarle más memoria (creo que hay algo más disponible), tal vez debería jugar con la configuración de losa (¿es eso posible con esta versión?), ¿Tal vez hay otras opciones? La actualización de la versión memcached no es una opción disponible rápidamente.
La pregunta secundaria, por curiosidad, es, por supuesto, si se espera una tasa del 75% (y aumento) de espacio desperdiciado, y si es así, por qué.
Sistema: actualmente no es algo sobre lo que pueda hacer nada, sé que la versión memcached no es la más nueva, pero estas son las cartas que me han repartido.
- Memcached 1.4.5
- Apache 2.2.17
- PHP 5.3.5
Como respuesta a la respuesta de @DavidSchwartz: aquí están las estadísticas de losas que produce phpmemcacheadmin: (por cierto, hay más losas)
( También he pegado las estadísticas de un poco más tarde en formato de texto aquí )
ACTUALIZAR
He reiniciado el demonio con -f 1.5, y se veía realmente bien. Después de un calentamiento tuvimos un 50% usado / perdido. Pero, al igual que antes, cuanto más tiempo teníamos en el día (se vuelve más ocupado durante el día), comenzó a retroceder a lo que es actualmente: 30/70, y el desperdicio sigue aumentando. Aparte de eso, todavía no sé de dónde viene el 'desperdicio'. Veo esta losa:
**Slab 5 Stats**
Chunk Size 496.0 Bytes
Used Chunk 77502 [24.6 %]
Total Chunk 314986
Total Page 149
Wasted 117.3 MBytes
Hits 30.9 Request/sec
Evicted 0
No está lleno, no ha sido desalojado, pero está desperdiciando 117.3 MBytes. El cálculo rápido que hice (corrígeme si me equivoco) fue:
- la losa anterior tiene un tamaño de fragmento de 328, por lo que en el peor de los casos, esta losa está llena de fragmentos de 329 bytes.
- Esto significa que está desperdiciando 167 bytes por fragmento usado = 12942834 bytes = 12.3 MB
Entonces, ¿de dónde vinieron los otros 105 MB desperdiciados ? Su hermano mayor justo al lado se ve así:
**Slab 6 Stats**
Chunk Size 744.0 Bytes
Used Chunk 17488 [31.0 %]
Total Chunk 56360
Total Page 40
Wasted 31.1 MBytes
Hits 107.7 Request/sec
Evicted 1109
Respuestas:
Ha pasado un año desde esta pregunta y no sé si encontró su respuesta, pero voy a decir que su percepción de "desperdicio" es incorrecta.
La memoria desperdiciada se asigna en la memoria para que no pueda ser utilizada por otra aplicación, pero aún está disponible para memcached.
Para simplificar la explicación, suponga que tiene una memoria caché con 3 MB de RAM con 3 losas:
Ejecute un solo "conjunto" con un tamaño de 10k. Verás en tus estadísticas (aproximadamente) que tienes:
Esto se debe a que memcached asignó un único fragmento de "losa clase 1" y el 99% de la memoria para esa losa se "desperdició" y el 1% se "usó". Esto no significa que la losa y la memoria asignada para esa losa hayan desaparecido.
Ejecute otro "conjunto" individual con un tamaño de 10k. Esta vez verás:
así que ahora está utilizando 2 de cada 100 fragmentos asignados en la losa 1, las estadísticas "desperdiciadas" se descartaron y las estadísticas utilizadas aumentaron.
No hay nada de malo en que% + desperdiciado% sea igual al 100%. Eso no significa que no le quede más memoria, simplemente significa que asignó al menos un fragmento de cada placa.
Para ver este problema, un "conjunto" con un tamaño de 100k y otro con un tamaño de 1000k
Ahora veras
fuente
Probablemente tenga una gran cantidad de objetos muy pequeños. Por lo general, la losa más pequeña tiene entradas de 104 bytes. Si tiene muchas entradas que solo asignan un número entero a otro, puede obtener un desperdicio de hasta el 85%.
Puede encontrar información sobre cómo ajustar esto en el artículo Memcached para objetos pequeños .
fuente
-f 1.5 -I 2800
puede ayudar.-I 2800
eso significa 2800K, en oposición al valor predeterminado de 1M?Tuve este problema y me mudé de memcached a redis (sin guardar en disco). Sé que esto podría no ser posible, pero podría probarlo como una opción y vigilar la fragmentación de la memoria. Incluso podría activar la persistencia para solucionar problemas de "caché anterior" al reiniciar.
fuente