2016-04-02 6 views
2

Da ich kein zuverlässiges Programm im Netz finden konnte, das alle Memcache-Schlüssel abruft, sobald die Taste in einer Platte> 500k zählt, wollte ich mein eigenes Programm schreiben PHP.Memcached: Wie man die Beschränkung beim Abrufen aller Schlüssel durchbricht

Dann erkannte ich, dass es einen Grund gibt, warum alle Programme für diese hohe Anzahl von Schlüsseln nicht wirklich funktionierten.

Wenn ich die Schlüssel mit stats cachedump <slab-id> <limit> lese, gibt es nur eine bestimmte Anzahl von Schlüsseln zurück, die in meinem Fall um ungefähr 30k endet.

Wie bekomme ich mindestens diese 500k, die in einer Platte sein können?

Alle "Beiträge" und "Antworten", die die Verwendung memdump vorschlagen, funktionieren nicht. Sie haben diese Einschränkung auch.

I memcached 1.4.25

Antwort

1

Nach Debuggen der memcached Quelle verwende erkannte ich die Beschränkung in items.c/item_cachedump() durch diese Linie verursacht ist:

unsigned int memlimit = 2 * 1024 * 1024; /* 2MB max response size */ 

Aufgrund dieser Zuordnung der zugewiesene Puffer, um die Menge der Grenzen Schlüssel zurückgegeben, weil die Gesamtlänge aller Schlüssel [einschließlich \r\n nach jedem Schlüsselnamen] nicht überschreiten diese Größe.

konnte ich für meinen Fall das Problem auf diese Weise lösen, dass ich es geändert:

unsigned int memlimit = 128 * 1024 * 1024; 

und neu zu kompilieren memcached. Jetzt kann ich ungefähr 700k Schlüssel lesen [Ich hatte nicht mehr Schlüssel, um die Funktion zu maximieren].

Ich fand heraus, dass ein sehr hoher Wert das System instabil macht. Mit einem Wert von 500 * 1024 * 1024 [e.q. 500MB] mein System abgestürzt fast mit diesen Meldungen:

Shell-init: error Abrufen von aktuellem Verzeichnis: getcwd: nicht geordnete Verzeichnisse zugreifen: Keine solchen Datei oder das Verzeichnis

Sogar mein Server 5 GB RAM Ich verstehe nicht wirklich warum, aber am Ende ist ein Wert von 128 MB ein brauchbarer Wert.

Ich fragte die memcacheddeveloper team, um einen Schalter hinzuzufügen, der den Wert in der Befehlszeile festlegen kann.