16 votos

Inesperado(?) alta 'desperdicia' memoria en memcache

Actualizado, vea la parte inferior de la alargada (lo siento) pregunta.

Mirando a nuestro memcached stats creo que he encontrado un tema en el que yo no era consciente de antes. Parece que tenemos un extrañamente alta cantidad de espacio desperdiciado. He comprobado con phpmemcacheadmin para un cambio, y encontré esta imagen me miró fijamente:

memcached cache size graphic

Ahora yo estaba bajo la impresión de que el peor escenario sería que hay un 50% de los residuos, aunque yo soy el primero en admitir no saber todos los detalles. He leído - entre otros- esta página que es de hecho algo antigua, pero así es nuestra versión de memcached. Creo que yo no entiendo cómo funciona el sistema (por ejemplo) creo, pero tengo un tiempo difícil la comprensión de cómo podríamos llegar a un 76% de espacio desperdiciado.

El desalojo de la tasa que phpmemcacheadmin muestra es 2 ev/s, por lo que hay un problema.

  • La pregunta principal es: ¿qué puedo hacer para solucionar esto. Me podría tirar más de memoria (hay algunos más, creo), tal vez debería jugar con la losa de configuración (que es posible incluso con esta versión?), tal vez hay otras opciones? La actualización de la versión de memcached no es una rápida opción disponible.

  • El secondairy pregunta, por curiosidad, por supuesto, es si la tasa de 75% (y en aumento) de espacio desperdiciado que se espera, y si es así, por qué.

Sistema: Actualmente, esto no es algo que yo pueda hacer nada, sé que la versión de memcached no es el más nuevo, pero estas son las cartas que he recibido.

  • Memcached 1.4.5
  • Apache 2.2.17
  • PHP 5.3.5

Como una respuesta a @DavidSchwartz 's respuesta: aquí están las estadísticas de la losa que phpmemcacheadmin produce: (hay más de losas btw, a continuación, estos)

(También he pegado estadísticas de un poco más adelante en formato de texto aquí)

Slab details

ACTUALIZACIÓN

He reiniciado el demonio con-f 1.5, y se veía realmente bien. Después de algunos calentamiento habíamos usado / desperdicio de 50 / 50 . Pero, al igual que antes, el más largo que hemos tenido en el día (se pone más ocupado durante el día) se empezó a caer de nuevo a lo que es actualmente: 30 / 70, y perdió sigue en aumento. Aparte de eso, yo todavía no sé dónde está el 'desperdicio'. Veo que esto de la 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 es completa, no tiene desalojado, pero es perder el 117.3 MBytes. El cálculo rápido que hice (me corrigen si me equivoco) fue:

  • la anterior losa tiene un tamaño de porción de 328, de modo peor de los casos esta losa se llena con 329 byte trozos.
  • esto significa que es perder 167 bytes por utilizar chunk = 12942834 bytes = 12.3 MB

Entonces, ¿de dónde los otros 105 MB desperdiciado ? Es más grande que el hermano que está a su lado se parece a esto:

**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

9voto

kali Puntos196

Ha sido un año desde que esta pregunta y no sé si has encontrado tu respuesta, pero te voy a decir, su percepción de la "pérdida" de que está mal.

La pérdida de memoria es asignada en la memoria por lo que no puede ser utilizado por otra aplicación, pero todavía está disponible para memcached.

Para simplificar la explicación, supongamos que usted tiene una memcache con 3MB de ram con 3 Tablas:

slab class  1: chunk size     10485 perslab      100
slab class  2: chunk size    104857 perslab       10
slab class  3: chunk size   1048576 perslab        1

Ejecutar un solo "set" con un 10k tamaño. Vas a ver en sus estadísticas(aproximadamente) que tiene:

0.03% used
66.6% free
33% wasted

Esto es debido a que memcached asignado un único fragmento de "losa" clase 1 y el 99% de la memoria para que la losa se "malgasta" y el 1% es "utilizado" Esto no significa que la losa y la memoria asignada para que la losa se ha ido.

Ejecutar otro single "set" con 10k de tamaño. Esta vez podrás ver:

0.06% used
66.6% free
32.7% wasted

así que ahora usted está usando 2 de cada 100 asignado trozos en losa 1, "pérdida" de las estadísticas de caer, y utiliza las estadísticas de aumento.

No hay nada de malo para utilizarse% + desperdiciado% ser igual a 100%. Eso no significa que no tenga más memoria a la izquierda, simplemente significa que la asignación de al menos un capitulo de cada losa.

A ver este tema un "conjunto" con 100k tamaño y otro con 1000k tamaño

Ahora vamos a ver

36.6% used
   0% free
63.3% wasted

6voto

David Schwartz Puntos22683

Usted probablemente tiene un número muy grande de objetos muy pequeños. Normalmente, el más pequeño de la losa tiene 104 bytes de entradas. Si usted tiene un montón de entradas que acaba de asignar un número entero a otro, usted puede obtener los residuos de hasta 85%.

Usted puede encontrar información acerca de cómo ajustar alrededor de esto en el artículo de Memcached para objetos pequeños.

-1voto

pedigree Puntos1

Tuve este problema y se trasladó de memcached para redis (sin disco basado en el ahorro). Sé que esto no podría ser posible, pero se podría tratar como una opción y mantener un ojo en la fragmentación de la memoria. Usted podría incluso dar vuelta a la persistencia en revisión "viejo caché" problemas en el reinicio.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: