Mengapa perintah "bebas" dan "dmidecode" menunjukkan nilai yang berbeda untuk RAM?

9

Saya punya server CentOS 5.10 ( 32-bit ) yang berjalan di VMWare. Ini dialokasikan 4 GB RAM.

Jika saya menjalankan dmidecode -t 17 | grep Size | grep MBsaya melihat:

Size: 4096 MB

Namun ketika saya berlari free, saya melihat:

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

Mengapa ada perbedaan antara jumlah total freelaporan memori dan dmidecodeoutput?

Kernel yang saya jalankan adalah:

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

Diakui, kernel tidak berjalan PAEtapi saya pikir itu hanya diperlukan untuk memori melebihi 4 GB.

Saya tahu saya kehilangan sesuatu yang sederhana - dapatkah seseorang menjelaskan lebih lanjut?

Catatan / Pengamatan Tambahan

Sepertinya kernel saya menyimpan banyak memori untuk hal-hal lain. Inilah yang saya lihat di /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
Mike B
sumber

Jawaban:

18

Dengan kernel 32-bit, Anda hanya memiliki ruang alamat 4GB . Beberapa ruang alamat ini harus digunakan oleh perangkat keras (virtual atau fisik) dalam sistem, seperti kartu video, NIC, dll., Untuk keperluan mereka sendiri. Penggunaan ini biasanya antara 256MB-1GB tergantung pada seberapa banyak ruang alamat yang dibutuhkan perangkat keras tertentu.

Karena ruang alamat tersebut digunakan oleh perangkat keras, RAM yang sesuai umumnya tidak dapat diakses oleh sistem 32-bit.

Anda memiliki dua pilihan:

  1. Opsi yang lebih disukai adalah menjalankan sistem operasi 64-bit. Ini secara dramatis memperluas ruang alamat, sehingga ada banyak ruang untuk semua RAM dan perangkat keras. Itu juga mematahkan batas 2GB / 3GB 32-bit pada aplikasi sambil mempertahankan kemampuan untuk menjalankan program 32-bit. Secara umum, sistem apa pun dengan 2GB RAM lebih banyak harus menjalankan OS 64-bit untuk menghindari masalah ini.
  2. Opsi lain adalah menjalankan kernel 32-bit dengan PAE diaktifkan. Ini akan memunculkan RAM, tetapi setiap proses masih akan terbatas pada ruang alamat 2GB / 3GB, tergantung pada rincian kernel build. Karena OS 64-bit akan menjalankan aplikasi 32-bit dengan sangat baik, ini tidak memiliki kelebihan dan banyak kerugian (seperti kurangnya jalur peningkatan).
Michael Hampton
sumber
Terima kasih. Itu masuk akal tetapi bagaimana saya bisa memeriksa secara khusus berapa "tersembunyi" / dikonsumsi oleh perangkat keras untuk keperluan lain? Apakah itu di bawah /proc/meminfo?
Mike B
@ MikeB Secara khusus, saya tidak yakin begitu saja, meskipun jelas bahwa sekitar 800 MB hilang.
Michael Hampton
Untuk tujuan pertanyaan awal saya, saya pikir itu dijawab tetapi pertanyaan berikutnya adalah "MENGAPA?". Sepertinya ada utas lain yang membahas hal ini ( unix.stackexchange.com/questions/97261/... ) jadi saya akan mencoba menggali lebih banyak dan mungkin memiliki pertanyaan nanti. Terima kasih!
Mike B
Sebagai administrator sistem profesional, kami peduli akan hal ini, tetapi hanya sampai pada titik - di mana dan bagaimana hal itu memengaruhi operasi. Saya pikir saya sudah membahas aspek itu.
Michael Hampton
2
@MikeB /proc/iomemakan menunjukkan memori yang digunakan oleh perangkat tempat Linux memiliki drivernya. Peta memori e820 (di awal dmesgkernel yang baru di-boot) akan menunjukkan kepada Anda apa yang dipikirkan BIOS / EFI Anda di wilayah mana yang dicadangkan. Mencocokkan mereka satu sama lain adalah AFAIK tugas manual tanpa dukungan alat.
mihi
5

Output dari freeperintah tidak menghitung memori kernel yang dicadangkan dan beberapa bit kecil lainnya. Anda akan melihat perbedaan ini bahkan dalam kernel 64-bit dan bahkan dengan <2GB RAM.

John
sumber
2
Itu bukan hanya beberapa bagian kecil lainnya ...
Michael Hampton
Yah, tidak, tidak secara harfiah bit seperti dalam 8-bit-make-a-byte ... tetapi itu hanya beberapa puluh MB paling banyak. Dari segi persentase, sangat kecil.
John
Sebagai contoh, dalam dua sistem 64-bit yang menjalankan RHEL 5.10 di dalam VMware, mesin RAM "fisik" 2GB menunjukkan total MB 2010 free, mesin 4GB menunjukkan 3948 MB.
John
1
Terima kasih ... aneh bahwa saya melihat perbedaan besar dalam diri saya tetapi sepertinya itu bisa "normal".
Mike B
2
Tidak, ini bukan "normal" - ini 800+ MB!
Michael Hampton
3

Garis kritis dari peta RAM fisik Anda adalah ini:

 BIOS-e820: 0000000100000000 - 0000000140000000 (usable)

Baris ini menunjukkan bahwa 1 GB (0x40000000 byte, heksadesimal) dari RAM fisik sistem Anda sedang dipetakan oleh BIOS di atas batas 4GB, membuatnya tidak dapat diakses oleh sistem 32-bit tanpa PAE.

duskwuff -inactive-
sumber