Warum löscht Linux den Speichercache, wenn er fast voll ist?

14

So sieht das Speicherdiagramm auf einem VPS aus, auf dem CentOS mit 512 MB RAM und nginx / php-fpm / mysqld ausgeführt wird, um (meist statische) Inhalte für ein paar tausend Besucher pro Tag bereitzustellen.

Wöchentliches Speicherdiagramm

(das sind Tage auf der x-Achse)

Wie Sie sehen, ist es im Cache- und Pufferbereich ziemlich nervös. Der Speicher-Cache wird in unregelmäßigen Abständen geleert (dies schließt einen verantwortlichen Cron-Job aus). Es wird normalerweise, aber nicht immer, an dem Punkt gespült, an dem es nicht größer werden kann. Manchmal klart es fast vollständig auf, manchmal nur auf halber Strecke.

Ich versuche die Logik hinter diesen Säuberungen zu verstehen. Ich würde erwarten, dass Dateidaten viel länger zwischengespeichert werden und sehe keine anderen Programme, die mehr Speicher als gewöhnlich belegen, wenn der Speicher-Cache geleert wird.

Ist das normal oder fehlt mir etwas?

UPDATE: Ein Speicher-Upgrade scheint die Grafik stabilisiert zu haben. Immer noch kleine Tropfen zu sehen, aber nirgendwo so bedeutend wie vor dem Upgrade.

Nach der Speichererweiterung

Redburn
quelle
Handelt es sich um einen OpenVZ / Virtuozzo-Container oder eine echte VM wie XEN oder KVM?
Jordanien
1
Kann nicht erklären, was sie sind, aber ich habe einen VPS, der das gleiche Verhalten zeigt. dl.dropbox.com/u/1578899/memory-week.png
EightBitTony
@jordanm Es ist eine Xen-basierte virtuelle Maschine.
Redburn
@EightBitTony Danke fürs Teilen. Ihre sieht ein bisschen "natürlicher" aus, aber ich sehe deutlich ein ähnliches (aber vielleicht vorhersehbareres) Muster von Tropfen im Speicher-Cache.
Redburn
Ich habe mich gefragt, ob Munin 2 die Daten so unterschiedlich grafisch darstellt / sammelt, dass sich einige Unterschiede ergeben (glattere Grafik auf Ihrer), aber selbst meine zeigt eher einen Rückgang in der Mitte eines Zyklus als täglich. Es ist sicher seltsam.
EightBitTony

Antworten:

3

Könnte eine Menge Dinge sein. Möglicherweise verwendet eines der Programme, die Sie ausführen, gelegentlich und kurzzeitig viel RAM. Wenn dies wirklich Wochen auf der x-Achse sind, sollten Sie eine Abtastung mit einer viel höheren Auflösung durchführen (z. B. einmal pro Minute oder sogar in der Sekunde), um weitere Informationen darüber zu erhalten, was passiert, wenn der Cache gelöscht wird. psund die topAusgabe (einschließlich des Lastdurchschnitts) während dieser Zeit wäre ebenfalls nützlich.

Jim Paris
quelle
Ja, ich denke, wir könnten die Theorie aufstellen, dass ein sehr kurzer, plötzlicher Speicherverbrauch, der in ungefähr einer Minute auftritt und von Munin nicht entdeckt wird, den Cache entleeren könnte, der natürlich entdeckt wird, weil er bestehen bleibt.
EightBitTony
Der Header ist insofern etwas verwirrend, als er tatsächlich eine Woche Daten anzeigt. Das sind also Tage auf dem X-As, keine Wochen. Was die Abrufhäufigkeit betrifft: Munin ruft alle 5 Minuten Daten ab, und ich glaube nicht, dass die Häufigkeit geändert werden kann. Ich verwende nur nginx, mysql, php-fpm und munin-node. Kann es vielleicht etwas mit dem MySQL-Cache zu tun haben?
Redburn
Ich ließ top (sortiert nach Speichernutzung) alle 5 Sekunden seine Ausgabe in eine Datei schreiben, dann analysierte ich diese Datei und fand keine Prozesse, die an dem Punkt ungewöhnliches Verhalten zeigten, an dem der zwischengespeicherte Speicher plötzlich abfiel. Ich bin nicht davon überzeugt, dass dies die Ursache sein könnte, es sei denn, ein Prozess kann so viel Speicher belegen und trotzdem das 5-Sekunden-Fenster verlassen. Aber wenn es keine Prozesse gibt, die Amok laufen, woran könnte es liegen?
Redburn
Dieser Thread ist ein bisschen abgestanden, aber eine schnelle Beobachtung über Methodik: wie viel ein Prozess trägt zu der Systemspeicher - Cache wird nicht (leicht) in widerspiegeln oben , da ein sehr aktiver Prozess Sachen in den Cache sehr schnell ohne eigene anhäufen kann allokierter Speicher steigt stark an. Zum Beispiel eine sehr große Datei in kleinen Stücken für die Übertragung zu lesen - , während der Prozess nie mehr als ein paar MB verwenden kann zugewiesen werden die wenige MB ständig ändern und sammeln Referenzen im Cache. In der Top-Ausgabe sollte man sich also eine plötzliche Akkumulation der CPU-Zeit ansehen.
Goldlöckchen
Das könnte Sie auch interessieren: cognitivedissonance.ca/cogware/plog
goldilocks 06.12.12
2

Ein möglicher Grund wäre, dass eine wachsende Datei, beispielsweise ein Protokoll, entfernt, komprimiert oder an eine andere Stelle gesendet wird, wenn sie eine bestimmte Größe erreicht.

In beiden Fällen wird die zwischengespeicherte Größe, möglicherweise die gesamte Größe, wenn in Ihrem Betriebssystem kein Speicherdruck vorhanden ist, aus dem Cache freigegeben, sobald die ursprüngliche Datei entfernt wird.

jlliagre
quelle
Eine interessante Idee, aber die aktivsten Protokolldateien überschreiten selten eine Dateigröße von 25 MB, bevor sie gedreht werden, und die Cache- / Puffernutzung sinkt tendenziell um etwa 200 MB.
Redburn