Чому команда “вільний” та “dmidecode” показують різні значення для оперативної пам’яті?


9

У мене є сервер CentOS 5.10 ( 32-бітний ), який працює на VMWare. На це виділено 4 ГБ оперативної пам’яті.

Якщо я біжу, 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але я вважав, що це потрібно лише для пам'яті, що перевищує 4 Гб.

Я знаю, що я пропускаю щось просте - може хтось, будь ласка, докладно?

Додаткові примітки / зауваження

Це, безумовно, схоже, що моє ядро ​​зберігає купу пам’яті для інших матеріалів. Ось що я бачу в /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

Відповіді:


18

З 32-розрядним ядром у вас є лише 4 ГБ доступного адресного простору . Частина цього адресного простору повинна використовуватись у своїх цілях (віртуальні чи фізичні) апаратні засоби в системі, такі як відеокарти, NIC тощо. Зазвичай це використання становить від 256 МБ до 1 ГБ залежно від обсягу адресного простору.

Оскільки цей адресний простір використовується апаратним забезпеченням, відповідна ОЗУ, як правило, недоступна для 32-бітної системи.

У вас є пара варіантів:

  1. Кращим варіантом є запуск 64-бітної операційної системи. Це різко розширює адресний простір, тому є достатньо місця для всієї оперативної пам’яті та обладнання. Він також порушує 32-бітний 32-розрядний ліміт додатків, зберігаючи можливість запускати 32-бітні програми. Загалом, будь-яка система з 2 ГБ більше оперативної пам’яті повинна мати 64-бітну ОС, щоб уникнути цих проблем.
  2. Інший варіант - запустити 32-бітове ядро ​​з включеним PAE. Це дозволить приховати оперативну пам’ять, але кожен процес все одно буде обмежений 2 ГБ / 3 ГБ адресного простору, залежно від деталей побудови ядра. Оскільки 64-бітні ОС будуть добре запускати 32-розрядні програми, це не має переваг і багатьох недоліків (наприклад, відсутність шляху оновлення).

Дякую. Це має сенс, але як я можу конкретно перевірити, скільки "приховано" / споживається обладнанням для інших цілей? Це було б під /proc/meminfo?
Майк Б

@MikeB Зокрема, я не впевнений, що це невпевнено, хоча очевидно, що десь близько 800 Мб втрачено.
Майкл Хемптон

Для мого початкового запитання я думаю, що на нього відповіли, але наступне питання - ЧОМУ? Схоже, є ще одна нитка, що висвітлює це ( unix.stackexchange.com/questions/97261/… ), тож я спробую ще раз перекопати і, можливо, виникнуть питання пізніше. Дякую!
Майк Б

Як професійні системні адміністратори, ми дбаємо про це, але лише до певного моменту - де і як це впливає на операції. Я думаю, я вирішив цей аспект.
Майкл Хемптон

2
@MikeB /proc/iomemпокаже вам пам'ять, яку використовують пристрої, на яких Linux має драйвер. Карта пам'яті e820 (на самому початку dmesgсвіжозавантаженого ядра) покаже вам, що ваш BIOS / EFI думає, які регіони зарезервовані. Зрівняти їх один проти одного - AFAIK - це ручне завдання без підтримки інструментів.
mihi

5

Вихід freeкоманди не враховує зарезервовану пам'ять ядра та кілька інших невеликих біт. Ви побачите цю невідповідність навіть у 64-бітному ядрі та навіть при <2 Гб оперативної пам’яті.


2
Це не лише кілька інших невеликих шматочків ...
Майкл Хемптон

Ну, ні, не буквально біти, як у 8-бітовій бай-байті ... але це всього лише кілька десятків МБ. Процентно, це дуже мало.
Джон

Як приклад, у двох 64-бітних системах, що працюють із RHEL 5.10 всередині VMware, 2-ГБ «фізична» оперативна пам’ять демонструє загальний обсяг 2010 МБ free, а машина 4 ГБ - 3948 МБ.
Джон

1
Дякую ... дивно, що я бачу таке велике розбіжність у моєму, але це здається, що це може бути "нормальним".
Майк Б

2
Ні, це не "нормально" - це 800+ МБ!
Майкл Хемптон

3

Критична лінія вашої фізичної карти ОЗУ:

 BIOS-e820: 0000000100000000 - 0000000140000000 (usable)

Цей рядок показує, що 1 Гб (0x40000000 байт, шістнадцятковий) фізичної оперативної пам’яті вашої системи відображається BIOS вище межі 4 ГБ, що робить її недоступною для 32-бітної системи без PAE.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.