web-dev-qa-db-ja.com

「free」コマンドと「dmidecode」でRAMの値が異なるのはなぜですか?

CentOS 5.10(32-bit)サーバーをVMWareで実行しています。 4 GBのRAMが割り当てられています。

dmidecode -t 17 | grep Size | grep MB そうですか:

Size: 4096 MB

しかし、freeを実行すると、次のようになります。

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

メモリfreeレポートの合計量とdmidecode出力の間に不一致があるのはなぜですか?

私が実行しているカーネルは次のとおりです。

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

確かに、カーネルはPAEを実行していませんが、これはメモリが4GBを超える場合にのみ必要だと思いました。

簡単なものが欠けていることはわかっています。詳しく説明してもらえますか?

追加のメモ/所見

私のカーネルが他のもののためにたくさんのメモリを予約しているようです。 /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
9
Mike B

32ビットカーネルでは、4 GBのアドレススペースしか使用できません。このアドレス空間の一部は、ビデオカード、NICなど、システム内の(仮想または物理)ハードウェアが独自の目的で使用する必要があります。この使用量は通常、特定のハードウェアが必要とするアドレススペースの量に応じて、256MB〜1GBです。

そのアドレス空間はハードウェアによって使用されるため、対応するRAM=は、通常32ビットシステムにはアクセスできません。

次の2つのオプションがあります。

  1. 64ビットオペレーティングシステムを実行することをお勧めします。これにより、アドレススペースが大幅に拡張されるため、RAMとハードウェアのすべてに十分なスペースがあります。32ビットを実行する機能を維持しながら、アプリケーションの2GB/3GB 32ビットの制限を破ります。一般に、2 GB以上のRAM=を搭載したシステムでは、これらの問題を回避するために64ビットOSを実行する必要があります。
  2. 別のオプションは、PAEを有効にして32ビットカーネルを実行することです。これによりRAMが再表示されますが、カーネルビルドの詳細に応じて、各プロセスは2GB/3GBのアドレス空間に制限されます。 64ビットOSは32ビットアプリケーションを完全に実行するため、これには利点がなく、多くの欠点があります(アップグレードパスがないなど)。
18
Michael Hampton

freeコマンドの出力では、予約済みのカーネルメモリやその他のいくつかの小さなビットはカウントされません。 64ビットカーネルでも、<2GB RAMでも、この不一致が見られます。

5
John

あなたの物理的なRAM=マップからの重要な行はこれです:

 BIOS-e820: 0000000100000000 - 0000000140000000 (usable)

この行は、システムの物理的な1 GB(0x40000000バイト、16進数)RAMがBIOSによって4GBの制限を超えてマッピングされているため、PAEのない32ビットシステムからアクセスできないことを示しています。

3