Unerwarteter (?) Hoher Speicherbedarf im Speicher


18

Aktualisiert, siehe unter der längsten (sorry) Frage.

Wenn ich mir unsere gespeicherten Statistiken ansehe, denke ich, dass ich ein Problem gefunden habe, von dem ich vorher nichts wusste. Es scheint, dass wir eine seltsam hohe Menge an verschwendetem Platz haben. Ich habe mich zur Abwechslung bei phpmemcacheadmin erkundigt und festgestellt, dass dieses Bild mich anstarrt:

Grafik für Größe des zwischengespeicherten Caches

Jetzt hatte ich den Eindruck, dass im schlimmsten Fall 50% Abfall anfallen, obwohl ich als Erster zugebe, nicht alle Details zu kennen. Ich habe unter anderem diese Seite gelesen, die zwar etwas alt ist, aber auch unsere Version von memcached. Ich glaube, ich verstehe, wie das System funktioniert ( z. B. ), aber es fällt mir schwer, zu verstehen, wie wir 76% verschwendeten Speicherplatz erreichen können.

Die Räumungsrate, die phpmemcacheadmin anzeigt, ist 2 ev/s, daher gibt es hier ein Problem.

  • Die primäre Frage ist: Was kann ich dieses Problem beheben tun . Ich könnte mehr Speicher darauf werfen (ich denke, es ist einiges mehr verfügbar), vielleicht sollte ich mit der Plattenkonfiguration experimentieren (ist das mit dieser Version überhaupt möglich?), Vielleicht gibt es noch andere Optionen? Das Aktualisieren der zwischengespeicherten Version ist keine schnell verfügbare Option.

  • Aus Neugier stellt sich natürlich die Frage, ob und warum eine Verschwendung von 75% (und mehr) Platz zu erwarten ist.

System: Gegen dieses Problem kann ich derzeit nichts unternehmen. Ich weiß, dass die zwischengespeicherte Version nicht die neueste ist, aber das sind die Karten, die mir ausgeteilt wurden.

  • Memcached 1.4.5
  • Apache 2.2.17
  • PHP 5.3.5

Als Antwort auf die Antwort von @DavidSchwartz: Hier sind die Plattenstatistiken, die phpmemcacheadmin erstellt: (es gibt übrigens mehr Platten als diese)

( Ich habe hier auch Statistiken von etwas später im Textformat eingefügt. )

Plattendetails

AKTUALISIEREN

Ich habe den Daemon mit -f 1.5 neu gestartet und es sah wirklich gut aus. Nach einigem Aufwärmen hatten wir einen von 50/50 verbraucht / verschwendet. Aber je länger wir an dem Tag waren (es wird tagsüber geschäftiger), umso mehr fiel es auf das zurück, was es aktuell ist: 30/70, und die Verschwendung steigt immer noch. Abgesehen davon weiß ich immer noch nicht, woher die "Verschwendeten" kommen. Ich sehe diese Platte:

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

Es ist nicht voll, es wurde nicht geräumt, aber es verschwendet 117,3 MByte. Die schnelle Berechnung, die ich gemacht habe (korrigiere mich, wenn ich falsch liege), war:

  • Die vorherige Platte hat eine Blockgröße von 328, daher ist diese Platte im schlimmsten Fall mit 329-Byte-Blöcken gefüllt.
  • Dies bedeutet, dass pro verwendetem Block 167 Byte = 12942834 Byte = 12,3 MB verschwendet werden

Woher kamen dann die anderen verschwendeten 105 MB ? Es ist größerer Bruder direkt daneben sieht so aus:

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

Das Problem ist, dass in den anderen Platten jede Menge ungenutzter Speicherplatz vorhanden ist, während die Platte 3 zu 100% voll ist und Räumungen aufweist.
David Schwartz

Guter Punkt, das würde die Räumungen erklären, obwohl ich nicht wirklich sicher bin, wie die "verschwendete" Zahl berechnet wird. Wenn die Platte 8 nur zu 13,9% genutzt wird, muss dort doch noch Platz frei sein?
Nanne

Ja, es gibt freien Platz in dieser Platte. Aber das hilft nichts, wenn die Objekte, die geräumt werden, nicht in diese Platte gelangen.
David Schwartz

Das habe ich anhand Ihrer Antwort herausgefunden, aber warum ist dort kein freier Speicherplatz aufgeführt? Es sollte einen Teil dieses weißen Kreisdiagramms geben (wie es in meiner Testinstallation ist), wenn noch Platz vorhanden ist, zumindest dachte ich das
Nanne

Antworten:


10

Seit dieser Frage ist ein Jahr vergangen und ich weiß nicht, ob Sie Ihre Antwort gefunden haben, aber ich werde sagen, dass Ihre Wahrnehmung von "verschwendet" falsch ist.

Der verschwendete Speicher wird im Arbeitsspeicher zugewiesen, sodass er nicht von einer anderen Anwendung verwendet werden kann, er ist jedoch weiterhin für den Speicher verfügbar.

Nehmen Sie zur Vereinfachung der Erklärung an, Sie haben einen Memcache mit 3 MB RAM mit 3 Platten:

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

Führen Sie einen einzelnen "Satz" mit einer Größe von 10 KB aus. Sie werden in Ihrer Statistik (ungefähr) sehen, dass Sie:

0.03% used
66.6% free
33% wasted

Dies liegt daran, dass memcached einen einzelnen Block aus "Brammenklasse 1" zugewiesen hat und 99% des Speichers für diese Bramme "verschwendet" und 1% "verbraucht" ist. Dies bedeutet nicht, dass die Bramme und der für diese Bramme zugewiesene Speicher verschwunden sind.

Führen Sie einen weiteren einzelnen "Satz" mit einer Größe von 10 KB aus. Diesmal wirst du sehen:

0.06% used
66.6% free
32.7% wasted

Jetzt verwenden Sie 2 von 100 zugewiesenen Blöcken in Block 1, die "verschwendeten" Statistiken wurden gelöscht und die verwendeten Statistiken wurden erhöht.

Es ist nichts falsch daran, dass used% + wasted% gleich 100% ist. Das bedeutet nicht, dass Sie keinen Speicher mehr haben, sondern nur, dass Sie von jeder Platte mindestens einen Block zugewiesen haben.

Um dieses Problem zu sehen, wählen Sie einen "Satz" mit einer Größe von 100 KB und einen anderen mit einer Größe von 1000 KB

Jetzt wirst du sehen

36.6% used
   0% free
63.3% wasted

Das klingt gut! Haben Sie einen Link, um dies zu sichern? Wenn ja, bedeutet das, dass mein Memcache-Server besser lief (läuft) als wir denken :). Wenn ich Sie richtig verstehe, bedeutet das, dass es zugewiesen wurde, aber immer noch zur Verwendung verfügbar ist. Das heißt, wenn nichts frei ist, können Sie zwar keine weiteren Platten zuweisen, aber sollten Sie nicht per se ein Problem haben?
Nanne

1
Ich habe keinen Link auf meinem Kopf, aber es ist sehr einfach, sich selbst zu testen. Drücken Sie die Befehlszeile und erstellen Sie einen kleinen Beispielserver, um die Funktionsweise zu testen. Sie können die Option -vv für ausführliche Debug-Meldungen verwenden, in denen die anfänglich erstellten Blöcke angezeigt werden. Beispiel: "memcached -vv -p 11500 -m 3 -n 10000 -f 10" erstellt 3 Blöcke mit den Blockgrößen 10k 100k und 1000k. Und geben Sie weiterhin "Sets" aus und sehen Sie, dass sich Ihre verschwendeten / verwendeten Statistiken genau wie oben beschrieben ändern.
Kali

guter Punkt. Jetzt erfahren Sie, wie ich diese Antwort für Sie besonders hervorheben kann :)
Nanne

6

Sie haben wahrscheinlich eine sehr große Anzahl sehr kleiner Objekte. In der Regel enthält die kleinste Platte 104-Byte-Einträge. Wenn Sie viele Einträge haben, die nur eine Ganzzahl einer anderen zuordnen, können Sie bis zu 85% Makulatur verursachen.

Informationen dazu finden Sie im Artikel Memcached für kleine Objekte .


Wenn ich die Statistikseite richtig gelesen habe, ist dies nicht der Fall. Der größte Teil des Abfalls befindet sich in einer Platte mit 480,0 Byte großen Stücken. Lassen Sie mich überprüfen, ob ich einige Statistiken zeigen kann ...
Nanne

Oh, dann ist das in Ordnung und normal, nichts, worüber man sich Sorgen machen müsste. Es sind nur noch weniger Daten vorhanden. (Beachten Sie zum Beispiel, dass diese Platte nur zu 14% verwendet wird.)
David Schwartz

Aber wie werden 75% normal verschwendet? Enthält diese Nummer nicht genutzten Speicherplatz? Ich würde erwarten, dass dies als "frei" gewertet wird. Außerdem sehen wir eine Zunahme der // Verschwendung und eine Abnahme des genutzten Arbeitsspeichers im Laufe des Tages, während die Website immer geschäftiger wird. Das und die Tatsache, dass wir Räumungen haben, lassen mich fragen, was getan werden kann.
Nanne

Wenn weniger Platten vorhanden sind, kann das Problem vermieden werden, dass zu viel Speicher in der falschen Platte steckt. Zum Beispiel -f 1.5 -I 2800kann helfen.
David Schwartz

Die Manpage ist nicht zu übersichtlich: die -I 2800, das heißt 2800K, im Gegensatz zur 1M-Voreinstellung?
Nanne

-1

Ich hatte dieses Problem und wechselte von memcached zu redis (ohne festplattenbasiertes Speichern). Ich weiß, dass dies möglicherweise nicht möglich ist, aber Sie können es als Option ausprobieren und die Speicherfragmentierung im Auge behalten. Sie können sogar die Persistenz aktivieren, um "alte Cache" -Probleme beim Neustart zu beheben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.