Wie kann ich den gesamten physischen Speicher (RAM) meiner Linux-Box ermitteln, der für die Analyse durch ein Shell-Skript geeignet ist?


123

Ich schreibe ein Shell-Skript, um den gesamten physischen Speicher in einigen RHEL-Linux-Boxen herauszufinden.

Zunächst möchte ich betonen, dass mich der gesamte vom Kernel erkannte physische Speicher interessiert , nicht nur der verfügbare Speicher . Daher bitte, was darauf hindeutet , vermeiden Antworten zu lesen / proc / meminfo oder zu verwenden , frei , oben oder sar Befehle - In allen diesen Fällen ihre „ Gesamtspeicher “ Werte „bedeuten verfügbare Speicher “ sind.

Der erste Gedanke war, die Boot-Kernel-Nachrichten zu lesen:

Memory: 61861540k/63438844k available (2577k kernel code, 1042516k reserved, 1305k data, 212k init)

In einigen Linux-Boxen ist diese nützliche Boot-Kernel-Nachricht jedoch aufgrund der Verwendung der PowerPath-Software von EMC2 und ihrer überfluteten Startmeldungen beim Kernel-Start nicht verfügbar, auch nicht in der Datei / var / log / dmesg .

Die zweite Option war der Befehl dmidecode (ich werde vor der möglichen Nichtübereinstimmung von Kernel-erkanntem RAM und echtem RAM aufgrund der Einschränkungen einiger älterer Kernel und Architekturen gewarnt). Die Option --memory vereinfacht das Skript, aber ich habe festgestellt, dass ältere Versionen dieses Befehls keine Option --memory haben .

Meine letzte Chance war der Befehl getconf . Es gibt die Größe der Speicherseite an, jedoch nicht die Gesamtzahl der physischen Seiten. Die Systemvariable _PHYS_PAGES scheint die verfügbaren physischen Seiten zu sein, nicht die Gesamtzahl der physischen Seiten.

# getconf -a | grep SEITEN
SEITENGRÖSSE 4096
_AVPHYS_PAGES 1049978
_PHYS_PAGES 15466409

Meine Frage: Gibt es eine andere Möglichkeit, die Gesamtmenge des physischen Speichers abzurufen, die von einem Shell-Skript analysiert werden kann?


3
Dies sollte auf Linux & Unix migriert werden
Kolob Canyon

Antworten:


56

Wenn Sie am physischen RAM interessiert sind, verwenden Sie den Befehl dmidecode. Sie erhalten viel mehr Informationen als nur das. Abhängig von Ihrem Anwendungsfall möchten Sie möglicherweise auch wissen, ob die 8G im System von 2x4 GB-Sticks oder 4x2 GB-Sticks stammen.


19
Ich brauchte dies kürzlich und habe einen einfachen Befehl, um die Gesamtspeichergröße aller Speichermodule auf einem System abzurufen: dmidecode -t 17 | grep "Größe. * MB" | awk '{s + = $ 2} END {print s / 1024}'
Jonesinator

6
Im Gegensatz zu anderen Antworten erfordert dmidecode Root-Rechte .
Chus

1
Es gibt mir diesen Fehler # dmidecode 3.0 / sys / firmware / dmi / tables / smbios_entry_point: Berechtigung verweigert Scannen / dev / mem nach Einstiegspunkt. / dev / mem: Erlaubnis verweigert
VVB

128

Hast du es versucht cat /proc/meminfo? Sie können dann awk oder grep out, was Sie wollen, MemTotal zB

awk '/MemTotal/ {print $2}' /proc/meminfo

oder

cat /proc/meminfo | grep MemTotal

8
Aber MemTotal ist nicht das gesamte physische Gedächtnis - siehe die Manpage für proc (5)
Chris Stratton

2
@ ChrisStratton: Können Sie expliziter sein? Für die meisten praktischen Absichten und Zwecke kann diese Antwort ausreichend sein.
Dan Dascalescu

13
awk '/MemTotal/ {print $2}' /proc/meminfo Je weniger Rohre desto besser.
Masta

3
Alternative mit hoher Meinung: Vermeiden Sie awk, wenn Sie können. Regex / PCRE ist eine viel universellere Mustervergleichssprache (dh Sie können sie auch in Python oder Perl verwenden). Wenn Sie awk lernen, ist alles, was Sie bereits haben, awk. Wenn Sie andererseits grep + PCRE lehnen ... grep -oP '^MemTotal:\s+\K.*' /proc/meminfo
Gabriel Totusek

5
@GabrielBurkholder gibt es auch eine gegenteilige Ansicht: awkist von POSIX standardisiert, hat aber grepOptionen -ound ist -Pes nicht! Ihr Beispiel funktioniert gut mit GNU grep(aber GNU sagt immer noch, dass die PCRE-Implementierung experimentell ist), aber es wird wahrscheinlich nicht mit anderen Implementierungen funktionieren.
Pabouk

48

cat /proc/meminfo | grep MemTotaloder kostenlos gibt Ihnen die genaue Menge an RAM, die Ihr Server hat. Dies ist kein "verfügbarer Speicher".

Ich denke, Ihr Problem tritt auf, wenn Sie eine VM haben und die gesamte vom Hypervisor gehostete Speichermenge berechnen möchten. In diesem Fall müssen Sie sich jedoch beim Hypervisor anmelden.

cat /proc/meminfo | grep MemTotal

ist äquivalent zu

 getconf -a | grep PAGES | awk 'BEGIN {total = 1} {if (NR == 1 || NR == 3) total *=$NF} END {print total / 1024" kB"}'

5
Auf meinem physischen Box mit 4 GB Speicher cat /proc/meminfo | grep MemTotalberichtet MemTotal: 3957032 kB, das ist ein bisschen kurz von 4 GB. Das OP (und ich) suchen nach etwas, das 4 GB melden würde.
TvE

1
Ein direkterer Weg, dies zu tun, ist nurgrep MemTotal /proc/meminfo
Dan Passaro

3
@TvE 3957032 kBist nur falsch beschriftet . Es sollte mit kiB gekennzeichnet sein, wie in diesem Beitrag angegeben . Das heißt, es werden tatsächlich 4.052.000.768 Bytes gemeldet, was etwas mehr als 4 GB ist. Dies liegt an der Tatsache, dass die Implementierungen von / proc / meminfo vor der KiB-Notation liegen.
Jeff G

4
@ JeffG Ich denke, Sie haben den Punkt verpasst, den ToolmakerSteve gemacht hat. Der erwartete Wert ist 4 GB, nicht 4 GB, und TvE zitiert den Wert einfach falsch. ToolmakerSteve hat Recht, dass "4 GB" RAM im Kommentar von TvE als "4 GiB" interpretiert werden sollten, und daher ist dies der Wert, mit dem wir vergleichen. Sie haben Recht, dass der Wert größer als 4 GB ist, genauso wie er auch größer als 2 GB und 2 GB und kleiner als 6 GB und 6 GB ist. Entscheidend ist hier jedoch, wie er mit 4 GB verglichen wird. Wen interessiert es also, wie er mit den anderen Maßnahmen verglichen wird? Also ja, Ihre Aussage ist richtig, aber auch irrelevant.
Tim

1
@Tim Ich habe nur sachlich korrekte Informationen mit unterstützender Dokumentation bereitgestellt, die die gestellte Frage beantworteten. Angesichts der Tatsache, dass mehr als eine triviale Suche /proc/meminfoerforderlich war , denke ich, dass die Meldung von Zahlen in kiB ein äußerst wichtiger Teil dieser Diskussion ist, unabhängig davon, ob @TvE beabsichtigte, eine andere Frage zu stellen.
Jeff G

19

Fügen Sie die letzten 2 Einträge von hinzu /proc/meminfo, sie geben Ihnen den genauen Speicher, der auf dem Host vorhanden ist.

Beispiel:

DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB

10240 + 4184064 = 4194304 kB = 4096 MB.


3
Die beste Antwort hier, abgesehen von der Verwendung von dmidecode, für den root erforderlich ist. Die DirectMap ist jedoch nicht immer genau. Ich habe einen Server mit 4 GB und es heißt: `DirectMap4k: 110200 kB DirectMap2M: 3993600 kB` Das sind 4007MB, nicht 4096MB ...
TvE

HINWEIS: Selbst wenn das Betriebssystem von TvE in Einheiten von 1024 Byte meldet, unterschreitet seine Gesamtgröße von 4103800 x 1024 4 GiB (dies wären 4194304 x 1024).
ToolmakerSteve

Auch nicht bei allen Linux-Versionen verfügbar. Meine Centos5-Box (ja, ich weiß) meldet dies nicht.
Tom Quarendon

Für die Aufzeichnung sind diese nur auf x86 vorhanden. Der Grund dafür ist, dass diese Einträge die Speichermenge zählen, die durch 4k, 2M, 1G-Seiten im TLB dargestellt wird, die den gesamten Speicher abdecken müssen, auf den der Kernel zugreifen kann .
Kevmitch

1
UPDATE: Diese Summe variiert geringfügig, wenn ich zwischen verschiedenen Kernelversionen (Linux-3.18.28, Linux-4.13-rc6) auf demselben Computer wechsle.
Kevmitch

17

Ein weiterer nützlicher Befehl:
vmstat -s | grep memory
Beispielausgabe auf meinem Computer ist:

  2050060 K total memory
  1092992 K used memory
   743072 K active memory
   177084 K inactive memory
   957068 K free memory
   385388 K buffer memory

Ein weiterer nützlicher Befehl zum Abrufen von Speicherinformationen lautet:
free
Beispielausgabe ist:

             total       used       free     shared    buffers     cached
Mem:       2050060    1093324     956736        108     385392     386812
-/+ buffers/cache:     321120    1728940
Swap:      2095100       2732    2092368

Eine Beobachtung hier ist, dass der Befehl auch freeInformationen über den Swap Space liefert.
Der folgende Link kann für Sie nützlich sein:
http://www.linuxnix.com/find-ram-details-in-linuxunix/


1
Dies ist eine schöne einfache Lösung, wenn Sie möchten, dass Ihre Ausgabe in Megabyte das Auge vmstat -s -S M | grep ' memory'
schont

17
free -h | awk '/Mem\:/ { print $2 }' 

Dadurch erhalten Sie den gesamten Speicher in Ihrem System in einem für Menschen lesbaren Format und können automatisch auf die entsprechende Einheit skaliert werden (z. B. Bytes, KB, MB oder GB).


Genau das, wonach ich gesucht habe!
Tomas Gonzalez

10
dmidecode -t 17 | grep  Size:

Wenn Sie alle oben genannten Werte hinzufügen, die nach "Größe:" angezeigt werden, erhalten Sie die genaue physische Gesamtgröße aller RAM-Sticks im Server.


2

Gesamter Online-Speicher

Berechnen Sie den gesamten Online-Speicher mit dem System-fs.

totalmem=0;
for mem in /sys/devices/system/memory/memory*; do
  [[ "$(cat ${mem}/online)" == "1" ]] \
    && totalmem=$((totalmem+$((0x$(cat /sys/devices/system/memory/block_size_bytes)))));
done

#one-line code
totalmem=0; for mem in /sys/devices/system/memory/memory*; do [[ "$(cat ${mem}/online)" == "1" ]] && totalmem=$((totalmem+$((0x$(cat /sys/devices/system/memory/block_size_bytes))))); done

echo ${totalmem} bytes
echo $((totalmem/1024**3)) GB

Beispielausgabe für 4 GB System:

4294967296 bytes
4 GB

Erläuterung

/ sys / device / system / memory / block_size_bytes

Anzahl der Bytes in einem Speicherblock (Hex-Wert). Wenn Sie 0x vor dem Wert verwenden, wird sichergestellt, dass er während der Berechnung ordnungsgemäß behandelt wird.

/ sys / Geräte / System / Speicher / Speicher *

Durchlaufen Sie alle verfügbaren Speicherblöcke, um zu überprüfen, ob sie online sind, und addieren Sie die berechnete Blockgröße zu totalmem, falls dies der Fall ist.

[["$ (cat $ {mem} / online)" == "1"]] &&

Sie können dies ändern oder entfernen, wenn Sie einen anderen Speicherstatus bevorzugen.


Ich werde Ihre Lösung so schnell wie möglich überprüfen.
Jdamian

Bash-Tipp: In Ihrem Code müssen Sie nicht den Schrägstrich ( \) verwenden, um in der nächsten Zeile fortzufahren. Zu &&diesem Zweck können Sie auch das am Ende der Zeile verwenden.
Jdamian

1

Gesamtspeicher in Mb :

x=$(awk '/MemTotal/ {print $2}' /proc/meminfo)
echo $((x/1024))

oder:

x=$(awk '/MemTotal/ {print $2}' /proc/meminfo) ; echo $((x/1024))

0

Dies sind die Wege:

1. / proc / meminfo

MemTotal: 8152200 kB

MemFree: 760808 kB

Sie können einen Code oder ein Skript schreiben, um ihn zu analysieren.

2. Verwenden Sie sysconf mithilfe der folgenden Makros

sysconf (_SC_PHYS_PAGES) * sysconf (_SC_PAGESIZE);

3. Verwenden Sie den Systemaufruf sysinfo

int sysinfo (struct sysinfo * info);

struct sysinfo {.

   .

   unsigned long totalram;  /*Total memory size to use */

   unsigned long freeram;   /* Available memory size*/

   .

   . 

  }; 

cat / proc / meminfo funktioniert für mich auf meinem eingebetteten System
webbertiger

-7

Ich finde htopein nützliches Werkzeug.

sudo apt-get install htop

und dann

frei -m

gibt die Informationen, die Sie benötigen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.