Etwas frisst den gesamten Speicher (ich vermute, dass bei einigen Apps ein Speicherverlust vorliegt). Wie erkennt man was?

16

Ich habe einen Server, auf dem Liquidsoap + Icecast Bundle und eine einfache Website (httpd + mysqld) laufen. Nichts Besonderes. Besucher über 2000 pro Tag, wobei durchschnittlich 50 gleichzeitig online sind.

Server hat 8 GB RAM. Mit der Zeit nimmt der freie Speicherplatz ständig ab, obwohl auf dem Server nichts Neues gestartet wird und keine neuen Benutzer vorhanden sind. Irgendwann beginnt es zu tauschen, die Last auf dem Server steigt und es reagiert nicht mehr. Normalerweise starte ich den Server einfach neu ...

Was kann getan werden, um zu erkennen, was genau den Speicher verliert? Ich verwende top, um die Ressourcennutzung zu überwachen, aber meines Erachtens zeigt es nichts Hilfreiches:

Bildbeschreibung hier eingeben

Gibt es eine Möglichkeit herauszufinden, wie viel Speicher verwendet wird? oder was beginnt stark auf die Festplatte zu tauschen? Gibt es eine Möglichkeit, Speicher freizugeben, ohne den Server neu zu starten?

jayarjo
quelle
Gibt es einen Grund, warum Sie nicht versuchen, einige Dienste (Apache, Liquidsoap) anstelle des Servers neu zu starten?
Jamespo
Ich habe ursprünglich auf normale Speichernutzung geantwortet. Ich habe mit einer Reihe von Tools aktualisiert, mit denen sich das Problem identifizieren lässt.
BillThor
@jamespo, eigentlich habe ich das ausprobiert, aber es hatte keine Auswirkung, also war Neustart das einzige, von dem ich wusste, dass es helfen könnte.
Jayarjo
Der zwischengespeicherte 4027092k sollte die Speichernutzung erklären, nein? Momentan arbeite ich an einem ähnlichen Problem an einer anderen Stelle. Bisher habe ich herausgefunden, dass die Speicherübertragung mit den folgenden Parametern geregelt werden kann: vfs_cache_pressure vm.dirty_ratio vm.dirty_background_ratio Dies ist keine vollständige Korrektur und keine Rückmeldung herzlich willkommen. Ich hoffe, es ist die richtige Richtung.

Antworten:

16

Wenn Sie topim Batch-Modus arbeiten, um die Speichergrößen regelmäßig zu melden, können Sie sehen, wer den Speicher verwendet, wenn die Dinge nach Süden gehen. Die Ausführung sarim Batch-Modus sollte eine gute Diagnose der Speichernutzung und der zugehörigen E / A-Vorgänge ermöglichen. Wenn Sie munindas System überwachen, sollten Sie eine grafische Darstellung erhalten, in der genau angegeben ist, wofür der Speicher verwendet wird. Dies kann sehr hilfreich sein.

Sie können limits.conf verwenden, um die maximale Kerngröße von Programmen zu begrenzen. Richtig eingestellt, sollte dies alle Programme töten, bei denen Speicherplatz verloren geht. Dies funktioniert mit dem Modul pam_limits. Limits können auch mit dem ulimitsBefehl gesetzt werden.

Sie führen einige Programme aus, die viel Speicher benötigen könnten. Einige Dinge, die Sie betrachten könnten, umfassen.

  • Schlecht programmierte Anwendungen apache2können Speicherverluste verursachen. In diesem Fall sollte die Speichergröße zunehmen. Sie können apache2 MaxRequestsPerChildso einstellen , dass Kinder nach einer bestimmten Anzahl von Verwendungen wiederverwendet werden, indem Sie den Wert auf 100 oder so setzen. Wenn das Problem dadurch behoben wird, müssen Sie das Leck beheben. Ich würde das zuerst sehen.
  • MySQL versucht möglicherweise, Daten in den Speicher zu laden. Wenn Sie eine Menge Daten im Speicher haben, kann dies zu einer Überlastung führen, sollte jedoch nicht so dramatisch sein, wie Sie es sehen.
  • Wenn Sie ein großes tmpfsDateisystem bereitgestellt haben, kann es zu Speicherverlusten kommen, wenn Dateien bei der Verwendung nicht gelöscht werden. Große, langlebige Dateien können ebenfalls ein Problem sein.
  • Wenn das Problem ungefähr zur gleichen Tageszeit auftritt, ist möglicherweise ein Programm geplant, bei dem Speicherplatz verloren geht.
  • Wenn Sie ein Programm haben, das gemeinsam genutzten Speicher zuweist, ihn jedoch nicht vor dem Beenden freigibt, besteht ein relativ unsichtbarer Speicherverlust. Wenn der gemeinsam genutzte Speicher im Speicher gesperrt ist, wird möglicherweise ein Austausch erzwungen. Die Menge des verfügbaren gemeinsam genutzten Speichers ist normalerweise relativ begrenzt.
  • Das Liquidsoap + Icecast-Bundle kann Pufferprobleme verursachen, die Speicherplatz beanspruchen. Ich habe diese Kombination nicht verwendet, daher bin ich mir nicht sicher, wie dies aussehen würde.

Normaler Speicherverbrauch: Freier Speicher ist etwas, von dem Sie nicht viel wollen. Wenn Ihr System schon lange nicht mehr funktioniert und viel freier Speicher vorhanden ist, stimmt etwas nicht. Jedes Mal, wenn Sie eine Datei lesen oder schreiben, werden die Blöcke in den Puffercache verschoben. Dies verringert Ihren freien Speicher und ist eine gute Sache. Das System verfügt über genügend freien Speicherplatz, um einige Programme zu starten, ohne an anderer Stelle nach Speicher zu suchen. Da viele Programme schnell ausgeführt werden, wird ihr Speicher in den freien Pool zurückgeschrieben, wenn sie nicht mehr ausgeführt werden.

Wenn Sie eine Datei lesen, die sich im Puffercache befindet, ist kein Plattenzugriff erforderlich, und der Lesevorgang wird aus dem Puffercache aufgelöst. Schreibvorgänge verwenden einen ähnlichen Mechanismus. Wenn Ihr System Speicher benötigt, wird der Puffercache als einer der ersten Bereiche verwendet. Die meisten Puffer können sofort freigegeben werden.

Wenn Sie einen Speicherverlust haben, werden Sie freien Speicher sehen und die Puffer beginnen sich zu verkleinern. Dies ist immer noch kein schwerwiegendes Problem, da der verlorene Speicher eventuell verschoben werden sollte, um den Speicherplatz auszutauschen. Ihr System läuft weiterhin einwandfrei, bis Sie den Auslagerungsspeicher ausfüllen und den verbleibenden freien Speicherplatz so weit ausschöpfen, dass die Punktprogramme nicht gestartet werden können. Es ist typisch, dass eine kleine Menge an Swap Space verwendet werden kann.

BillThor
quelle
Das Problem in meinem Fall ist irgendwie komisch. Selbst wenn die Last sehr hoch ist und der Server stark auslagert, ist genügend freier Speicher verfügbar (wie ich verstanden habe, nachdem ich über Puffer und Caches gelesen habe). top zeigt keinen Prozess, der mehr Speicherplatz beansprucht. Aber die Last steigt und irgendwann wird der Server unbrauchbar: | Danke für die ausführliche Antwort.
Jayarjo
2
@jayarjo: Munin und sar sollten helfen, herauszufinden, was los ist. Wenn Sie viel freien Speicher haben, sollten Sie nicht tauschen. Möglicherweise liegt ein anderes E / A-Problem vor. sarwird Ihnen dabei helfen, die Partition mit der E / A zu bestimmen und das Problem möglicherweise zu erkennen.
BillThor
+1 für MaxRequestsPerChild advice
jamespo
11

Mit diesem Befehl können Sie die 10 wichtigsten Anwendungen zur RAM-Auslastung anzeigen:

ps -A --sort -rss -o comm,pmem | head -n 11

Manchmal hilft Ihnen dieser Befehl, wenn viele Unterprozesse generiert wurden:

ps auxf

So können Sie sehen, welche Prozesse zusammengehören.

Raffael Luthiger
quelle
Dies sind nützliche Befehle, danke, ich werde sie für die Zukunft notieren. Das Problem ist jedoch, dass es immer die gleichen Prozesse gibt (Sie können sie im angehängten Screenshot sehen) - Apache, MySQL, Liquidsoap, Icecast. Und sie belegen (oder belegen zumindest) die gleiche Menge an Arbeitsspeicher (tatsächlich vernachlässigbar), auch wenn der Server nicht mehr ausgelastet ist: |
Jayarjo
@jayarjo: Ändert sich die Anzahl der Prozesse? Haben Sie viel mehr Prozesse? Und ist es ein physischer oder ein virtueller Server?
Raffael Luthiger
Ich habe keine Änderung in der Anzahl der Prozesse bemerkt. Grundsätzlich sehe ich, wenn ich oben bin, während der Server vor Last stirbt, ein sehr ähnliches Bild wie das, was ich in der ursprünglichen Frage angehängt habe, mit Ausnahme der enormen Last: | Server ist physisch.
Jayarjo
2
Versuchen Sie mit "vmstat" mehr Informationen zu erhalten (zB vmstat -s). Oder mit dem bereits erwähnten Tool "sar". Haben Sie vielleicht ein RAM-basiertes Dateisystem? Dann kann "iostat" vielleicht auch mehr Informationen geben.
Raffael Luthiger
1
Ich hatte Zweifel, ob das Feld "pmem" (% MEM) in psoder in der topAusgabe das Richtige ist, wenn versucht wird, einen Speicherverlust zu erkennen: Ist dies nicht nur der Prozentsatz des physischen Speichers, den der Prozess derzeit verwendet? Es kann jedoch vorkommen, dass andere Teile des vom Prozess verwendeten (einschließlich des durchgesickerten) Speichers ausgelagert werden. Vielleicht ist "Größe" oder "vsize" besser geeignet, um die Größe eines Prozesses zu messen? ZB ps -A --sort -size -o comm,size | head -n 11oderps -A --sort -vsize -o comm,vsize | head -n 11
imz - Ivan Zakharyaschev
8

Nichts nutzt diesen Speicher wirklich in Bezug auf Anwendungen.

Sie müssen den zwischengespeicherten Wert abziehen, der den Seiten-Cache darstellt, um eine bessere Vorstellung davon zu erhalten, wie viel Speicher Sie tatsächlich im Hinblick auf die Programmauslastung verwenden.

Grundsätzlich ist dies eine gute Speicherverwaltung und das ist ideal, was Sie wollen.

Weitere Informationen finden Sie unter folgendem Link: http://www.linuxatemyram.com/

Matthew Ife
quelle
Ja, ich habe diesen Link gefunden und etwas über Puffer und Caches gelesen, aber soweit ich von dem, was ich gelesen habe, erfahren kann, können sie keinen Austausch verursachen, oder?
Jayarjo
@jayarjo Ich denke, um zu verstehen, was dort passiert, brauchen wir Statistiken, die das Problem dann demonstrieren. Die von Ihnen angegebenen Zahlen zeigen keine Auslagerungen oder eine hohe tatsächliche Speichernutzung an.
Matthew Ife
1

Ich bin eigentlich kein Profi, aber Flüssigseife + Eissendung sind multimedial. Wenn das System frei ist, speichert es im Cache und / oder belegt Speicher für die zukünftige Verwendung. Und wenn der Datenverkehr zu einer bestimmten Tageszeit / über einen bestimmten Zeitraum hinweg zunimmt, beginnt er zu tauschen. Zu diesem Zeitpunkt sind mehr als 8 GB RAM erforderlich, wenn die Anforderungen (Benutzer, die Inhalte anzeigen) zunehmen.

Yash
quelle