Comment puis-je connaître la mémoire physique totale (RAM) de ma machine Linux pouvant être analysée par un script shell?

123

Je tape un script shell pour connaître la mémoire physique totale dans certaines boîtes Linux RHEL.

Tout d'abord, je tiens à souligner que je suis intéressé par la mémoire physique totale reconnue par le noyau, pas seulement la mémoire disponible . Par conséquent, évitez les réponses suggérant de lire / proc / meminfo ou d'utiliser les commandes free , top ou sar - Dans tous ces cas, leurs valeurs " mémoire totale " signifient celles de " mémoire disponible ".

La première pensée a été de lire les messages du noyau de démarrage:

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

Mais dans certaines boîtes de Linux, en raison de l'utilisation du logiciel PowerPath de EMC2 et ses inondations messages de démarrage dans le démarrage du noyau, ce message du noyau de démarrage utile n'est pas disponible, même pas dans le répertoire / var / log / dmesg fichier.

La deuxième option était la commande dmidecode (je suis mis en garde contre la possible discordance entre la RAM reconnue par le noyau et la RAM réelle en raison des limitations de certains noyaux et architectures plus anciens). L'option --memory simplifie le script mais j'ai réalisé que les anciennes versions de cette commande n'avaient pas d' option --memory .

Ma dernière chance était la commande getconf . Il indique la taille de la page mémoire, mais pas le nombre total de pages physiques - la variable système _PHYS_PAGES semble être les pages physiques disponibles, pas le nombre total de pages physiques.

# getconf -a | grep PAGES
PAGESIZE 4096
_AVPHYS_PAGES 1049978
_PHYS_PAGES 15466409

Ma question: existe-t-il un autre moyen d'obtenir la quantité totale de mémoire physique, susceptible d'être analysée par un script shell?

Jdamian
la source
3
Cela devrait être migré vers Linux et Unix
Kolob Canyon

Réponses:

56

Si vous êtes intéressé par la RAM physique, utilisez la commande dmidecode. Cela vous donne beaucoup plus d'informations que cela, mais en fonction de votre cas d'utilisation, vous voudrez peut-être également savoir si les 8G du système proviennent de clés de 2x4 Go ou de clés 4x2 Go.

Dummy00001
la source
19
J'en avais besoin récemment et j'ai une commande simple pour obtenir la taille totale de la mémoire de tous les modules de mémoire sur un système: dmidecode -t 17 | grep "Taille. * Mo" | awk '{s + = $ 2} END {print s / 1024}'
Jonesinator
6
Différent des autres réponses, dmidecode nécessite des privilèges root .
chus
1
Cela me donne cette erreur # dmidecode 3.0 / sys / firmware / dmi / tables / smbios_entry_point: Autorisation refusée Analyse / dev / mem pour le point d'entrée. / dev / mem: Autorisation refusée
VVB
128

Avez-vous essayé cat /proc/meminfo? Vous pouvez ensuite extraire ou grep ce que vous voulez, MemTotal par exemple

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

ou

cat /proc/meminfo | grep MemTotal
Alex
la source
8
Mais MemTotal n'est pas la mémoire physique totale - veuillez consulter la page de manuel pour proc (5)
Chris Stratton
2
@ChrisStratton: pouvez-vous être plus explicite? Pour la plupart des buts et objectifs pratiques, cette réponse peut être suffisante.
Dan Dascalescu
13
awk '/MemTotal/ {print $2}' /proc/meminfo Moins il y a de tuyaux, mieux c'est.
masta
3
Alternative très avisée: évitez les maladresses, quand vous le pouvez. Regex / PCRE est un langage de correspondance de motifs beaucoup plus universel (c'est-à-dire que vous pouvez également l'utiliser en Python ou Perl). Si vous apprenez awk, tout ce que vous avez déjà est awk. Si vous penchez grep + PCRE d'autre part ... grep -oP '^MemTotal:\s+\K.*' /proc/meminfo
Gabriel Totusek
5
@GabrielBurkholder il y a aussi un point de vue opposé: awkest standardisé par POSIX mais greples options de -oet -Pne le sont pas! Votre exemple fonctionnera bien avec GNU grep(mais GNU dit toujours que l'implémentation PCRE est expérimentale) mais il ne fonctionnera probablement pas avec d'autres implémentations.
pabouk
48

cat /proc/meminfo | grep MemTotalou gratuit vous donne la quantité exacte de RAM dont dispose votre serveur. Ce n'est pas de la "mémoire disponible".

Je suppose que votre problème survient lorsque vous avez une machine virtuelle et que vous souhaitez calculer la quantité totale de mémoire hébergée par l'hyperviseur, mais vous devrez vous connecter à l'hyperviseur dans ce cas.

cat /proc/meminfo | grep MemTotal

est équivalent à

 getconf -a | grep PAGES | awk 'BEGIN {total = 1} {if (NR == 1 || NR == 3) total *=$NF} END {print total / 1024" kB"}'
Cyril
la source
5
Sur ma boîte physique avec des cat /proc/meminfo | grep MemTotalrapports de mémoire de 4 Go MemTotal: 3957032 kB, c'est un peu moins de 4 Go. L'OP (et moi) recherchons quelque chose qui rapporterait 4 Go.
TvE
1
Un moyen plus direct de le faire est justegrep MemTotal /proc/meminfo
Dan Passaro
3
@TvE 3957032 kBest juste mal étiqueté. Il devrait être étiqueté kiB, comme indiqué dans cet article . Cela signifie qu'il rapporte en réalité 4 052 000 768 octets, ce qui est légèrement supérieur à 4 Go. Cela est dû au fait que les implémentations / proc / meminfo sont antérieures à la notation kiB.
Jeff G
4
@JeffG Je pense que vous avez manqué le point que ToolmakerSteve faisait. La valeur attendue est de 4 Go et non de 4 Go, et TvE cite simplement la valeur de manière erronée. ToolmakerSteve a raison de dire que «4 Go» de RAM doit être interprété comme «4 Gio» dans le commentaire de TvE, et c'est donc la valeur à laquelle nous comparons. Vous avez raison de dire que la valeur est supérieure à 4 Go, tout comme elle est également supérieure à 2 Go et 2 Go et inférieure à 6 Go et 6 Go, mais ce qui compte ici, c'est comment elle se compare à 4 Go, alors qui se soucie de sa comparaison avec les autres mesures? Alors oui, votre déclaration est correcte, mais elle n'est pas non plus pertinente.
Tim
1
@Tim Je n'ai fourni que des informations factuellement exactes, accompagnées de pièces justificatives, qui ont répondu à la question posée. Étant donné qu'il a fallu plus qu'une simple recherche pour trouver, je pense que le fait de /proc/meminforapporter des nombres en kio est une partie extrêmement importante de cette discussion, que @TvE ait l'intention de poser une question différente.
Jeff G
19

Ajoutez les 2 dernières entrées de /proc/meminfo, elles vous donnent la mémoire exacte présente sur l'hôte.

Exemple:

DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB

10240 + 4184064 = 4194304 ko = 4096 Mo.

Sandip
la source
3
Meilleure réponse ici, autre que d'utiliser dmidecode, qui nécessite root. Mais le DirectMap n'est pas toujours exact. J'ai un serveur avec 4 Go et il dit: `DirectMap4k: 110200 ko DirectMap2M: 3993600 ko` C'est 4007 Mo, pas 4096 Mo ...
TvE
REMARQUE: même si le système d'exploitation de TvE génère des rapports en unités de 1024 octets, son total de 4103800 x 1024 est inférieur à 4 Gio (ce qui serait 4194304 x 1024).
ToolmakerSteve
De plus, non disponible sur toutes les versions de Linux. Ma boîte Centos5 (oui, je sais) ne le signale pas.
Tom Quarendon
Pour mémoire, ceux-ci ne sont présents que sur x86. La raison pour laquelle cela fonctionne est que ces entrées comptent la quantité de mémoire représentée par 4k, 2M, 1G pages dans le TLB, qui doit couvrir toute la mémoire accessible par le noyau .
kevmitch
1
MISE À JOUR: Cette somme varie légèrement lorsque je me déplace entre les différentes versions du noyau (linux-3.18.28, linux-4.13-rc6) sur la même machine.
kevmitch
17

Une autre commande utile: un
vmstat -s | grep memory
exemple de sortie sur ma machine est:

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

une autre commande utile pour obtenir des informations sur la mémoire est: l'
free
exemple de sortie est:

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

Une observation ici est que, la commande freedonne également des informations sur l'espace d'échange.
Le lien suivant peut vous être utile:
http://www.linuxnix.com/find-ram-details-in-linuxunix/

Yogesh Jilhawar
la source
1
C'est une belle solution simple, si vous voulez que votre sortie en mégaoctets facilite l'œilvmstat -s -S M | grep ' memory'
Oliver Dungey
17
free -h | awk '/Mem\:/ { print $2 }' 

Cela vous fournira la mémoire totale de votre système dans un format lisible par l'homme et sera automatiquement mis à l'échelle vers l'unité appropriée (par exemple, octets, Ko, Mo ou Go).

JayEek
la source
Exactement ce que je cherchais!
Tomas Gonzalez
10
dmidecode -t 17 | grep  Size:

L'ajout de toutes les valeurs ci-dessus affichées après "Size:" donnera la taille physique totale exacte de toutes les clés RAM du serveur.

Raghu Ni
la source
2

Mémoire totale en ligne

Calculez la mémoire totale en ligne à l'aide de 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

Exemple de sortie pour un système de 4 Go:

4294967296 bytes
4 GB

Explication

/ sys / devices / system / memory / block_size_bytes

Nombre d'octets dans un bloc de mémoire (valeur hexadécimale). L'utilisation de 0x devant la valeur garantit qu'elle est correctement gérée pendant le calcul.

/ sys / périphériques / système / mémoire / mémoire *

Itérer sur tous les blocs de mémoire disponibles pour vérifier qu'ils sont en ligne et ajouter la taille de bloc calculée à totalmem s'ils le sont.

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

Vous pouvez modifier ou supprimer cela si vous préférez un autre état de la mémoire.

André
la source
Je vérifierai votre solution dès que possible.
Jdamian
Astuce bash: dans votre code, vous n'avez pas besoin d'utiliser la barre oblique ( \) pour continuer à la ligne suivante - en fait, vous pouvez utiliser le &&à la fin de la ligne à cette fin.
Jdamian
1

Mémoire totale dans Mb:

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

ou:

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

Voici les moyens:

1. / proc / meminfo

MemTotal: 8152200 kB

MemFree: 760808 kB

Vous pouvez écrire un code ou un script pour l'analyser.

2. Utilisez sysconf en utilisant les macros ci-dessous

sysconf (_SC_PHYS_PAGES) * sysconf (_SC_PAGESIZE);

3. En utilisant l'appel système sysinfo

int sysinfo (struct sysinfo * info);

struct sysinfo {.

   .

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

   unsigned long freeram;   /* Available memory size*/

   .

   . 

  }; 
Sandeep_black
la source
cat / proc / meminfo fonctionne pour moi sur mon système embarqué
webbertiger
-7

Je trouve htopun outil utile.

sudo apt-get installer htop

puis

gratuit -m

vous donnera les informations dont vous avez besoin.

Sathyam
la source