Como posso descobrir a memória física total (RAM) da minha caixa linux adequada para ser analisada por um script de shell?

123

Estou digitando um shell script para descobrir a memória física total em algumas caixas de linux do RHEL.

Antes de tudo, quero enfatizar que estou interessado na memória física total reconhecida pelo kernel, não apenas na memória disponível . Portanto, evite respostas sugerindo ler / proc / meminfo ou usar os comandos free , top ou sar - Em todos esses casos, seus valores de " memória total " significam valores de " memória disponível ".

O primeiro pensamento foi ler as mensagens do kernel de inicialização:

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

Mas em algumas caixas Linux, devido ao uso do software PowerPath da EMC2 e às mensagens de inicialização inundadas na inicialização do kernel, essa mensagem útil do kernel de inicialização não está disponível, nem mesmo no arquivo / var / log / dmesg .

A segunda opção foi o comando dmidecode (sou avisado contra a possível incompatibilidade entre a RAM reconhecida pelo kernel e a RAM real devido às limitações de alguns kernels e arquiteturas mais antigos). A opção --memory simplifica o script, mas percebi que versões mais antigas desse comando não têm opção --memory .

Minha última chance foi o comando getconf . Ele relata o tamanho da página da memória, mas não o número total de páginas físicas - a variável de sistema _PHYS_PAGES parece ser a página física disponível, e não o total de páginas físicas.

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

Minha pergunta: Existe outra maneira de obter a quantidade total de memória física, adequada para ser analisada por um script de shell?

Jdamian
fonte
3
Este devem ser migrados para Linux e Unix
Kolob Canyon

Respostas:

56

Se você estiver interessado na RAM física, use o comando dmidecode. Ele fornece muito mais informações do que apenas isso, mas, dependendo do seu caso de uso, você também pode querer saber se o 8G no sistema vem de sticks de 2x4GB ou de 4x2GB.

Dummy00001
fonte
19
Eu precisava disso recentemente e tenho um comando simples para obter o tamanho total da memória de todos os módulos de memória em um sistema: dmidecode -t 17 | grep "Tamanho. * MB" | awk '{s + = $ 2} END {print s / 1024}'
Jonesinator 18/06/14
6
Diferente de outras respostas, o dmidecode requer privilégios de root .
chus 10/05
1
Esse erro ocorre # dmidecode 3.0 / sys / firmware / dmi / tables / smbios_entry_point: permissão negada Digitalização / dev / mem para o ponto de entrada. / dev / mem: Permissão negada
VVB 13/17
128

Você já tentou cat /proc/meminfo? Você pode então awk ou grep o que você quer, MemTotal eg

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

ou

cat /proc/meminfo | grep MemTotal
Alex
fonte
8
Mas MemTotal não é a memória física total - consulte a página man proc (5)
Chris Stratton
2
@ ChrisStratton: você pode ser mais explícito? Para as intenções e propósitos mais práticos, essa resposta pode ser suficiente.
Dan Dascalescu
13
awk '/MemTotal/ {print $2}' /proc/meminfo Quanto menos tubos, melhor.
Masta
3
Alternativa altamente opinativa: Evite o awk, quando puder. O Regex / PCRE é uma linguagem de correspondência de padrões muito mais universal (ou seja, você pode usá-lo também em Python ou Perl). Se você aprende awk, tudo que você já tem é awk. Se você se inclina grep + PCRE, por outro lado ... grep -oP '^MemTotal:\s+\K.*' /proc/meminfo
Gabriel Totusek
5
@GabrielBurkholder há também uma visão oposta: awké padronizado por POSIX, mas grep's opções -oe -Pnão são! Seu exemplo funcionará bem com o GNU grep(mas o GNU ainda diz que a implementação do PCRE é experimental), mas provavelmente não funcionará com outras implementações.
Pabouk
48

cat /proc/meminfo | grep MemTotalou grátis, fornece a quantidade exata de RAM que seu servidor possui. Isso não é "memória disponível".

Acho que seu problema surge quando você tem uma VM e gostaria de calcular a quantidade total de memória hospedada pelo hipervisor, mas terá que efetuar login no hipervisor nesse caso.

cat /proc/meminfo | grep MemTotal

é equivalente a

 getconf -a | grep PAGES | awk 'BEGIN {total = 1} {if (NR == 1 || NR == 3) total *=$NF} END {print total / 1024" kB"}'
Cyril
fonte
5
Na minha caixa física com cat /proc/meminfo | grep MemTotalrelatórios de memória de 4 GB MemTotal: 3957032 kB, isso é um pouco menos que 4 GB. O OP (e eu) estamos procurando por algo que reportaria 4 GB.
TvE 14/08/15
1
Maneira mais direta de fazer isso é apenas #grep MemTotal /proc/meminfo
Dan Passaro
3
O @TvE 3957032 kBestá apenas rotulado incorretamente . Deve ser rotulado como kiB, conforme indicado neste post . Isso significa que está realmente relatando 4.052.000.768 bytes, que é um pouco maior que 4 GB. Isso ocorre porque as implementações / proc / meminfo são anteriores à notação kiB.
Jeff G
4
@JeffG Acho que você perdeu o argumento que ToolmakerSteve estava fazendo. O valor esperado é 4GiB, não 4GB, e a TvE está simplesmente citando incorretamente o valor. O ToolmakerSteve está correto em que "4 GB" de RAM devem ser interpretados como "4 GiB" no comentário da TvE e, portanto, esse é o valor com o qual estamos comparando. Você está certo de que o valor é maior que 4 GB, assim como também é maior que 2 GB e 2 GiB e menos que 6 GB e 6 GiB, mas o que importa aqui é como ele se compara ao 4GiB, então quem se importa com ele se compara às outras medidas? Então, sim, sua afirmação está correta, mas também é irrelevante.
Tim
1
@ Tim Forneci apenas informações factualmente precisas, com documentação de suporte, que respondiam à pergunta que foi feita. Dado que foi preciso mais do que uma pesquisa trivial para encontrar, acho que o fato de /proc/meminforelatar números no kiB é uma parte extremamente importante dessa discussão, independentemente de o @TvE pretender fazer uma pergunta diferente.
Jeff G
19

Adicione as 2 últimas entradas de /proc/meminfo, elas fornecem a memória exata presente no host.

Exemplo:

DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB

10240 + 4184064 = 4194304 kB = 4096 MB.

Sandip
fonte
3
Melhor resposta aqui, além de usar o dmidecode, que requer raiz. Mas o DirectMap nem sempre é exato. Eu tenho um servidor com 4 GB e diz: `DirectMap4k: 110200 kB DirectMap2M: 3993600 kB` Isso é 4007MB, não 4096MB ...
TVE
NOTA: Mesmo que o sistema operacional da TvE esteja relatando em unidades de 1024 bytes, seu total de 4103800 x 1024 fica aquém de 4 GiB (que seria 4194304 x 1024).
Home
Além disso, não está disponível em todas as versões do Linux. Minha caixa do Centos5 (sim, eu sei) não informa isso.
Tom Quarendon
Para o registro, eles estão presentes apenas no x86. A razão pela qual isso funciona é que essas entradas contam a quantidade de memória representada por páginas de 4k, 2M e 1G no TLB, que deve cobrir toda a memória acessível pelo kernel .
Kevmitch
1
UPDATE: Essa soma varia um pouco quando eu alterno entre diferentes versões do kernel (linux-3.18.28, linux-4.13-rc6) na mesma máquina.
Kevmitch
17

Mais um comando útil:
vmstat -s | grep memory
saída de amostra na minha máquina é:

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

Outro comando útil para obter informações de memória é: a
free
saída de amostra é:

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

Uma observação aqui é que, o comando também freefornece informações sobre o espaço de troca.
O link a seguir pode ser útil para você:
http://www.linuxnix.com/find-ram-details-in-linuxunix/

Yogesh Jilhawar
fonte
1
Esta é uma boa solução simples, se você obter uma saída em Megabytes para fazer mais fácil no olhovmstat -s -S M | grep ' memory'
Oliver Dungey
17
free -h | awk '/Mem\:/ { print $2 }' 

Isso fornecerá a memória total do seu sistema em formato legível por humanos e será dimensionado automaticamente para a unidade apropriada (por exemplo, bytes, KB, MB ou GB).

JayEek
fonte
É mesmo o que eu procurava!
Tomas Gonzalez
10
dmidecode -t 17 | grep  Size:

A adição de todos os valores acima exibidos após "Tamanho:" fornecerá o tamanho físico total exato de todos os sticks de RAM no servidor.

Raghu Ni
fonte
2

Memória online total

Calcule a memória online total usando o 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

Exemplo de saída para sistema de 4 GB:

4294967296 bytes
4 GB

Explicação

/ sys / devices / system / memory / block_size_bytes

Número de bytes em um bloco de memória (valor hexadecimal). Usar 0x na frente do valor garante que ele seja tratado adequadamente durante o cálculo.

/ sys / devices / system / memory / memory *

Iterando sobre todos os blocos de memória disponíveis para verificar se estão online e adicione o tamanho calculado do bloco ao totalmem, se estiverem.

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

Você pode alterar ou remover isso se preferir outro estado da memória.

André
fonte
Vou verificar sua solução assim que puder.
Jdamian 9/11
dica do bash: no seu código, você não precisa usar o caractere de barra ( \) para continuar na próxima linha - na verdade, você pode usar o &&no final da linha para esse fim.
Jdamian 9/11
1

Memória total em Mb:

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

ou:

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

Estas são as maneiras:

1. / proc / meminfo

MemTotal: 8152200 kB

MemFree: 760808 kB

Você pode escrever um código ou script para analisá-lo.

2. Use o sysconf usando as macros abaixo

sysconf (_SC_PHYS_PAGES) * sysconf (_SC_PAGESIZE);

3. Usando a chamada de sistema sysinfo

int sysinfo (estrutura sysinfo * info);

struct sysinfo {.

   .

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

   unsigned long freeram;   /* Available memory size*/

   .

   . 

  }; 
Sandeep_black
fonte
O cat / proc / meminfo funciona para mim no meu sistema embarcado #
Webbertiger
-7

Eu acho htopuma ferramenta útil.

sudo apt-get install htop

e depois

livre -m

fornecerá as informações necessárias.

Sathyam
fonte