Frage Warum Caches in Linux löschen?


In unseren Servern haben wir die Angewohnheit, Caches um Mitternacht fallen zu lassen.

sync; echo 3 > /proc/sys/vm/drop_caches

Wenn ich den Code ausführe, scheint viel RAM frei zu sein, aber das muss ich wirklich tun. Ist kein freier RAM eine Verschwendung?


81
2018-05-20 03:12


Ursprung


Finde die Person, die das gemacht hat und frage ihn, warum er es getan hat. Wie Sie richtig geraten haben, gibt es keinen offensichtlichen guten Grund dafür. - Michael Hampton♦
Den Kernel debuggen. Das ist alles. Dadurch wird kein RAM freigegeben. Es lässt Caches fallen, wie der Name andeutet, und reduziert so die Performance. - Michael Hampton♦
@ivcode Dann sollten Sie das Problem mit diesem Server finden und beheben, anstatt zu versuchen, die Bedingungen zu vermeiden, die es verursachen. Wenn mein Auto jedes Mal, wenn ich scharf nach rechts abgebogen bin, ins Stocken geriet, ist das Vermeiden von scharfen Rechtskurven eine miese Lösung. - David Schwartz
verbunden thedailywtf.com/Articles/Modern-Memory-Management.aspx Streng argumentieren, es ist eine schlechte Idee. - Drunix
Verwandte und eine nützliche Beschreibung des "Problems": linuxatemyram.com - Bill Weiss


Antworten:


Sie sind zu 100% korrekt. Es ist nicht eine gute Praxis, um RAM freizugeben. Dies ist wahrscheinlich ein Beispiel für eine Cargo- Kult-Systemverwaltung.


85
2018-05-20 04:59



+1 für die Erwähnung der Cargo Cult System Administration. Jeder Systemadministrator, der diesen Begriff nicht kennt und was es bedeutet, sollte entlassen werden. - Tonny
@Tonny: Wir wären ohne Sysadmin-Abteilung dann :( - PlasmaHH
Wie die meisten Menschen, liebe ich lapidare Behauptungen mit viel Zustimmung, aber eine Andeutung oder Argumentation würde meinen Superegos +1 verdienen. - Aaron Hall
Erklären Sie die Frachtkult-Verwaltung, sowie die oben genannten, wenn es Ihnen nichts ausmacht. Vielleicht in einem Follow-on-Schnitt? Ich vergesse immer noch meine +1 ...: P - Aaron Hall
"Es ist möglich, dass Ihre Anwendung zwar nicht diesen Arbeitsspeicher verwendet, aber Linux sich aggressiv in seinen Arbeitsspeicher einlagert und obwohl die Anwendung Speicher benötigt, wird sie einige dieser Zwischenspeicher nicht freigeben, sondern lieber mit dem Austausch beginnen." Nicht sehr spezifisch. In der Praxis ist die Speicherverwaltung nicht perfekt, und es ist eine gute Sache, einen Knopf zu haben, um sich zu drehen, wenn diese Unvollkommenheit auftaucht. - Dan Pritts


Ja, wenn Sie den Cache leeren, wird zwar RAM freigegeben, aber der Kernel sucht nach Dateien auf der Festplatte und nicht im Cache, was zu Leistungsproblemen führen kann.

Normalerweise löscht der Kernel den Cache, wenn der verfügbare RAM erschöpft ist. Es schreibt häufig verschmutzten Inhalt mit pdflush auf die Festplatte.


62
2018-05-20 06:26



+1 zum Erklären Warum Es ist eine schlechte Idee. - Ogre Psalm33


Der Grund, solche Caches zu löschen, ist das Benchmarking der Festplattenleistung, und das ist der einzige Grund, warum es existiert.

Wenn Sie einen I / O-intensiven Benchmark ausführen, möchten Sie sichergehen, dass die verschiedenen Einstellungen, die Sie versuchen, alle Festplatten-I / O ausführen. Daher ermöglicht Ihnen Linux, Caches zu löschen, anstatt einen vollständigen Neustart durchzuführen.

Um aus dem zu zitieren Dokumentation:

Diese Datei ist kein Mittel, um das Wachstum der verschiedenen Kernel zu kontrollieren   Caches (Inodes, Dentries, Pagecache, etc ...) Diese Objekte sind   wird automatisch vom Kernel zurückgewonnen, wenn Speicher anderweitig benötigt wird   auf dem System.

Die Verwendung dieser Datei kann zu Leistungsproblemen führen. Da wird abgeworfen   Zwischengespeicherte Objekte können eine erhebliche Menge an E / A und CPU kosten   Erstellen Sie die abgelegten Objekte neu, besonders wenn sie stark beansprucht wurden.   Aus diesem Grund ist die Verwendung außerhalb einer Test- oder Debuggingumgebung erforderlich   nicht empfohlen.


34
2018-05-20 13:51



Je nach dem, was Sie zu tun versuchen, kann selbst ein vollständiger Neustart den Festplatten-Cache nicht ausreichend löschen. - α CVn
"Diese Objekte werden automatisch vom Kernel zurückgewonnen, wenn Speicher benötigt wird" ist das Entwurfsziel, aber es ist möglicherweise nicht immer das tatsächliche Verhalten. - Dan Pritts
@DanPrits Was genau lässt dich denken, dass es nicht so ist? - Joe
Der offensichtliche Fall ist, wenn Sie RAM löschen möchten, um die Zuweisung von mehr (nicht trparsparenten) großen Seiten zu ermöglichen; Ein weiterer Fall ist eine transparente hugepage garbage collection pause Bugs (siehe meine Antwort / Kommentare an anderer Stelle zu dieser Frage). Aber mein Kommentar war für den allgemeinen Fall gedacht. Manchmal wissen die Leute, die das System bedienen, besser als die Leute, die es entworfen haben. Oft nicht - darum bemüht sich ihr Kommentar zu schützen. Ich bin nur froh, dass die - Dan Pritts


Die Grundidee hier ist wahrscheinlich nicht so schlecht (nur sehr naiv und irreführend): Es können Dateien zwischengespeichert werden, auf die in naher Zukunft kaum zugegriffen werden kann, zum Beispiel Logfiles. Diese "fressenden" Widder müssen später bei Bedarf vom OS auf die eine oder andere Art befreit werden.

Abhängig von Ihren Einstellungen für Swappiness, Dateizugriffsmuster, Speicherzuweisungsmuster und viel mehr unvorhersehbaren Dingen kann es passieren, dass Sie, wenn Sie diese Caches nicht freigeben, später gezwungen sind, wiederverwendet zu werden, was ein wenig mehr Zeit in Anspruch nimmt Zuweisen von Speicher aus dem Pool des nicht verwendeten Speichers. Im schlimmsten Fall führt die Swappiness-Einstellung von Linux dazu, dass der Programmspeicher ausgelagert wird, da Linux denkt, dass diese Dateien in naher Zukunft wahrscheinlich häufiger verwendet werden als der Programmspeicher.

In meiner Umgebung, rät Linux oft falsch, und am Anfang der meisten europäischen Börsen (um 0900 Ortszeit) werden Server anfangen Dinge zu tun, die sie nur einmal am Tag machen, die im Speicher ausgetauscht werden müssen, der vorher durch Schreiben ausgetauscht wurde Log-Dateien, komprimieren, kopieren usw. füllten den Cache bis zu dem Punkt, wo Dinge ausgelagert werden mussten.

Aber ist Caches die Lösung für dieses Problem? Definitiv nicht. Was wäre die Lösung hier ist, Linux zu sagen, was es nicht weiß: dass diese Dateien wahrscheinlich nicht mehr verwendet werden. Dies kann durch die Schreibanwendung mit Dingen wie gemacht werden posix_fadvise()oder mit einem cmd line tool like vmtouch (die auch verwendet werden kann, um Dinge zu untersuchen und Cache-Dateien).

Auf diese Weise können Sie die Daten, die nicht mehr benötigt werden, aus den Caches entfernen und die Sachen, die zwischengespeichert werden sollen, behalten, denn wenn Sie alle Caches löschen, müssen viele Dinge von der Festplatte neu gelesen werden. Und das im schlimmsten möglichen Moment: wenn es gebraucht wird; Verzögerungen in Ihrer Anwendung verursachen, die auffällig und oft inakzeptabel sind.

Was Sie haben sollten, ist ein System, das Ihre Speicherauslastungsmuster überwacht (z. B. wenn etwas ausgetauscht wird) und dann entsprechend analysiert und entsprechend handelt. Die Lösung könnte sein, einige große Dateien am Ende des Tages mit vtouch zu entfernen; Es könnte auch sein, mehr RAM hinzuzufügen, weil die tägliche Spitzenlast des Servers genau das ist.


25
2018-05-20 19:46



Alle Apps auf meinem Server laufen auf nohup. Vielleicht wird nohup.out zwischengespeichert und verbraucht Speicher? - ivcode
@ivcode: Dies könnte ein Grund sein, überprüfen Sie, wie groß nohup.out ist. Verwenden Sie vmtouch, um herauszufinden, wie viel davon zwischengespeichert wird. - PlasmaHH
Ich habe einen Cron-Job cat /dev/null > path/nohup.out in alle 15 Minuten als nohup.out wächst schnell. Vielleicht cachiert Linux nohup.out auch wenn ich es lösche - ivcode
@ivcode Wenn Sie die Ausgabe nicht benötigen nohup Sie sollten es umleiten /dev/null. Es klingt, als hätten einige sehr unerfahrene Systemadministratoren irgendwann an Ihren Systemen gearbeitet. Sehen stackoverflow.com/questions/10408816/ ... um zu lenken nohupdie Ausgabe nach /dev/null - David Wilkins
Obwohl nohup.out in Intervallen von 15 Minuten gelöscht wird, wird nohup.out automatisch aus einem anderen Skript gesichert, wenn der Prozess aus irgendeinem Grund beendet wird. Ich habe versucht, vmtouch. es ist in der Tat ein sehr gutes Werkzeug - ivcode


Ich habe Drop Caches gesehen, die nützlich sind, wenn Sie eine Menge virtueller Maschinen starten. Oder irgendetwas anderes, das große Seiten wie einige Datenbankserver verwendet.

Große Seiten in Linux müssen oft RAM defragmentieren, um 2 MB zusammenhängendes physisches RAM zu finden, das in eine Seite eingefügt werden kann. Das Freigeben des gesamten Dateicaches macht diesen Vorgang sehr einfach.

Aber ich stimme den meisten anderen Antworten darin zu, dass es keinen allgemein guten Grund gibt, den Dateicache jeden Abend fallen zu lassen.


16
2018-05-22 00:47



Ich habe für das Aufzeigen von Vorurteilen zweiter Ordnung auf Antworten auf Drop-Caches aufgestuft. - Noah Spurrier
In HPC-Anwendungen auf Knoten mit hohem Arbeitsspeicher (1Tb) führt das Lesen einiger großer Dateien außerdem zu einer großen Zwischenspeichermenge. Da viele HPC-Anwendungen mallocs von Hunderten von GB ausführen, kann das System stundenlang stehen bleiben, da Migrationsprozesse winzige Stücke von fragmentiertem Speicher vergeblich über NUMA-Knoten bewegen, sobald das System den zwischengespeicherten Speicher erreicht. Schlimmer noch, nichts, was Sie in Userland tun können, um die Caches zu befreien, außer das System dazu zu bringen, all die winzigen 2MB-Blöcke zu verteilen, die es dann freigeben kann, lassen riesige Defragmentierung und die Apps normal laufen. - user1649948
+1 Der Befehl zum Erstellen großer Seiten (sysctl -w vm.nr_hugepages=...) weigert sich sogar zu arbeiten, wenn ich nicht zuerst Caches lösche (Arch linux). - Aleksandr Dubinsky


Es ist möglich, dass dies als eine Möglichkeit eingeführt wurde, das System zu stabilisieren, wenn niemand mit den Fähigkeiten oder der Erfahrung vorhanden war, um das Problem tatsächlich zu finden.

Ressourcen freigeben

Das Löschen von Caches wird im Wesentlichen einige Ressourcen freigeben, aber dies hat den Nebeneffekt, dass das System tatsächlich härter arbeitet, um das zu tun, was es versucht. Wenn das System ausgetauscht wird (versuchen, schneller und schneller von einer Datenträger-Swap-Partition zu lesen und zu schreiben, als es tatsächlich möglich ist), kann das Ablegen von Caches in regelmäßigen Abständen das Problem beheben Symptom, tut aber nichts, um das zu heilen Ursache.

Was kostet die Erinnerung?

Sie sollten feststellen, was zu viel Speicherverbrauch führt, sodass abstürzende Caches funktionieren. Dies kann durch eine beliebige Anzahl von schlecht konfigurierten oder einfach falsch verwendeten Serverprozessen verursacht werden. Zum Beispiel konnte ich auf einem Server feststellen, dass die maximale Speicherauslastung erreicht wurde, als eine Magento-Website innerhalb von 15 Minuten eine bestimmte Anzahl von Besuchern erreichte. Dies wurde dadurch verursacht, dass Apache so konfiguriert wurde, dass zu viele Prozesse gleichzeitig ausgeführt werden konnten. Zu viele Prozesse mit viel Speicher (Magento ist manchmal ein Biest) = Tauschen.

Endeffekt

Gehen Sie nicht einfach davon aus, dass es notwendig ist. Seien Sie proaktiv, um herauszufinden, warum es da ist, haben Sie den Mut, es zu deaktivieren, wenn andere vorschlagen, dass es falsch ist, und beobachten Sie das System - lernen Sie, was das eigentliche Problem ist, und beheben Sie es.


8
2018-05-20 15:16





Linux / m68k hat tatsächlich einen Kernel-Bug, der bewirkt, dass kswapd verrückt wird und 100% CPU verbraucht (50%, wenn es eine andere CPU-gebundene Aufgabe gibt, wie ein Debian-Binärpaket autobuilder - vulgo buildd - läuft bereits) der Zeit, nicht immer), indem man diesen bestimmten Befehl alle paar Stunden ausführt.

Davon abgesehen ist Ihr Server höchstwahrscheinlich kein m68k-System (Atari, Amiga, Classic Macintosh, VME, Q40 / Q60, Sun3) ;-)

In diesem Fall folgte die Person, die die Zeilen eingab, entweder einem fragwürdigen oder bestenfalls veralteten Ratschlag oder bekam die Idee, wie RAM falsch verwendet werden sollte (das moderne Denken sagt tatsächlich "freies RAM ist RAM verschwendet" und schlägt Caching vor) oder "entdeckt", dass dies [sic!] ein anderes Problem an anderer Stelle "behebt" (und zu faul war, nach einer geeigneten Korrektur zu suchen).


4
2018-05-21 08:03



"Ein Kernel-Bug, der kswapd verrückt macht" - Welcher Fehler ist das? - Ben
@Ben sehen Dieser Thread (diese Nachricht und ein paar Folgemaßnahmen, von denen einer eine Vermutung enthält, woher es kommen könnte) - mirabilos
Ich habe ein ähnliches Problem (obwohl es x86_64 ist) und die einzige Lösung in diesem Moment ist das Löschen von Caches serverfault.com/questions/740790/... - Fernando
@Fernando Ich habe auch einen "Drop Caches" -Cronjob auf der m68k-Box - mirabilos


Ein Grund könnte sein, dass die Seite eine Art von Überwachung ausführt, die die Menge an freiem RAM überprüft und eine Warnung an Administratoren sendet, wenn der freie RAM unter einen bestimmten Prozentsatz fällt. Wenn dieses Überwachungstool dumm genug ist, keinen Cache in die freie RAM-Berechnung einzubeziehen, kann es falsche Warnungen senden; Regelmäßiges Leeren des Caches könnte diese Warnungen unterdrücken, während es dem Tool immer noch erlaubt zu bemerken, wenn der "echte" RAM niedrig wird.

In einer solchen Situation besteht die eigentliche Lösung natürlich darin, das Überwachungstool so zu modifizieren, dass der Cache in die freie RAM-Berechnung einbezogen wird. Das Bereinigen des Caches ist nur ein Workaround und auch ein schlechter, da der Cache schnell wieder auffüllt, wenn Prozesse auf den Datenträger zugreifen.

Selbst wenn meine Annahme wahr ist, ist die Cache-Reinigung nicht sinnvoll, sondern eher eine Umgehung von jemandem, der nicht in der Lage ist, das Hauptproblem zu beheben.


3
2018-05-21 06:20





Ich kann mir einen plausiblen Grund vorstellen, dies in einem nächtlichen Cron-Job zu tun.

Auf einem großen System kann es sinnvoll sein, regelmäßig Caches zu löschen, um die Speicherfragmentierung zu entfernen.

Die kerneltransparente rugpage-Unterstützung führt einen periodischen Durchlauf von Speicher durch, um kleine Seiten in riesige Seiten zu vereinigen. Unter degenerierten Bedingungen kann dies zu Systempausen von ein oder zwei Minuten führen (meine Erfahrung damit war in RHEL6; hoffentlich ist es verbessert). Durch das Löschen von Caches kann der riesige Seitenfeger Platz zum Arbeiten haben.

Sie könnten argumentieren, dass dies ein guter Grund ist, transparente riesige Seiten zu deaktivieren; OTOH Sie können glauben, dass die allgemeine Verbesserung der Leistung von transparenten riesigen Seiten wert ist, und es lohnt sich, den Preis für den Verlust Ihrer Caches einmal am Tag zu bezahlen.


Ich habe an einen anderen Grund gedacht, warum du es machen willst, obwohl du nicht in einem Cron Job bist. Kurz bevor ein Virtualisierungssystem eine VM auf neue Hardware migriert, wäre dies ein guter Zeitpunkt dafür. Weniger Speicherinhalt zum Kopieren auf den neuen Host. Sie müssen schließlich natürlich aus dem Speicher lesen, aber ich würde wahrscheinlich diesen Kompromiss eingehen.

Ich weiß nicht, ob irgendeine der virtuellen Software das tatsächlich tut.


3
2018-01-14 15:43



Haben Sie eine Quelle dafür? Das klingt nach etwas, das im Kernel repariert werden sollte, wenn es ein solches Problem ist. - gparent
Ich habe persönliche Erfahrungen mit den Pausen mit transparenten riesigen Seiten. RHEL6, Dell R810, 4CPUs, 64 GB RAM. Das Deaktivieren transparenter riesiger Seiten (es gibt eine / proc-Datei, um dies zu tun) hat die Pausen sofort behoben. Ich habe die Cache-Drop-Technik zu der Zeit nicht versucht; stattdessen habe ich unsere Java-Apps neu konfiguriert, um nicht transparente ruggig-Seiten zu verwenden, und transparente ruggage-Seiten deaktiviert. IIRC, wir haben die Situation ausreichend untersucht, um zu erkennen, dass wir nicht die einzigen Betroffenen waren und dass Red Hat von dem Problem wusste. - Dan Pritts
Hallo Dan, ich habe das gleiche Verhalten auf meinem Server. Ich arbeite mit einer riesigen Datenmenge, und nach mehr als 10 Berechnungen eines Python-Programms (x2-3 der ersten Rechenzeit) fällt die Leistung drastisch ab. Wenn ich mir das anschaue, ist die Speicher-Cache-Größe riesig, 100 + GB. Und wenn ich diesen Speicher-Cache leeren und mein Programm erneut ausführen, bekomme ich meine anfängliche Berechnungszeit zurück. Haben Sie ein Dokument oder eine Information, um über dieses Phänomen zu berichten? Danke dir. - Axel Borja
access.redhat.com/solutions/46111 beschreibt es. Sie können transparente rigidpages deaktivieren, um zu sehen, ob das in Ihrem Fall das Problem ist. - Dan Pritts


Nur um meine zwei Cent hinzuzufügen: Das System weiß es sehr gut, dass diese Speicherseiten Caches sind und so viel wie nötig fallen, wenn eine Anwendung nach Speicher fragt.

Eine relevante Einstellung ist /proc/sys/vm/swappiness, die dem Kernel während neuer Speicherzuordnungen sagt, dass er es vorzieht, Speichercaches zu löschen oder "im Leerlauf" zugeordnete Speicherseiten auszutauschen.


2
2018-05-26 11:04





Die Frage ist von 2014, aber da das Problem bis heute auf einigen versteckten Centos 6.8 Backends besteht, kann es immer noch nützlich für jemanden sein.

https://github.com/zfsonlinux/zfs/issues/1548 beschreibt ein Problem mit zfs. Dort wird kein Speicherplatz für gelöschte Dateien freigegeben, da, wenn nfs über zfs verwendet wird, die Inodes der Datei nicht aus dem Inode-Cache des Kernels gelöscht werden.

Um aus dem Bug-Thread zu zitieren, behlendorf, 6. Januar 2015 schrieb:

Die aktuelle Spekulation ist, dass der NFS-Server aus irgendeinem Grund ist   eine zwischengespeicherte Version des Dateihandles aufbewahren. Bis zum NFS-Server   löscht diesen Dateigriff ZFS kann die Verknüpfung dieser Datei nicht aufheben. Einige Lichttests   hat gezeigt, dass das Ablegen von Caches auf dem Server diese Referenz verursacht   (wie das NFS-Datei-Handle) gelöscht werden, an welchem ​​Punkt der Speicherplatz ist   richtig befreit. Der Speicherdruck kann auch dazu führen, dass er fällt.

Ein nächtliches Echo 3> / proc / sys / vm / drop_caches ist die einfachste Lösung für diesen Fehler, wenn Sie keine Downtime für die Umstrukturierung Ihres zfs haben möchten.

Also vielleicht nicht Cargo-Kult-Admining, aber einige ziemlich gute Debugging war der Grund.


1
2017-10-27 12:25