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 (mockbuild@builder17.centos.org) (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

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).

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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.