“Free” komutu ve “dmidecode” RAM için neden farklı değerler gösteriyor?


9

VMWare üzerinde çalışan bir CentOS 5.10 ( 32 bit ) sunucum var. 4 GB RAM ayrılmıştır.

Eğer koşarsam dmidecode -t 17 | grep Size | grep MBgörüyorum:

Size: 4096 MB

Yine de koştuğumda freeşunu görüyorum:

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

Toplam bellek freeraporu miktarı ile dmidecodeçıktı arasında neden bir tutarsızlık var ?

Çalıştığım çekirdek:

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

Kuşkusuz, çekirdek çalışmıyor PAEama bunun sadece 4 GB'ı aşan bellek için gerekli olduğunu düşündüm .

Basit bir şey eksik olduğumu biliyorum - biri lütfen ayrıntılandırabilir mi?

Ek Notlar / Gözlemler

Kesinlikle benim çekirdeğim diğer şeyler için bir sürü bellek ayırıyor gibi görünüyor. İşte gördüğüm /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

Yanıtlar:


18

32 bit çekirdeğe sahip olduğunuzda yalnızca 4 GB kullanılabilir adres alanınız vardır . Bu adres alanının bir kısmı, video kartları, NIC'ler vb. Gibi sistemdeki (sanal veya fiziksel) donanım tarafından kendi amaçları için kullanılmalıdır. Bu kullanım, belirli donanımın ne kadar adres alanına ihtiyacı olduğuna bağlı olarak genellikle 256MB-1GB arasındadır.

Bu adres alanı donanım tarafından kullanıldığından, karşılık gelen RAM genellikle 32 bit sistem tarafından erişilemez.

Senin birkaç seçeneğin var:

  1. Tercih edilen seçenek 64 bit işletim sistemini çalıştırmaktır. Bu, adres alanını önemli ölçüde genişletir, bu nedenle tüm RAM ve donanım için bolca yer vardır. Ayrıca 32 bit programları çalıştırma yeteneğini korurken, uygulamalardaki 2GB / 3GB 32 bit sınırını da aşar. Genel olarak, 2GB daha fazla RAM'e sahip herhangi bir sistem, bu sorunları önlemek için 64 bit işletim sistemi çalıştırmalıdır.
  2. Başka bir seçenek de PAE etkinleştirilmiş bir 32 bit çekirdek çalıştırmaktır. Bu, RAM'i gösterecektir, ancak her işlem, çekirdek derlemesinin özelliklerine bağlı olarak 2GB / 3GB adres alanı ile sınırlı olacaktır. 64 bit işletim sistemleri 32 bit uygulamaları mükemmel bir şekilde çalıştıracağından, bunun hiçbir avantajı ve birçok dezavantajı yoktur (yükseltme yolunun olmaması gibi).

Teşekkürler. Bu anlamlıdır, ancak donanım tarafından "gizli" / başka amaçlarla ne kadar tüketildiğini nasıl kontrol edebilirim? Altında olur /proc/meminfomu?
Mike B

@MikeB Özellikle, 800 MB civarında bir yerin kaybolduğu açık olsa da, hazırlıksız emin değilim.
Michael Hampton

İlk sorum için, sanırım cevaplandı ancak bir sonraki soru "NEDEN?" Bunu kapsayan başka bir iplik var gibi görünüyor ( unix.stackexchange.com/questions/97261/… ) bu yüzden biraz daha kazmaya çalışacağım ve daha sonra soruları olabilir. Teşekkürler!
Mike B

Profesyonel sistem yöneticileri olarak bunu önemsiyoruz, ancak sadece bir noktaya kadar - operasyonları nerede ve nasıl etkilediğini. Bence bu konuya değindim.
Michael Hampton

2
@MikeB /proc/iomemsize Linux'un sürücüsü olan aygıtlar tarafından kullanılan belleği gösterecektir. E820 bellek haritası ( dmesgyeni başlatılan bir çekirdeğin en başında ) BIOS / EFI'nızın hangi bölgelerin ayrılmış olduğunu düşündüğünü gösterir. Bunları birbirleriyle eşleştirmek AFAIK, alet desteği olmayan manuel bir görevdir.
mihi

5

freeKomutun çıktısı ayrılmış çekirdek belleğini ve birkaç küçük biti saymaz. Bu tutarsızlığı 64 bit çekirdeğinde ve hatta <2GB RAM'de bile göreceksiniz.


2
Bu sadece birkaç küçük parça değil ...
Michael Hampton

Hayır, 8 bitlik bir baytta olduğu gibi kelimenin tam anlamıyla bit değil ... ama en fazla sadece onlarca MB. Yüzde olarak çok küçük.
John

Örnek olarak, VMware içinde RHEL 5.10 çalıştıran iki 64 bit sistemde, 2GB "fiziksel" RAM makinesi toplamda 2010 MB free, 4GB'lık bir makine 3948 MB gösterir.
John

1
Teşekkürler ... benimkinde çok büyük bir tutarsızlık gördüğüm için garip ama kulağa "normal" gelebilir.
Mike B

2
Hayır, bu "normal" değil - 800+ MB!
Michael Hampton

3

Fiziksel RAM haritanızdaki kritik çizgi şudur:

 BIOS-e820: 0000000100000000 - 0000000140000000 (usable)

Bu satır, sisteminizin fiziksel RAM'inin 1 GB (0x40000000 bayt, onaltılık) değerinin 4 GB sınırının üzerindeki BIOS tarafından eşlendiğini ve PAE'siz 32 bit sistem tarafından erişilemediğini gösterir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.