Welche Metrik sollte ich verwenden, um festzustellen, wann auf einem Server wenig Speicherplatz vorhanden ist?

9

Es gibt zahlreiche (Hunderte?) Verschiedene Maßnahmen zur Speichernutzung auf einem Linux-Computer. Was ist jedoch eine gute Heuristik / Metrik, um festzustellen, ob ein Server mehr Speicher benötigt?

Einige Ideen:

  • Betrachten von MemTotal - Active - Inactive aus / proc / meminfo als Maß für den "verdrahteten" Speicher
  • Betrachtet man die Summe der RSS-Werte aller Prozesse in ps
  • Betrachten von Committed_AS in / proc / meminfo
loopj
quelle
Hier ist eine Möglichkeit, den Speicherdruck (von /proc/meminfound /proc/vmstat) zu ermitteln: stackoverflow.com/a/3031924
Tobu

Antworten:

5

Linux Kernel 4.20 hat PSI hinzugefügt , was für "Pressure Stall Information" steht. Sie erhalten mehr Einblicke, warum eine Maschine überlastet ist. Und welche Ressource ist der Engpass.

Es gibt drei neue Dateien unter /proc/pressure:

  • /proc/pressure/cpu
  • /proc/pressure/memory
  • /proc/pressure/io

Um aus Tracking-Informationen zum Druckstillstand zu zitieren /proc/pressure/memory:

Die Ausgabe sieht aus wie:

some avg10=70.24 avg60=68.52 avg300=69.91 total=3559632828
full avg10=57.59 avg60=58.06 avg300=60.38 total=3300487258

Die someZeile ähnelt den CPU-Informationen: Sie gibt den Prozentsatz der Zeit an, in der mindestens ein Prozess ausgeführt werden könnte, wenn nicht auf Speicherressourcen gewartet würde. Auf diese Weise wird insbesondere die Zeit erfasst, die für das Einlagern, das Zurücksetzen von Seiten aus dem Seitencache und das Durchführen einer direkten Rückforderung aufgewendet wurde. Es ist daher ein guter Indikator dafür, wann das System aufgrund von Speichermangel überlastet ist.

Die fullZeile ist etwas anders: Sie zeichnet die Zeit auf, zu der aufgrund des Speicherdrucks niemand die CPU für die eigentliche Arbeit verwenden kann. Wenn alle Prozesse auf Paging-E / A warten, sieht die CPU möglicherweise inaktiv aus, dies liegt jedoch nicht an mangelnder Arbeit. Wenn diese Prozesse eine Speicherwiederherstellung durchführen, ist das Endergebnis nahezu dasselbe. Die CPU ist ausgelastet, erledigt aber nicht die Arbeit, für die der Computer da ist. Wenn die fullZahlen weit über Null liegen, fehlt dem System eindeutig der Speicher, den es zur Unterstützung der aktuellen Arbeitslast benötigt.


Ich habe noch keinen Zugriff auf einen Produktionsserver mit Linux 4.20, aber hier ist ein kleines Experiment auf meinem Desktop (für das kein Swap konfiguriert ist). Anfangs habe ich überhaupt keinen Speicherdruck (alle Zähler sind 0):

$ cat /proc/pressure/memory
some avg10=0.00 avg60=0.00 avg300=0.00 total=0
full avg10=0.00 avg60=0.00 avg300=0.00 total=0

Dann habe ich die Speichernutzung erhöht, bis mir schließlich der Speicher ausgegangen ist, wodurch die Maschine eingefroren wurde, bis das OOM einige Prozesse beendet hat. Bevor es gefroren ist, hat sich der Druck auf das Gedächtnis erhöht:

some avg10=0.00 avg60=0.00 avg300=0.00 total=0
full avg10=0.00 avg60=0.00 avg300=0.00 total=0

some avg10=0.00 avg60=0.00 avg300=0.00 total=47047
full avg10=0.00 avg60=0.00 avg300=0.00 total=32839

some avg10=0.00 avg60=0.00 avg300=0.00 total=116425
full avg10=0.00 avg60=0.00 avg300=0.00 total=81497

some avg10=1.26 avg60=0.22 avg300=0.04 total=183863
full avg10=0.72 avg60=0.13 avg300=0.02 total=127684

Nachdem sich das System erholt hat, ist der Speicherdruck wieder 0 und die totalZähler steigen nicht mehr an:

$ cat /proc/pressure/memory 
some avg10=0.00 avg60=0.00 avg300=0.07 total=53910568
full avg10=0.00 avg60=0.00 avg300=0.02 total=27766222

...

$ cat /proc/pressure/memory 
some avg10=0.00 avg60=0.00 avg300=0.05 total=53910568
full avg10=0.00 avg60=0.00 avg300=0.00 total=27766222
Philipp Claßen
quelle
2

Darauf gibt es keine richtige Antwort.

Peter sagt zu Recht , dass die Werte, die Sie sich ansehen müssen, oben und kostenlos angegeben sind (Sie können den Quellcode für das procps-Paket erhalten, der zeigt, wie Sie diese Werte von 'C' erhalten - aber für Skripte ist es einfacher, nur ausleben')

Wenn das System über nicht verwendeten Speicher verfügt (die erste Ausgabezeile von free), ist es unwahrscheinlich, dass es durch Hinzufügen von mehr Speicher viel schneller wird. Durch Verringern des VFS-Cache-Drucks wird es jedoch möglicherweise schneller (länger im Cache bleiben).

Obwohl es keine richtige Antwort gibt, gibt es viele falsche - Sie können anhand des Benutzerbereichs nicht erkennen, welche Seiten gemeinsam genutzt werden, aber über verschiedene Speicherorte zugegriffen werden. Wenn Sie die Speichernutzung überprüfen, um festzustellen, wie viel Speicher frei ist, funktioniert dies einfach nicht.

Als Ausgangspunkt sollten Sie sich die beiden Werte für freien Speicher ansehen, die von 'frei' gemeldet werden.

symcbean
quelle
2

Ich habe dies bereits gesagt. Die beste Maßnahme, um den Speicherbedarf in Echtzeit zu ermitteln, besteht darin, das Feld COmmitted_AS in / proc / meminfo zu beobachten und es im Laufe der Zeit zu vergleichen, um festzustellen, wie viel Speicher Sie benötigen.

Theoretisch geht es Ihnen gut, wenn Ihr Committed_AS immer vorbei ist als (Memfree + swapfree). Wenn dies jedoch weniger ist und Sie Ihre Arbeitslast im Laufe der Zeit auf dem System ansammeln, nähern Sie sich einer OOM-Situation. Der Wert Committed_AS bestimmt, wie viel Speicher für das System erforderlich ist, wenn dem System zu diesem Zeitpunkt alle Speicheranforderungen gewährt wurden.

Die Überwachung ist eine gute Maßnahme im Laufe der Zeit, um festzustellen, ob Sie den Arbeitsspeicher erhöhen oder die Arbeitslast verringern müssen.

Soham Chakraborty
quelle
Committed_AS ist eine theoretische Schätzung, die sich nicht auf den Speicherdruck bezieht, sondern auf die Möglichkeit einer OOM-Bedingung, die in der Praxis nicht wirklich auftritt.
Tobu
Das habe ich gesagt, als ich theoretisch gesagt habe. Es heißt, dass, wenn alle Speicherzuordnungen zu einem beliebigen Zeitpunkt gewährt werden, wie viel Speicher erforderlich ist, damit das System unter 99,99% -Situationen nicht in den OOM-Modus wechselt.
Soham Chakraborty
Während Committed_AS keine genaue Schätzung ist, ist die Faustregel "Keep RAM> Committed_AS" für mich nie gescheitert. Manchmal gehe ich zufällig weit über diesen Betrag hinaus (mit VMs ist das einfach) und sehe keinen messbaren Unterschied darin, wie Systeme die aktuelle Arbeitslast mit zusätzlichem RAM bewältigen . Die maximal mögliche Arbeitsbelastung variiert natürlich. Committed_AS ist nur eine Schätzung der aktuellen.
Luke404
1
if your Committed_AS is always over than (Memfree+swapfree) then you are fine. Sollte es nicht weniger als verfügbarer Speicher sein? Ein größerer festgeschriebener Wert weist auf eine Verpflichtung hin, die im schlimmsten Fall nicht erfüllt werden kann, oder?
Isaac
@ Luke404 wenn du mehr RAM Committed_AShast als viel mehr RAM als tatsächlich benötigt. Offensichtlich erhalten Sie in diesem Fall keine OOM-Situationen. Mein System hat Committed_AS größer als RAM + Swap zusammen.
Mikko Rantalainen
2

Eigentlich hängt alles von der / den Anwendung (en) ab. Sie können jedoch die vom Kernel verwendete Methode verwenden, um den Speicherdruck zu bestimmen, der Ihnen einen allgemeinen Überblick über die Fähigkeit des Hosts zur Verwaltung des Speichers geben soll.

Der Speicherdruck ist ideal, da Sie sich keine Gedanken über den Seiten-Cache, den Austausch oder die tatsächliche Speicherkapazität machen müssen.

Der Speicherdruck ist effektiv eine Zählung, wie viele Seiten gemäß / proc / meminfo als aktiv markiert werden sollen . Der Kernel misst den Speicherdruck, indem er verfolgt, wie viele Seiten in der Seitentabelle von "inaktiv" zu "aktiv" wechseln. Wenn Sie häufig zwischen diesen beiden Status wechseln, steht Ihnen wahrscheinlich nicht viel freier Speicher zur Verfügung, um mehr Seiten zu aktivieren.

Ein niedriger Speicherdruck wird durch sehr wenige Aktionen von inaktiv zu aktiv angezeigt (da der Kernel eindeutig über genügend Speicherplatz verfügt, damit aktive Seiten aktiv bleiben).

Dieses Skript misst den Druck alle periodischen Sekunden. Je mehr Daten Sie sammeln können, desto besser. Die Idee hier ist, dass Sie die Daten grafisch darstellen und Ihre Y-Achse mit 0 in der Mitte kleben. Unter idealen Umständen sollte der Graph eine horizontale Linie nach 0 haben. Wenn die Linien regelmäßig außerhalb von 0 ansteigen (insbesondere wenn 'Aktiv' positiv ist oder regelmäßig ziemlich hoch ansteigt), ist der Speicherdruck auf dem Host hoch und mehr Speicher wäre vorteilhaft.

#!/usr/bin/python
import os
import sys
import re
import time

PERIODIC = 1
pgs = re.compile('Active:\s+([0-9]+) kB\nInactive:\s+([0-9]+) kB')
meminfo = open('/proc/meminfo')

def read_meminfo():
    content = meminfo.read(4096)
    m = pgs.search(content, re.M)
    active, inactive = int(m.group(1)), int(m.group(2))
    active = active / 4
    inactive = inactive / 4
    meminfo.seek(0, 0)
    return active,inactive  

if __name__ == "__main__":
    oldac, oldin = read_meminfo()
    while True:
        time.sleep(PERIODIC)
        active, inactive = read_meminfo()
        print "Inactive Pressure:\t%d" % (inactive - oldin)
        print "Active Pressure:\t%d" % (active - oldac)
        oldac = active
        oldin = inactive
Matthew Ife
quelle
1

Sie können den Befehl ausführen top, um eine Übersicht aller Hauptkomponenten unter Linux einschließlich der Speichernutzung anzuzeigen. Beachten Sie beim ersten Anzeigen von oben, dass der verwendete Speicher Puffer und ggf. Cache enthält.

Es gibt auch den freeBefehl für den Speicher. Sie können ausführen free -m, um Speicher frei in Megabyte anzuzeigen.

Es gibt viel mehr Werkzeuge, aber ich denke, das hat den Werkzeugteil der Frage ausreichend beantwortet.

Wann Sie mehr Speicher benötigen, hängt von der Anwendung ab, die Sie ausführen. Benötigt es Burst-Kapazität? Profitiert es stark von einer großen Cache-Größe? Aber im Allgemeinen, wenn Sie Swap treffen und oft, brauchen Sie wirklich mehr RAM.

Mürrisch
quelle
Danke Peter. Anstatt grundlegende Linux-Dienstprogramme zu verwenden, möchte ich algorithmisch eine einzelne "RAM-Integritäts" -Metrik generieren, die ich im Laufe der Zeit überwachen und vorhersehen kann, wann ein Server mehr Speicher benötigt. Wenn ich auf Swap drücke, ist es wahrscheinlich zu spät.
Loopj
@loopj Hmm ... jetzt bin ich verwirrter darüber, was gefragt wird. Versuchen Sie, die erwartete Zeit grafisch darzustellen, zu der der Speicher zu einem bestimmten Punkt wird? Trotzdem können Sie die Ausgaben grundlegender Linux-Tools oder Meminfo weiterhin automatisch oder manuell über die Zeit zeichnen. Vielleicht sollten Sie Ihren Punkt weiter klären. Oder suchen Sie nach Überwachungslösungen wie Nagios? Welche Anwendung führen Sie aus? Oder versuchen, generisch zu sein? Ich verstehe das Szenario nicht.
Mürrisch
1

Wenn ich Sie wäre, würde ich Daten zu Last, freiem Speicher free -mund den Hauptleistungsmerkmalen Ihres Servers (z. B. Latenz pro Anforderung) sammeln und in Calc / Excel grafisch darstellen, um die "Swapout-Klippe" für mehrere Datenpunkte (Speicher) zu erkennen Konfigurationen - 8 G, 16G, 32G usw.). Dann würde ich verschiedene Regressionen versuchen, um die Verbindung zwischen der "Klippe" und dem verfügbaren Speicher zu finden.

Eine Suche nach vorhandener Literatur bei CiteSeerX würde ebenfalls helfen.

Hirschjäger
quelle