Dlaczego polecenie „free” i „dmidecode” pokazują różne wartości pamięci RAM?


9

Mam serwer CentOS 5.10 ( 32-bitowy ) działający na VMWare. Przydzielono 4 GB pamięci RAM.

Jeśli uruchomię dmidecode -t 17 | grep Size | grep MB, zobaczę:

Size: 4096 MB

Jednak kiedy biegnę free, widzę:

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

Dlaczego istnieje rozbieżność między całkowitą ilością freeraportów pamięci a danymi dmidecodewyjściowymi?

Jądro, które uruchamiam to:

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

Wprawdzie jądro nie działa, PAEale pomyślałem, że jest to konieczne tylko w przypadku pamięci przekraczającej 4 GB.

Wiem, że brakuje mi czegoś prostego - czy ktoś mógłby wyjaśnić?

Dodatkowe uwagi / spostrzeżenia

Zdecydowanie wygląda na to, że moje jądro rezerwuje sporo pamięci na inne rzeczy. Oto co widzę w /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

Odpowiedzi:


18

W przypadku jądra 32-bitowego masz tylko 4 GB dostępnej przestrzeni adresowej . Część tej przestrzeni adresowej musi być wykorzystywana przez (wirtualny lub fizyczny) sprzęt w systemie, taki jak karty graficzne, karty sieciowe itp., Do własnych celów. To użycie wynosi zwykle między 256 MB-1 GB, w zależności od tego, ile przestrzeni adresowej potrzebuje dany sprzęt.

Ponieważ ta przestrzeń adresowa jest używana przez sprzęt, odpowiednia pamięć RAM jest ogólnie niedostępna dla systemu 32-bitowego.

Masz kilka opcji:

  1. Preferowaną opcją jest uruchomienie 64-bitowego systemu operacyjnego. To dramatycznie zwiększa przestrzeń adresową, więc jest dużo miejsca na całą pamięć RAM i sprzęt. Łamie również limit 32 GB na aplikacje 2 GB / 3 GB, zachowując jednocześnie możliwość uruchamiania programów 32-bitowych. Ogólnie rzecz biorąc, każdy system z 2 GB więcej pamięci RAM powinien mieć 64-bitowy system operacyjny, aby uniknąć tych problemów.
  2. Inną opcją jest uruchomienie 32-bitowego jądra z włączonym PAE. Spowoduje to odsłonięcie pamięci RAM, ale każdy proces będzie nadal ograniczony do 2 GB / 3 GB przestrzeni adresowej, w zależności od szczegółów budowy jądra. Ponieważ 64-bitowe systemy operacyjne będą doskonale działać z 32-bitowymi aplikacjami, nie ma to żadnych zalet i wielu wad (takich jak brak ścieżki aktualizacji).

Dzięki. Ma to sens, ale jak mogę dokładnie sprawdzić, ile jest „ukryte” / zużywane przez sprzęt do innych celów? Czy to byłoby poniżej /proc/meminfo?
— Mike B

@MikeB W szczególności nie jestem pewien, czy to od razu, choć oczywiste jest, że utracono około 800 MB.
— Michael Hampton

Na potrzeby mojego pierwszego pytania, wydaje mi się, że udzielono na nie odpowiedzi, ale następne pytanie brzmi „DLACZEGO?”. Wygląda na to, że jest w tym inny wątek ( unix.stackexchange.com/questions/97261/... ), więc spróbuję wykopać więcej i mogę mieć pytania później. Dzięki!
— Mike B

Jako profesjonalni administratorzy systemów dbamy o to, ale tylko do pewnego momentu - gdzie i jak wpływa to na operacje. Myślę, że zająłem się tym aspektem.
— Michael Hampton

2
@MikeB /proc/iomempokaże pamięć używaną przez urządzenia, dla których Linux ma sterownik. Mapa pamięci e820 (na samym początku dmesgświeżo uruchomionego jądra) pokaże ci, co myśli twój BIOS / EFI, które regiony są zarezerwowane. Dopasowywanie ich do siebie jest AFAIK ręcznym zadaniem bez wsparcia narzędziowego.
— mihi

5

Dane wyjściowe freepolecenia nie liczą zarezerwowanej pamięci jądra i kilku innych małych bitów. Zobaczysz tę rozbieżność nawet w 64-bitowym jądrze, a nawet z <2 GB pamięci RAM.


2
To nie tylko kilka innych drobiazgów ...
— Michael Hampton

Cóż, nie, nie dosłownie bitów, jak w przypadku 8-bit-make-a-byte ... ale to tylko kilkadziesiąt MB. Pod względem procentowym jest bardzo mały.
— Jan

Jako przykład, w dwóch 64-bitowych systemach z RHEL 5.10 w VMware, „fizyczna” pamięć RAM o pojemności 2 GB pokazuje w sumie 2010 MB free, a maszyna o pojemności 4 GB - 3948 MB.
— John

1
Dzięki ... dziwne, że widzę tak dużą rozbieżność w mojej, ale wygląda na to, że to może być „normalne”.
— Mike B

2
Nie, to nie jest „normalne” - to ponad 800 MB!
— Michael Hampton

3

Linia krytyczna z twojej fizycznej mapy RAM jest następująca:

 BIOS-e820: 0000000100000000 - 0000000140000000 (usable)

Ta linia pokazuje, że 1 GB (0x40000000 bajtów, szesnastkowo) fizycznej pamięci RAM systemu jest mapowany przez BIOS powyżej limitu 4 GB, co czyni go niedostępnym dla systemu 32-bitowego bez PAE.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.