Por que o comando “free” e o “dmidecode” mostram valores diferentes para a RAM?

9

Eu tenho um servidor CentOS 5.10 ( 32-bit ) em execução no VMWare. É alocado 4 GB de RAM.

Se eu executar dmidecode -t 17 | grep Size | grep MB , vejo:

Size: 4096 MB

No entanto, quando executo free , vejo:

             total       used       free     shared    buffers     cached
Mem:       3107140    1239244    1867896          0        332     400464
-/+ buffers/cache:     838448    2268692
Swap:      2096472          0    2096472

Por que há uma discrepância entre a quantidade total de memória free reports e a dmidecode output?

O kernel que estou executando é:

2.6.18-371.4.1.el5 #1 SMP Thu Jan 30 06:09:24 EST 2014 i686 i686 i386 GNU/Linux

É verdade que o kernel não está executando PAE , mas eu achei que isso era necessário apenas para a memória excedendo 4 GB.

Eu sei que estou sentindo falta de algo simples - alguém pode, por favor, elaborar?

Notas adicionais / observações

Definitivamente, parece que meu kernel está reservando um monte de memória para outras coisas. Aqui está o que eu vejo em /var/log/dmesg :

Linux version 2.6.18-371.4.1.el5 ([email protected]) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-54)) #1 SMP Thu Jan 30 06:09:24 EST 2014
BIOS-provided physical RAM map:
 BIOS-e820: 0000000000010000 - 000000000009f800 (usable)
 BIOS-e820: 000000000009f800 - 00000000000a0000 (reserved)
 BIOS-e820: 00000000000ca000 - 00000000000cc000 (reserved)
 BIOS-e820: 00000000000dc000 - 0000000000100000 (reserved)
 BIOS-e820: 0000000000100000 - 00000000bfef0000 (usable)
 BIOS-e820: 00000000bfef0000 - 00000000bfeff000 (ACPI data)
 BIOS-e820: 00000000bfeff000 - 00000000bff00000 (ACPI NVS)
 BIOS-e820: 00000000bff00000 - 00000000c0000000 (usable)
 BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)
 BIOS-e820: 00000000fec00000 - 00000000fec10000 (reserved)
 BIOS-e820: 00000000fee00000 - 00000000fee01000 (reserved)
 BIOS-e820: 00000000fffe0000 - 0000000100000000 (reserved)
 BIOS-e820: 0000000100000000 - 0000000140000000 (usable)
Warning only 4GB will be used.
Use a PAE enabled kernel.
3200MB HIGHMEM available.
896MB LOWMEM available.
found SMP MP-table at 000f6bf0
Memory for crash kernel (0x0 to 0x0) notwithin permissible range
    
por Mike B 29.10.2014 / 18:33

3 respostas

18

Com um kernel de 32 bits, você só tem 4GB de espaço de endereçamento disponível. Parte desse espaço de endereçamento deve ser usado pelo hardware (virtual ou físico) do sistema, como placas de vídeo, placas de rede, etc., para seus próprios fins. Este uso é geralmente entre 256MB-1GB, dependendo de quanto espaço de endereço o hardware específico precisa.

Como esse espaço de endereço é usado pelo hardware, a RAM correspondente é geralmente inacessível a um sistema de 32 bits.

Você tem algumas opções:

  1. A opção preferida é executar um sistema operacional de 64 bits. Isso expande dramaticamente o espaço de endereçamento, portanto, há muito espaço para toda a RAM e hardware. Ele também quebra o limite de 32 bits de 2 GB / 3 GB em aplicativos, mantendo a capacidade de executar programas de 32 bits. Em geral, qualquer sistema com 2 GB ou mais de RAM deve executar um SO de 64 bits para evitar esses problemas.
  2. Outra opção é executar um kernel de 32 bits com o PAE ativado. Isso mostrará a RAM, mas cada processo ainda estará limitado a 2 GB / 3 GB de espaço de endereço, dependendo dos detalhes da compilação do kernel. Como os sistemas operacionais de 64 bits executam aplicativos de 32 bits perfeitamente, isso não apresenta vantagens nem desvantagens (como a falta de um caminho de atualização).
por 29.10.2014 / 18:44
5

A saída do comando free não conta a memória do kernel reservada e alguns outros bits pequenos. Você verá essa discrepância mesmo em um kernel de 64 bits e até mesmo com < 2GB de RAM.

    
por 29.10.2014 / 18:45
3

A linha crítica do seu mapa físico de RAM é essa:

 BIOS-e820: 0000000100000000 - 0000000140000000 (usable)

Esta linha mostra que 1 GB (0x40000000 bytes, hexadecimal) da RAM física do seu sistema está sendo mapeado pelo BIOS acima do limite de 4GB, tornando-o inacessível por um sistema de 32 bits sem PAE.

    
por 30.10.2014 / 00:43