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:
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/s
donc 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 )
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
Réponses:
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:
Exécutez un seul "ensemble" avec une taille de 10k. Vous verrez dans vos statistiques (en gros) que vous avez:
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:
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
la source
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 .
la source
-f 1.5 -I 2800
peut aider.-I 2800
, cela signifie 2800K, par opposition au 1M par défaut?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.
la source