Memoria inesperada (?) Alta 'desperdiciada' en memcached

18

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:

gráfico de tamaño de caché memcached

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í )

Detalles de losa

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
Nanne
fuente
El problema es que hay toneladas de espacio no utilizado en las otras losas, sin embargo, la losa 3 está 100% llena y ve desalojos.
David Schwartz
Buen punto, eso explicaría los desalojos, aunque no estoy realmente seguro de cómo se calcula el número 'desperdiciado'. Si la losa 8 solo tiene un 13.9% de uso, ¿seguramente debe quedar algo de espacio "libre"?
Nanne
Sí, hay espacio libre en esa losa. Pero eso no ayuda si los objetos que están siendo desalojados no entran en esa losa.
David Schwartz
Eso es lo que deduje de su respuesta, pero ¿por qué no hay espacio libre en la lista? Debería haber alguna parte de ese gráfico circular blanco (como está en mi instalación de prueba) si todavía queda espacio, al menos, eso es lo que pensé
Nanne

Respuestas:

10

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:

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

Ejecute un solo "conjunto" con un tamaño de 10k. Verás en tus estadísticas (aproximadamente) que tienes:

0.03% used
66.6% free
33% wasted

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:

0.06% used
66.6% free
32.7% wasted

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

36.6% used
   0% free
63.3% wasted
kali
fuente
¡Eso suena bien! ¿Tienes algún enlace para respaldar esto? Si es así, eso significa que mi servidor memcache estaba (está) funcionando mejor, entonces pensamos :). Si entiendo correctamente es que el desperdicio significa que se ha asignado, pero todavía está disponible para su uso. Esto significa que si nada es gratis, no puede asignar más losas, pero ¿no debería significar que tiene un problema per se?
Nanne
1
No tengo un enlace en la parte superior de mi cabeza, pero es muy fácil ponerse a prueba. Presione su línea de comando y cree un pequeño servidor de muestra para probar cómo funciona. Puede usar la opción -vv para mensajes de depuración detallados, que le mostrarán losas creadas inicialmente, es decir: "memcached -vv -p 11500 -m 3 -n 10000 -f 10" creará 3 losas con trozos de 10k 100k y 1000k. Y siga emitiendo "conjuntos" y vea que sus estadísticas desperdiciadas / usadas cambian exactamente como lo describí anteriormente.
kali
buen punto. ahora para descubrir cómo puedo obtener un poco de atención adicional a esta respuesta para usted :)
Nanne
6

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 .

David Schwartz
fuente
Si leo la página de estadísticas correctamente, este no es el caso. La mayoría de los desechos se encuentran en una losa con 480.0 Byte-trozos. Déjame comprobar si puedo mostrar algunas estadísticas ...
Nanne
Oh, entonces esto está bien y es normal, no hay nada de qué preocuparse. Solo hay menos datos allí ahora. (Observe, por ejemplo, que esa losa se usa solo el 14%.)
David Schwartz
Pero, ¿cómo se desperdicia el 75% de lo normal? ¿Este número incluye espacio no utilizado? Espero que se cuente como "gratis". Además, vemos un aumento en el desperdicio // una disminución en la memoria usada a medida que pasa el día, mientras el sitio se vuelve más ocupado. Eso, y el hecho de que tenemos desalojos, me hacen preguntarme qué se puede hacer.
Nanne
Tener menos losas puede ayudar a evitar el problema de que demasiada memoria se atasque en la losa incorrecta. Por ejemplo, -f 1.5 -I 2800puede ayudar.
David Schwartz
La página de manual no está muy clara: ¿ -I 2800eso significa 2800K, en oposición al valor predeterminado de 1M?
Nanne
-1

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.

árbol genealógico
fuente