Linux gibt großen Festplatten-Cache nicht frei, wenn der Speicherbedarf steigt

24

Ausführen von Ubuntu auf einem 2.6.31-302 x86-64-Kernel. Das allgemeine Problem besteht darin, dass ich Speicher in der Kategorie "zwischengespeichert" habe, der ständig aktualisiert wird und nicht freigegeben oder verwendet wird, selbst wenn unsere Anwendung ihn benötigt.

Also hier ist, was ich aus dem "freien" Befehl heraushole. Nichts davon ist auf den ersten Blick ungewöhnlich.

# free
             total       used       free     shared    buffers     cached
Mem:       7358492    5750320    1608172          0       7848    1443820
-/+ buffers/cache:    4298652    3059840
Swap:            0          0          0

Das erste, was jemand sagen wird, ist "Keine Sorge, Linux verwaltet diesen Speicher automatisch." Ja, ich weiß, wie der Speichermanager funktionieren soll. Das Problem ist, dass es nicht das Richtige tut. Die hier "zwischengespeicherten" 1,4 GB scheinen reserviert und unbrauchbar zu sein.

Mein Wissen über Linux sagt mir, dass 3 GB "frei" sind. aber das Verhalten des Systems sagt etwas anderes. Wenn die 1,6 GB realer freier Speicher während der Spitzenauslastung aufgebraucht sind, wird der OOM-Killer aufgerufen, sobald mehr Speicher angefordert wird (und das 'freie' in der ersten Spalte gegen 0 geht), werden Prozesse abgebrochen und es treten Probleme auf obwohl das 'free' in der - / + Buffer / Cache-Zeile immer noch ungefähr 1,4 GB 'free' hat.

Ich habe die Werte von oom_adj für wichtige Prozesse so angepasst, dass das System nicht in die Knie gezwungen wird, aber selbst dann werden wichtige Prozesse beendet, und wir möchten diesen Punkt nie erreichen. Vor allem, wenn theoretisch 1,4 GB noch "frei" sind, wenn nur der Festplatten-Cache entfernt wird.

Hat jemand eine Idee, was hier los ist? Das Internet ist überflutet mit dummen Fragen zum Linux-Befehl "free" und "warum habe ich keinen freien Speicher", und deshalb kann ich zu diesem Thema nichts finden.

Das erste, was mir in den Sinn kommt, ist, dass der Swap ausgeschaltet ist. Wir haben einen Systemadministrator, der daran festhält. Ich bin offen für Erklärungen, wenn sie gesichert sind. Könnte dies zu Problemen führen?

Hier ist nach dem Laufen frei echo 3 > /proc/sys/vm/drop_caches:

# free
             total       used       free     shared    buffers     cached
Mem:       7358492    5731688    1626804          0        524    1406000
-/+ buffers/cache:    4325164    3033328
Swap:            0          0          0

Wie Sie sehen können, wird tatsächlich eine winzige Menge an Cache freigegeben, aber ungefähr 1,4 GB scheinen "hängen geblieben" zu sein. Das andere Problem ist, dass dieser Wert mit der Zeit zu steigen scheint. Auf einem anderen Server stecken 2,0 GB fest.

Ich würde diese Erinnerung gerne zurückhaben ... jede Hilfe wäre sehr dankbar.

cat /proc/meminfoIst hier, wenn es irgendetwas wert ist:

# cat /proc/meminfo 
MemTotal:        7358492 kB
MemFree:         1472180 kB
Buffers:            5328 kB
Cached:          1435456 kB
SwapCached:            0 kB
Active:          5524644 kB
Inactive:          41380 kB
Active(anon):    5492108 kB
Inactive(anon):        0 kB
Active(file):      32536 kB
Inactive(file):    41380 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:               320 kB
Writeback:             0 kB
AnonPages:       4125252 kB
Mapped:            42536 kB
Slab:              29432 kB
SReclaimable:      13872 kB
SUnreclaim:        15560 kB
PageTables:            0 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     3679244 kB
Committed_AS:    7223012 kB
VmallocTotal:   34359738367 kB
VmallocUsed:        7696 kB
VmallocChunk:   34359729675 kB
DirectMap4k:     7340032 kB
DirectMap2M:           0 kB
Trisweb
quelle
3
Ich habe keine Erklärung für Ihren Cache (obwohl ich vermute, dass mmap-Dateien wahrscheinlich in den Cache gelangen), aber zum Wohle der Menschheit nehmen Sie eine Schaufel und etwas Zeitkalk und beseitigen Sie das "Sie brauchen keinen Tausch" wenn du viel RAM hast! " Booster. Sie sind immun gegen rationale Diskussionen und sie sind gefährlich falsch. Die Tatsache, dass der OOM-Killer Sie verfolgt, ist nur ein Symptom dafür.
womble
Genau meine Gedanken. Danke für den Hinweis. Kennen Sie weitere gute Artikel oder Argumente, warum ein Tausch notwendig ist?
Trisweb
6
Denn wenn Sie keinen Swap haben, passieren solche Dinge. Aber versuchen Sie nicht, mit Ihrem Swap-Leugner zu streiten. Brechen Sie entweder den Zeitraffer aus oder sagen Sie: "Wenn Sie hier nicht tauschen möchten, beheben Sie dieses Durcheinander, das Sie unbedingt erstellen wollten ." Sie werden entweder ihre Meinung ändern oder bei dem Versuch sterben. Problem so oder so gelöst.
womble
Hervorragend, danke für die Tipps. Sie hatten übrigens Recht mit den MMAP-Dateien - ein kurzer Überblick zeigte, wie viele Protokolldateien den Speicher belegen. Das Löschen löste das Problem.
Trisweb
Das Problem besteht darin, dass ein Overcommitting ohne Swap dazu führt, dass der OOM-Killer ausgeführt wird, und dass ein Overcommitting nicht zu einem System führt, das Prozesse nicht starten kann. Sie benötigen einen Swap, um den Arbeitsspeicher effektiv zu nutzen.
David Schwartz

Antworten:

8

Ich habe die Antwort auf meine eigene Frage gefunden - dank der Hilfe von womble (senden Sie eine Antwort, wenn Sie möchten).

lsof -s Zeigt die verwendeten Datei-Handles an, und es stellte sich heraus, dass mehrere Gigabyte MMAP-Protokolldateien den Cache belegten.

Das Implementieren eines Logrotates sollte das Problem vollständig lösen und es mir ermöglichen, mehr Speicherplatz zu nutzen.

Ich werde auch Swap wieder aktivieren, damit wir in Zukunft keine Probleme mit dem OOM-Killer haben. Vielen Dank.

Trisweb
quelle
2
mmap-Seiten können verworfen werden, damit der Cache nicht angeheftet wird. Benutzt du einen Ramfs?
Psusi
Hallo, es tut mir leid, einen alten Thread ausgraben zu müssen, aber ich stehe derzeit vor dem gleichen Problem und lsof -szeige keine ungewöhnliche Verwendung. Ich verwende jedoch ein RAMFS, wie Sie sagten [und den 2.6.10-Kernel, der nicht über die Funktion drop_caches verfügt]. Was denkst du ist der wahrscheinliche Verdächtige?
Ram
1
Danke für den Tipp! Ich lsof -s | sort -rnk 7 | lessfüge jetzt zu meiner Toolbox hinzu. Ein Hinweis für andere Leser: Das mögen zwar große Einträge sein /proc/net/rpc/nfs4.nametoid/channel, aber sie haben sich in meinem Fall nicht als Täter herausgestellt.
Nickolay
Stellen Sie sicher, dass Ihre großen Dateien oder Programme mlock nicht verwenden. in /proc/meminfoBlick auf „Unevictable“ Seiten.
Michael Martinez