¿Cómo puedo encontrar la memoria física total (RAM) de mi Linux box adecuada para ser analizada por un script de shell?

123

Estoy escribiendo un script de shell para averiguar la memoria física total en algunos cuadros de Linux RHEL.

En primer lugar, quiero enfatizar que estoy interesado en la memoria física total reconocida por el núcleo, no solo en la memoria disponible . Por lo tanto, evite las respuestas que sugieran leer / proc / meminfo o usar los comandos free , top o sar . En todos estos casos, sus valores de " memoria total " significan " memoria disponible ".

El primer pensamiento fue leer los mensajes del núcleo de arranque:

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

Pero en algunos cuadros de Linux, debido al uso del software PowerPath de EMC2 y sus mensajes de inicio de inundación en el inicio del kernel, ese útil mensaje de kernel de inicio no está disponible, ni siquiera en el archivo / var / log / dmesg .

La segunda opción era el comando dmidecode (se me advierte sobre la posible falta de coincidencia de RAM reconocida por el núcleo y RAM real debido a las limitaciones de algunos núcleos y arquitecturas más antiguas). La opción --memory simplifica el script pero me di cuenta de que las versiones anteriores de ese comando no tienen la opción --memory .

Mi última oportunidad fue el comando getconf . Informa el tamaño de la página de memoria, pero no el número total de páginas físicas: la variable de sistema _PHYS_PAGES parece ser las páginas físicas disponibles, no las páginas físicas totales.

# getconf -a | grep PÁGINAS
PÁGINA 4096
_AVPHYS_PÁGINAS 1049978
_PHYS_PÁGINAS 15466409

Mi pregunta: ¿Hay otra forma de obtener la cantidad total de memoria física, adecuada para ser analizada por un script de shell?

Jdamian
fuente
3
Esto debería migrarse a Linux y Unix
Kolob Canyon

Respuestas:

56

Si está interesado en la RAM física, use el comando dmidecode. Le brinda mucha más información que eso, pero dependiendo de su caso de uso, es posible que también desee saber si el 8G en el sistema proviene de unidades de 2x4GB o unidades de 4x2GB.

Dummy00001
fuente
19
Necesitaba esto recientemente, y tengo un comando simple para obtener el tamaño de memoria total de todos los módulos de memoria en un sistema: dmidecode -t 17 | grep "Tamaño. * MB" | awk '{s + = $ 2} END {print s / 1024}'
Jonesinator
66
A diferencia de otras respuestas, dmidecode requiere privilegios de root .
chus
1
Me da este error # dmidecode 3.0 / sys / firmware / dmi / tables / smbios_entry_point: Permiso denegado Escaneo / dev / mem para el punto de entrada. / dev / mem: Permiso denegado
VVB
128

¿Lo has intentado cat /proc/meminfo? A continuación, puede awk o grep lo que quiere, MemTotal por ejemplo,

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

o

cat /proc/meminfo | grep MemTotal
Alex
fuente
8
Pero MemTotal no es la memoria física total; consulte la página del manual para el proceso (5)
Chris Stratton
2
@ChrisStratton: ¿puedes ser más explícito? Para la mayoría de los propósitos y propósitos prácticos, esta respuesta puede ser suficiente.
Dan Dascalescu
13
awk '/MemTotal/ {print $2}' /proc/meminfo Cuantas menos tuberías, mejor.
masta
3
Alternativa altamente obstinada: evite awk, cuando pueda. Regex / PCRE es un lenguaje de coincidencia de patrones mucho más universal (es decir, también puede usarlo en Python o Perl). Si aprendes awk, todo lo que ya tienes es awk. Si te apoyas grep + PCRE por otro lado ... grep -oP '^MemTotal:\s+\K.*' /proc/meminfo
Gabriel Totusek
55
@GabrielBurkholder también hay una vista opuesta: ¡ awkestá estandarizado por POSIX pero greplas opciones son -oy -Pno lo son! Su ejemplo funcionará bien con GNU grep(pero GNU aún dice que la implementación de PCRE es experimental) pero probablemente no funcionará con otras implementaciones.
Pabouk
48

cat /proc/meminfo | grep MemTotalo gratis te da la cantidad exacta de RAM que tiene tu servidor. Esto no es "memoria disponible".

Supongo que su problema surge cuando tiene una VM y desea calcular la cantidad total de memoria alojada por el hipervisor, pero tendrá que iniciar sesión en el hipervisor en ese caso.

cat /proc/meminfo | grep MemTotal

es equivalente a

 getconf -a | grep PAGES | awk 'BEGIN {total = 1} {if (NR == 1 || NR == 3) total *=$NF} END {print total / 1024" kB"}'
Cirilo
fuente
55
En mi caja física con cat /proc/meminfo | grep MemTotalinformes de memoria de 4 GB MemTotal: 3957032 kB, eso es un poco corto de 4 GB. El OP (y yo) estamos buscando algo que informe 4GB.
TvE
1
Una forma más directa de hacerlo es sologrep MemTotal /proc/meminfo
Dan Passaro,
3
@TvE 3957032 kBestá mal etiquetado. Debe etiquetarse como kiB, como se indica en esta publicación . Eso significa que realmente está reportando 4,052,000,768 bytes, que es ligeramente mayor que 4 GB. Esto se debe al hecho de que las implementaciones / proc / meminfo son anteriores a la notación kiB.
Jeff G
44
@JeffG Creo que te perdiste el punto que ToolmakerSteve estaba haciendo. El valor esperado es 4GiB, no 4GB, y TvE simplemente cita incorrectamente el valor. ToolmakerSteve tiene razón en que "4 GB" de RAM debe interpretarse como "4 GiB" en el comentario de TvE y, por lo tanto, ese es el valor con el que estamos comparando. Tiene razón en que el valor es mayor a 4GB, al igual que también es mayor a 2GB y 2GiB y menor a 6GB y 6GiB, pero lo que importa aquí es cómo se compara con 4GiB, entonces, ¿a quién le importa cómo se compara con las otras medidas? Entonces sí, su afirmación es correcta, pero también es irrelevante.
Tim
1
@Tim Solo proporcioné información que es objetivamente precisa, con documentación de respaldo, que respondió la pregunta que se hizo. Dado que tomó más que una búsqueda trivial para encontrar, creo que el hecho de que los /proc/meminfonúmeros de informes en kiB es una parte extremadamente importante de esta discusión, independientemente de si @TvE tenía la intención de hacer una pregunta diferente.
Jeff G
19

Agregue las últimas 2 entradas de /proc/meminfo, le dan la memoria exacta presente en el host.

Ejemplo:

DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB

10240 + 4184064 = 4194304 kB = 4096 MB.

Sandip
fuente
3
La mejor respuesta aquí, aparte de usar dmidecode, que requiere root. Pero el DirectMap no siempre es exacto. Tengo un servidor con 4GB y dice: `DirectMap4k: 110200 kB DirectMap2M: 3993600 kB` Eso es 4007MB, no 4096MB ...
TvE
NOTA: Incluso si el sistema operativo de TvE informa en unidades de 1024 bytes, su total de 4103800 x 1024 no llega a 4 GiB (que sería 4194304 x 1024).
ToolmakerSteve
Además, no está disponible en todas las versiones de Linux. Mi casilla Centos5 (sí, lo sé) no informa esto.
Tom Quarendon
Para el registro, estos solo están presentes en x86. La razón por la que esto funciona es que estas entradas cuentan la cantidad de memoria representada por 4k, 2M, páginas 1G en el TLB, que debe cubrir toda la memoria accesible por el núcleo .
kevmitch
1
ACTUALIZACIÓN: Esta suma varía ligeramente cuando me muevo entre diferentes versiones del kernel (linux-3.18.28, linux-4.13-rc6) en la misma máquina.
kevmitch
17

Un comando más útil: la
vmstat -s | grep memory
salida de muestra en mi máquina es:

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

Otro comando útil para obtener información de la memoria es: la
free
salida de muestra es:

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

Una observación aquí es que, el comando también freeproporciona información sobre el espacio de intercambio.
El siguiente enlace puede ser útil para usted:
http://www.linuxnix.com/find-ram-details-in-linuxunix/

Yogesh Jilhawar
fuente
1
Esta es una buena solución simple, si desea que su salida en Megabytes sea más fácil de vervmstat -s -S M | grep ' memory'
Oliver Dungey
17
free -h | awk '/Mem\:/ { print $2 }' 

Esto le proporcionará la memoria total de su sistema en formato legible para humanos y se escalará automáticamente a la unidad adecuada (por ejemplo, bytes, KB, MB o GB).

JayEek
fuente
¡Justo lo que estaba buscando!
Tomás González
10
dmidecode -t 17 | grep  Size:

Agregar todos los valores anteriores que se muestran después de "Tamaño:" dará el tamaño físico total exacto de todas las memorias RAM en el servidor.

Raghu Ni
fuente
2

Memoria total en línea

Calcule la memoria total en línea usando 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

Ejemplo de salida para un sistema de 4 GB:

4294967296 bytes
4 GB

Explicación

/ sys / devices / system / memory / block_size_bytes

Número de bytes en un bloque de memoria (valor hexadecimal). Usar 0x delante del valor asegura que se maneje adecuadamente durante el cálculo.

/ sys / devices / system / memory / memory *

Iterando sobre todos los bloques de memoria disponibles para verificar que estén en línea y agregue el tamaño de bloque calculado a totalmem si lo están.

[["$ (cat $ {mem} / en línea)" == "1"]] &&

Puede cambiar o eliminar esto si prefiere otro estado de memoria.

André
fuente
Comprobaré tu solución lo antes posible.
Jdamian
consejo bash: en su código no necesita usar el carácter de barra diagonal ( \) para continuar en la siguiente línea; en realidad, puede usar &&el final de línea para ese propósito.
Jdamian
1

Memoria total en Mb:

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

o:

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

Estas son las formas:

1. / proc / meminfo

MemTotal: 8152200 kB

MemFree: 760808 kB

Puede escribir un código o script para analizarlo.

2. Use sysconf usando las macros siguientes

sysconf (_SC_PHYS_PAGES) * sysconf (_SC_PAGESIZE);

3. Mediante el uso de la llamada al sistema sysinfo

int sysinfo (struct sysinfo * info);

struct sysinfo {.

   .

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

   unsigned long freeram;   /* Available memory size*/

   .

   . 

  }; 
Sandeep_black
fuente
cat / proc / meminfo funciona para mí en mi sistema embebido
webbertiger
-7

Encuentro htopuna herramienta útil.

sudo apt-get install htop

y entonces

libre -m

le dará la información que necesita.

Sathyam
fuente