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?
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.
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
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"}'
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.
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/
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).
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.
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))
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*/
.
.
};
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.