Mémoire inutilisée (?) Élevée inattendue dans Memcached

18

Mis à jour, voir en bas de la longue question (désolé).

En regardant nos statistiques memcached, je pense avoir trouvé un problème dont je n'étais pas au courant auparavant. Il semble que nous ayons étrangement beaucoup d'espace perdu. J'ai vérifié avec phpmemcacheadmin pour un changement et j'ai trouvé cette image me fixant:

graphique de la taille du cache memcached

Maintenant, j'avais l'impression que le pire des cas serait qu'il y ait 50% de déchets, bien que je sois le premier à admettre ne pas connaître tous les détails. J'ai lu - entre autres - cette page qui est en effet un peu ancienne, mais notre version de memcached aussi. Je pense que je comprends le fonctionnement du système ( par exemple ), je crois, mais j'ai du mal à comprendre comment nous pourrions atteindre 76% d'espace perdu.

Le taux d'expulsion que phpmemcacheadmin montre est 2 ev/sdonc il y a un problème ici.

  • La question principale est: que puis-je faire pour résoudre ce problème . Je pourrais y ajouter plus de mémoire (il y en a de plus, je pense), peut-être que je devrais jouer avec la configuration de la dalle (est-ce même possible avec cette version?), Peut-être qu'il y a d'autres options? La mise à niveau de la version memcached n'est pas une option rapidement disponible.

  • La question secondaire, par curiosité, est bien sûr de savoir si le taux de gaspillage de 75% (et en augmentation) est attendu, et si oui, pourquoi.

Système: Je ne peux rien faire pour le moment, je sais que la version memcached n'est pas la plus récente, mais ce sont les cartes qui m'ont été distribuées.

  • Memcached 1.4.5
  • Apache 2.2.17
  • PHP 5.3.5

En réponse à la réponse de @DavidSchwartz: voici les statistiques des dalles produites par phpmemcacheadmin: (il y a plus de dalles que celles-ci)

( J'ai également collé des statistiques un peu plus tard au format texte ici )

Détails de la dalle

MISE À JOUR

J'ai redémarré le démon avec -f 1.5, et ça avait l'air vraiment bien. Après un peu de réchauffement, nous avons eu une utilisation / gaspillage de 50/50. Mais, comme avant, plus nous avions de temps dans la journée (cela devient plus occupé pendant la journée), il a commencé à retomber à ce qu'il est actuellement: 30/70, et le gaspillage continue d'augmenter. En dehors de cela, je ne sais toujours pas d'où vient le «gaspillage». Je vois cette dalle:

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

Il n'est pas plein, il n'a pas été expulsé, mais il gaspille 117,3 Mo. Le calcul rapide que j'ai fait (corrigez-moi si je me trompe) était:

  • la dalle précédente a une taille de bloc de 328, dans le pire des cas, cette dalle est remplie de blocs de 329 octets.
  • cela signifie qu'il gaspille 167 octets par bloc utilisé = 12942834 octets = 12,3 Mo

Alors d'où viennent les autres 105 Mo gaspillés ? C'est un grand frère juste à côté, il ressemble à ceci:

**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
la source
Le problème est qu'il y a des tonnes d'espace inutilisé dans les autres dalles, mais la dalle 3 est 100% pleine et voit des expulsions.
David Schwartz
Bon point, cela expliquerait les expulsions, même si je ne suis pas vraiment sûr de la façon dont le nombre «gaspillé» est calculé. Si la dalle 8 n'a utilisé que 13,9%, il doit sûrement y avoir de l'espace "libre"?
Nanne
Oui, il y a de l'espace libre dans cette dalle. Mais cela n'aide pas si les objets qui sont expulsés ne vont pas dans cette dalle.
David Schwartz
C'est ce que j'ai compris dans votre réponse, mais pourquoi n'y a-t-il pas d'espace libre répertorié? Il devrait y avoir une partie de ce graphique à secteurs blanc (comme c'est le cas sur mon installation de test) s'il reste encore de l'espace, du moins, c'est ce que je pensais
Nanne

Réponses:

10

Cela fait un an depuis cette question et je ne sais pas si vous avez trouvé votre réponse, mais je vais dire que votre perception du «gaspillage» est fausse.

La mémoire gaspillée est allouée en mémoire, elle ne peut donc pas être utilisée par une autre application, mais elle est toujours disponible pour memcached.

Pour simplifier l'explication, supposons que vous avez un memcache avec 3 Mo de RAM avec 3 dalles:

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

Exécutez un seul "ensemble" avec une taille de 10k. Vous verrez dans vos statistiques (en gros) que vous avez:

0.03% used
66.6% free
33% wasted

En effet, memcached a alloué un seul morceau de la "classe de dalle 1" et 99% de la mémoire de cette dalle est "gaspillée" et 1% est "utilisée". Cela ne signifie pas que la dalle et la mémoire allouée pour cette dalle ont disparu.

Exécutez un autre "ensemble" unique de taille 10k. Cette fois, vous verrez:

0.06% used
66.6% free
32.7% wasted

alors maintenant vous utilisez 2 des 100 morceaux alloués dans la dalle 1, les statistiques "gaspillées" ont chuté et les statistiques utilisées ont augmenté.

Il n'y a rien de mal à ce que% + gaspillé% utilisé soit égal à 100%. Cela ne signifie pas que vous n'avez plus de mémoire, cela signifie simplement que vous avez alloué au moins un morceau de chaque dalle.

Pour voir ce problème, un "ensemble" avec une taille de 100k et un autre avec une taille de 1000k

Vous allez maintenant voir

36.6% used
   0% free
63.3% wasted
kali
la source
Ça sonne bien! Avez-vous un lien pour sauvegarder cela? Si c'est le cas, cela signifie que mon serveur memcache fonctionnait mieux, alors nous pensons :). Si je vous comprends bien, c'est que le gaspillage signifie qu'il a été alloué, mais qu'il est toujours disponible pour utilisation. Cela signifie que si rien n'est gratuit, vous ne pouvez pas allouer plus de dalles, mais cela ne devrait pas signifier que vous avez un problème en soi?
Nanne
1
Je n'ai pas de lien au dessus de ma tête mais c'est très simple de se tester. Appuyez sur votre ligne de commande et créez un exemple de petit serveur pour tester son fonctionnement. Vous pouvez utiliser l'option -vv pour les messages de débogage détaillés, qui vous montreront les dalles créées initialement, c'est-à-dire: "memcached -vv -p 11500 -m 3 -n 10000 -f 10" vous créera 3 dalles avec des tailles de bloc 10k 100k et 1000k. Et continuez à émettre des "ensembles" et voyez vos statistiques gaspillées / utilisées changer exactement comme je l'ai décrit ci-dessus.
kali
bon point. maintenant pour découvrir comment je peux obtenir une attention supplémentaire à cette réponse pour vous :)
Nanne
6

Vous avez probablement un très grand nombre de très petits objets. En règle générale, la plus petite dalle contient des entrées de 104 octets. Si vous avez beaucoup d'entrées qui ne font que mapper un entier à un autre, vous pouvez obtenir un gaspillage pouvant atteindre 85%.

Vous pouvez trouver des informations sur la façon de régler cela dans l'article Memcached pour les petits objets .

David Schwartz
la source
Si je lis correctement la page des statistiques, ce n'est pas le cas. La plupart des déchets se trouvent dans une dalle de 480,0 octets. Permettez-moi de vérifier si je peux montrer des statistiques ...
Nanne
Oh, alors c'est bien et normal, rien à craindre. Il y a juste moins de données là-dedans maintenant. (Notez, par exemple, que cette dalle n'est utilisée qu'à 14%.)
David Schwartz
Mais comment un gaspillage de 75% est-il normal? Ce nombre inclut-il l'espace inutilisé? Je m'attends à ce que cela soit considéré comme "gratuit". En outre, nous constatons une augmentation du gaspillage // une diminution de la mémoire utilisée au fil de la journée, tandis que le site devient plus occupé. Cela et le fait que nous ayons des expulsions me font me demander ce qui peut être fait.
Nanne
Avoir moins de dalles peut éviter le problème de trop de mémoire coincée dans la mauvaise dalle. Par exemple, -f 1.5 -I 2800peut aider.
David Schwartz
La page de manuel n'est pas trop claire: le -I 2800, cela signifie 2800K, par opposition au 1M par défaut?
Nanne
-1

J'ai eu ce problème et je suis passé de memcached à redis (sans enregistrement sur disque). Je sais que cela pourrait ne pas être possible, mais vous pouvez l'essayer en option et garder un œil sur la fragmentation de la mémoire. Vous pouvez même activer la persistance pour corriger les problèmes de «l'ancien cache» au redémarrage.

pedigree
la source