it-swarm.com.de

Wie kann ich den gesamten physischen Speicher (RAM) meiner Linux-Box herausfinden, der von einem Shell-Skript analysiert werden kann?

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

Zunächst möchte ich betonen, dass ich mich für den gesamten physischen Speicher vom Kernel erkenne, nicht nur für den verfügbaren Speicher . Vermeiden Sie daher bitte die Antworten, die Sie zum Lesen von/proc/meminfo oder zur Verwendung der free - top oder sar -Befehle vorschlagen. In all diesen Fällen ist deren " Gesamtspeicher "Werte bedeuten" verfügbare Speicher "Einsen.

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 aufgrund der Verwendung der PowerPath-Software von EMC2 und ihrer floodingboot-Meldungen beim Kernel-Start nicht verfügbar, auch nicht in der/var/log/dmesg Datei.

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

Meine letzte Chance war der Befehl getconf . Er 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 gesamten physischen Seiten.

 # getconf -a | grep PAGES 
 PAGESIZE 4096 
_ AVPHYS_PAGES 1049978 
_ PHYS_PAGES 15466409 

Meine Frage: Gibt es eine andere Möglichkeit, die Gesamtmenge an physischem Arbeitsspeicher zu ermitteln, die von einem Shell-Skript analysiert werden kann?

101
Jdamian

Wenn Sie sich für den physischen RAM interessieren, verwenden Sie den Befehl dmidecode. Es gibt Ihnen eine lot mehr Information als nur das, aber abhängig von Ihrem Anwendungsfall möchten Sie vielleicht auch wissen, ob die 8G im System von 2x4GB-Sticks oder 4x2GB-Sticks stammen.

44
user3070163

Haben Sie cat /proc/meminfo ausprobiert? Sie können dann herausfinden, was Sie möchten, MemTotal z.

Aktualisiertes Beispiel (übrigens danke, Masta):

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

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

Ich schätze, Ihr Problem tritt auf, wenn Sie VM haben und den gesamten vom Hypervisor gehosteten Speicher 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"}'
45
Cyril

Fügen Sie die letzten beiden Einträge von /proc/meminfo hinzu, um den genauen Speicherplatz auf dem Host anzuzeigen.

Beispiel:

DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB

10240 + 4184064 = 4194304 kB = 4096 MB.

15
Sandip

Noch ein nützlicher Befehl:
vmstat -s | grep memory
Die Beispielausgabe auf meinem Computer lautet: 

  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 ist:
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 free auch Informationen über den Swap-Bereich gibt.
.__ Der folgende Link kann für Sie nützlich sein:
http://www.linuxnix.com/find-ram-details-in-linuxunix/

13
Yogesh Jilhawar
free -h | awk '/Mem\:/ { print $2 }' 

Dadurch erhalten Sie den gesamten Arbeitsspeicher Ihres Systems in einem für Menschen lesbaren Format und werden automatisch auf die entsprechende Einheit skaliert (z. B. Byte, KB, MB oder GB).

10
JayEek
dmidecode -t 17 | grep  Size:

Wenn Sie alle obigen Werte nach "Size:" hinzufügen, erhalten Sie eine genaue physikalische Gesamtgröße aller RAM - Sticks im Server.

5
Raghu Ni

Gesamtspeicher in Mb:

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

oder:

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

Das 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, indem Sie die folgenden Makros verwenden

sysconf (_SC_PHYS_PAGES) * sysconf (_SC_PAGESIZE);

3. Mit sysinfo Systemaufruf

int sysinfo (struct sysinfo * info);

struct sysinfo {.

   .

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

   unsigned long freeram;   /* Available memory size*/

   .

   . 

  }; 
1
Sandeep_black

Online-Speicher insgesamt

Berechnen Sie den gesamten Online-Speicher mithilfe der sys-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 ein 4 GB-System:

4294967296 bytes
4 GB

Erklärung

/ sys/devices/system/memory/block_size_bytes

Anzahl der Bytes in einem Speicherblock (Hex-Wert). Durch die Verwendung von 0x vor dem Wert wird sichergestellt, dass er während der Berechnung ordnungsgemäß verarbeitet wird.

/ sys/devices/system/memory/memory *

Iterieren über 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.

0
André