Hier sind einige Quellen für "versteckten" Speicherverbrauch in Redis:
-
Marc erwähnte bereits die Puffer, die der Master bereithält, um den Slave zu füttern. Wenn ein Slave hinter seinem Master zurückbleibt (weil er zum Beispiel auf einer langsameren Box läuft), dann wird etwas Speicher auf dem Master verbraucht.
-
Wenn lange laufende Befehle erkannt werden, protokolliert Redis sie im SLOWLOG-Bereich, was etwas Speicher beansprucht. Sie können den Befehl SLOWLOG LEN verwenden, um die Anzahl der Datensätze zu überprüfen, die Sie hier haben.
-
Kommunikationspuffer können auch Speicher beanspruchen. Soweit ich mich erinnere, war es bei alten Versionen von Redis (und 2.4 ist ziemlich alt - Sie sollten wirklich aktualisieren) unbegrenzt, was bedeutet, dass der mit dieser Client-Verbindung verbundene Kommunikationspuffer wächst, wenn Sie ein großes Objekt an einem Punkt übertragen und nie schrumpfen. Wenn es viele Kunden gibt, die gelegentlich mit großen Objekten zu tun haben, könnte dies eine mögliche Erklärung sein. Wenn Sie Befehle verwenden, die sehr große Daten von Redis (auf einmal) abrufen, kann dies auch eine Erklärung sein. Beispielsweise verbraucht ein einfacher KEYS *-Befehl, der auf einem Redis-Server angewendet wird, auf dem Millionen von Schlüsseln gespeichert sind, eine erhebliche Menge an Arbeitsspeicher.
Sie haben erwähnt, dass Sie Objekte mit einer Größe von bis zu 25 MB haben. Sie haben 404 Client-Verbindungen, wenn jede von ihnen zu einem bestimmten Zeitpunkt auf solche Objekte zugreifen muss, verbraucht dies 10 GB Speicher.