web-dev-qa-db-fra.com

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

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 m'intéresse à la mémoire physique totale reconnue par le noyau, et 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, leur "mémoire totale "les valeurs signifient" 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 machines Linux, en raison de l’utilisation du logiciel PowerPath d’EMC2 et de ses messages de démarrage flooding au démarrage du noyau, ce message utile n’est pas disponible, même dans le fichier / var/log/dmesg fichier.

La deuxième option était la commande dmidecode (je suis mis en garde contre la disparité possible entre RAM reconnue par le noyau et réelle RAM en raison des limitations de certains noyaux et architectures plus anciens). L'option --memory simplifie le script, mais je me suis rendu compte que les anciennes versions de cette commande ne comportaient 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 correspondre aux pages physiques disponibles et non au 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 pouvant être analysée par un script Shell?

101
Jdamian

Si la RAM physique vous intéresse, utilisez la commande dmidecode. Il vous donne beaucoup plus d'informations que cela, mais selon votre cas d'utilisation, vous voudrez peut-être aussi savoir si le 8G du système provient de bâtons de 2x4 Go ou de bâtons de 4x2 Go.

44
user3070163

Avez-vous essayé cat /proc/meminfo? Vous pouvez ensuite déterminer ce que vous voulez, MemTotal p. Ex.

Exemple mis à jour (merci, Masta):

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

cat /proc/meminfo | grep MemTotal ou free vous donne la quantité exacte de RAM de votre serveur. Ce n'est pas "mémoire disponible".

Je suppose que votre problème se pose lorsque vous avez un VM 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"}'
45
Cyril

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

Exemple:

DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB

10240 + 4184064 = 4194304 kB = 4096 MB.

15
Sandip

Une autre commande utile:
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:
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 est que la commande free donne également des informations sur l’espace de permutation.
Le lien suivant peut vous être utile:
http://www.linuxnix.com/find-ram-details-in-linuxunix/

13
Yogesh Jilhawar
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 adapté à l'unité appropriée (par exemple, octets, Ko, Mo ou Go).

10
JayEek
dmidecode -t 17 | grep  Size:

Ajouter toutes les valeurs ci-dessus affichées après "Size:" donnera la taille physique totale exacte de tous les bâtons RAM du serveur.

5
Raghu Ni

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))
2
Eduardo Cuomo

Voici les méthodes:

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*/

   .

   . 

  }; 
1
Sandeep_black

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 permet de s'assurer qu'elle est correctement gérée lors du calcul.

/ sys/devices/system/memory/memory *

Parcourez tous les blocs de mémoire disponibles pour vérifier qu'ils sont en ligne et ajoutez 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.

0
André