GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux – Wie erhält man die Menge an verfügbarem Speicher portabel über Distributionen hinweg?

Die Standarddateien/-tools, die den Speicher melden, scheinen auf verschiedenen Linux-Distributionen unterschiedliche Formate zu haben. Zum Beispiel auf Arch und Ubuntu.

  • Bogen

    $ free
                  total        used        free      shared  buff/cache   available
    Mem:        8169312     3870392     2648348       97884     1650572     4110336
    Swap:      16777212      389588    16387624
    
    
    $ head /proc/meminfo 
    MemTotal:        8169312 kB
    MemFree:         2625668 kB
    MemAvailable:    4088520 kB
    Buffers:          239688 kB
    Cached:          1224520 kB
    SwapCached:        17452 kB
    Active:          4074548 kB
    Inactive:        1035716 kB
    Active(anon):    3247948 kB
    Inactive(anon):   497684 kB
    
  • Ubuntu

    $ free
                 total       used       free     shared    buffers     cached
    Mem:      80642828   69076080   11566748    3063796     150688   58358264
    -/+ buffers/cache:   10567128   70075700
    Swap:     20971516    5828472   15143044
    
    
    $ head /proc/meminfo 
    MemTotal:       80642828 kB
    MemFree:        11565936 kB
    Buffers:          150688 kB
    Cached:         58358264 kB
    SwapCached:      2173912 kB
    Active:         27305364 kB
    Inactive:       40004480 kB
    Active(anon):    7584320 kB
    Inactive(anon):  4280400 kB
    Active(file):   19721044 kB
    

Wie kann ich also portabel (nur über Linux-Distributionen hinweg) und zuverlässig die Menge an Speicher abrufen – ohne Swap –, die für meine Software zu einem bestimmten Zeitpunkt verfügbar ist? Vermutlich wird das in der Ausgabe von free als „available“ und „MemAvailable“ angezeigt und cat /proc/meminfo in Arch, aber wie bekomme ich dasselbe in Ubuntu oder einer anderen Distribution?

Akzeptierte Antwort:

MemAvailable ist in /proc/meminfo enthalten ab Version 3.14 des Kernels; es wurde von Commit 34e431b0a hinzugefügt. Das ist der entscheidende Faktor für die von Ihnen gezeigten Ausgangsvariationen. Die Commit-Nachricht gibt an, wie der verfügbare Arbeitsspeicher ohne MemAvailable geschätzt wird :

Derzeit kann die Menge an Arbeitsspeicher, die für eine neue Arbeitslast verfügbar ist, ohne das System in den Swap zu drängen, anhand von MemFree geschätzt werden , Active(file) , Inactive(file) und SReclaimable , sowie die „niedrigen“ Wasserzeichen aus /proc/zoneinfo .

Die niedrigen Wassermarken sind das Niveau, unterhalb dessen das System wechselt. Also in Abwesenheit von MemAvailable Sie können zumindest die für MemFree angegebenen Werte addieren , Active(file) , Inactive(file) und SReclaimable (je nachdem, welche in /proc/meminfo vorhanden sind ) und subtrahieren Sie die niedrigen Wasserzeichen von /proc/zoneinfo . Letzteres listet auch die Anzahl der freien Seiten pro Zone auf, was als Vergleich nützlich sein könnte…

Der vollständige Algorithmus ist im Patch zu meminfo.c enthalten und scheint einigermaßen einfach anzupassen:

  • die niedrigen Wassermarken über alle Zonen summieren;
  • Nehmen Sie den identifizierten freien Speicher (MemFree );
  • subtrahieren Sie das untere Wasserzeichen (wir müssen es vermeiden, es zu berühren, um ein Vertauschen zu vermeiden);
  • fügen Sie die Menge an Speicher hinzu, die wir aus dem Seitencache verwenden können (Summe von Active(file)). und Inactive(file) ):Das ist die vom Seiten-Cache verwendete Speichermenge abzüglich entweder der Hälfte des Seiten-Cache oder des unteren Wasserzeichens, je nachdem, welcher Wert kleiner ist;
  • Fügen Sie die Speichermenge hinzu, die wir zurückfordern können (SReclaimable ), nach demselben Algorithmus.
Siehe auch:Linux – Wie mache ich ein USB-Flash-Laufwerk unter Linux beschreibbar?

Wenn Sie all dies zusammenfassen, können Sie den Speicher für einen neuen Prozess verfügbar machen mit:

awk -v low=$(grep low /proc/zoneinfo | awk '{k+=$2}END{print k}') 
 '{a[$1]=$2}
  END{ 
   print a["MemFree:"]+a["Active(file):"]+a["Inactive(file):"]+a["SReclaimable:"]-(12*low); 
  }' /proc/meminfo 

Linux
  1. Linux – Wie erhalte ich zuverlässig den Namen des Betriebssystems?

  2. Wie erhalte ich eine Liste der verfügbaren drahtlosen Netzwerke unter Linux?

  3. Wie protokolliere ich den Speicherverbrauch unter Linux?

  4. Wie kann ich den Tastaturstatus unter Linux abrufen?

  5. Wie listet man Prozesse auf, die an ein Shared-Memory-Segment in Linux angehängt sind?

So erhalten Sie die Größe eines Verzeichnisses in Linux

So erhalten Sie die Größe eines Verzeichnisses in Linux

So erhalten Sie den Dateinamen aus dem vollständigen Pfad in Linux

So erhalten Sie die Anzahl der Prozessoren / Kerne in Linux

Wie verwende ich den Befehl procs, um die aktiven Prozesse in Linux anzuzeigen?

Top 10 Linux-Distributionen