Як я можу дізнатись загальну фізичну пам'ять (оперативну пам’ять) мого linux box-придатного для розбору сценарію оболонки?


123

Я набираю скрипт оболонки, щоб дізнатися загальну фізичну пам’ять у деяких полях Linux RHEL.

Перш за все, хочу наголосити, що мене цікавить загальна фізична пам'ять, розпізнавана ядром, а не лише наявна пам'ять . Тому, будь ласка, остерігайтеся відповіді передбачають читати / Proc / MemInfo або використовувати вільні , зверху або Sar команди - У всіх цих випадках, їх « спільна пам'ять значення» означають « доступна пам'ять » з них.

Перша думка полягала в тому, щоб прочитати повідомлення ядра завантажувача:

Memory: 61861540k/63438844k available (2577k kernel code, 1042516k reserved, 1305k data, 212k init)

Але в деяких Лінукс коробки, з - за використання PowerPath програмного забезпечення EMC2 і його затоплення завантаження повідомлень в запуску ядра, що корисно повідомлення завантаження ядра не доступна, навіть не в / / журнал / dmesg вар файл.

Другим варіантом була команда dmidecode (я попереджаю про можливу невідповідність ядра, що розпізнається ядром, і реальної оперативної пам’яті через обмеження деяких старих ядер та архітектур). Опція --ememory спрощує сценарій, але я зрозумів, що в старих випусках цієї команди немає - можливості пам'яті .

Мій останній шанс - команда getconf . Він повідомляє про розмір сторінки пам'яті, але не про загальну кількість фізичних сторінок - системна змінна _PHYS_PAGES видається доступною фізичною сторінкою, а не загальною фізичною сторінкою.

# getconf -a | grep PAGES
СТОРІНКА 4096
_AVPHYS_PAGES 1049978
_PHYS_PAGES 15466409

Моє запитання: Чи є інший спосіб отримати загальний обсяг фізичної пам'яті, підходящий для розбору сценарію оболонки?


3
Це потрібно перенести на linux & unix
Колоб Каньйон

Відповіді:


56

Якщо вас цікавить фізична оперативна пам’ять, використовуйте команду dmidecode. Це дає вам набагато більше інформації, ніж просто це, але залежно від вашого випадку використання, ви також можете дізнатися, чи є 8G в системі паличками 2x4GB або паличками 4x2GB.


19
Мені це було потрібно нещодавно і маю просту команду, щоб отримати загальний об'єм пам'яті всіх модулів пам'яті в системі: dmidecode -t 17 | grep "Розмір. * МБ" | awk '{s + = $ 2} END {print s / 1024}'
Jonesinator

6
На відміну від інших відповідей, dmidecode вимагає привілеїв root .
chus

1
Це дає мені помилку # dmidecode 3.0 / sys / firmware / dmi / table / smbios_entry_point: У дозволі відхилено сканування / dev / mem для точки входу. / dev / mem: Дозвіл відхилено
VVB

128

Ви пробували cat /proc/meminfo? Ви можете AWK або Grep , що ви хочете, MemTotal наприклад ,

awk '/MemTotal/ {print $2}' /proc/meminfo

або

cat /proc/meminfo | grep MemTotal

8
Але MemTotal - це не загальна фізична пам'ять. Перегляньте сторінку чоловіка для proc (5)
Chris Stratton

2
@ChrisStratton: чи можете ви бути більш чіткими? Для більшості практичних намірів і цілей ця відповідь може бути достатньою.
Дан Даскалеску

13
awk '/MemTotal/ {print $2}' /proc/meminfo Чим менше труб, тим краще.
маста

3
Дуже впевнена альтернатива: уникайте диваків, коли зможете. Regex / PCRE є набагато більш універсальною мовою відповідності шаблонів (тобто ви можете використовувати її також у Python або Perl). Якщо ти навчишся awk, все, що ти вже маєш, - awk. Якщо ви нахилите grep + PCRE з іншого боку ... grep -oP '^MemTotal:\s+\K.*' /proc/meminfo
Габріель Тотусек

5
@GabrielBurkholder також існує протилежна точка зору: awkстандартизована за POSIX, але grepце варіанти -oта -Pне є! Ваш приклад буде добре працювати з GNU grep(але GNU все ще говорить, що реалізація PCRE експериментальна), але, ймовірно, не буде працювати з іншими реалізаціями.
пабук

48

cat /proc/meminfo | grep MemTotalабо безкоштовно дає точну кількість оперативної пам’яті, яку має ваш сервер. Це не "доступна пам'ять".

Я думаю, що проблема виникла, коли у вас є VM, і ви хочете обчислити повний об'єм пам'яті, розміщений гіпервізором, але в цьому випадку вам доведеться увійти до гіпервізора.

cat /proc/meminfo | grep MemTotal

еквівалентно

 getconf -a | grep PAGES | awk 'BEGIN {total = 1} {if (NR == 1 || NR == 3) total *=$NF} END {print total / 1024" kB"}'

5
У моїй фізичній коробці з 4 Гб пам’яті cat /proc/meminfo | grep MemTotalзвітів MemTotal: 3957032 kB, це зовсім трохи менше 4 Гб. ОП (і я) шукають щось, що могло б повідомити про 4 Гб.
ТВ

1
Більш прямий спосіб зробити це простоgrep MemTotal /proc/meminfo
Дан Пассаро

3
@TvE 3957032 kBпросто неправильно позначений. Він повинен мати позначення kiB, як зазначено в цій публікації . Це означає, що він справді повідомляє про 4 052 000 768 байт, що трохи більше 4 ГБ. Це пов’язано з тим, що реалізація / proc / meminfo передує позначення kiB.
Jeff G

4
@JeffG Я думаю, що ти пропустив точку догляду ToolmakerSteve. Очікуване значення - 4GiB, а не 4GB, а TvE просто неправильно вводить значення. ToolmakerSteve вірно, що "4 ГБ" оперативної пам'яті слід тлумачити як "4 Гб" в коментарі TvE, і тому це значення, з яким ми порівнюємо. Ви маєте рацію, що значення перевищує 4 Гб, як і більше 2 ГБ і 2 Гбіт і менше 6 ГБ і 6 Гбіт, але що тут важливо, як воно порівнюється з 4 ГбіБ, тож кого цікавить, як воно порівнюється з іншими заходами? Так, так, ваше твердження правильне, але воно також не має значення.
Тім

1
@Tim Я надав лише фактично достовірну інформацію, яка підтримує документацію, яка відповіла на поставлене запитання. Зважаючи на те, що для пошуку знадобилося більше, ніж тривіального пошуку, я вважаю, що факт, що /proc/meminfoповідомляє про цифри в кіБ, є надзвичайно важливою частиною цієї дискусії, незалежно від того, чи хотів @TvE задати інше питання.
Джефф Г

19

Додайте останні 2 записи /proc/meminfo, вони дають вам точну пам'ять, присутню на хості.

Приклад:

DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB

10240 + 4184064 = 4194304 кБ = 4096 МБ.


3
Тут найкраща відповідь, крім використання dmidecode, для якого потрібен root. Але DirectMap не завжди є точним. У мене є сервер з 4 Гб, і він говорить: `DirectMap4k: 110200 кБ DirectMap2M: 3993600 кБ` Це 4007 МБ, а не
4096 МБ

ПРИМІТКА. Навіть якщо ОС TvE звітує в одиницях 1024 байтів, його загальна 4103800 х 1024 не перевищує 4 ГБ (що було б 4194304 х 1024).
ToolmakerSteve

Також доступний не для всіх версій Linux. Мій вікно Centos5 (так, я знаю) не повідомляє про це.
Том Куарендон

Для запису вони присутні лише на x86. Причина цього працює в тому, що саме ці записи враховують кількість пам'яті, представлену 4k, 2M, 1G сторінками в TLB, яка повинна охоплювати всю пам'ять, доступну для ядра .
kevmitch

1
ОНОВЛЕННЯ: Ця сума незначно змінюється, коли я переміщуюсь між різними версіями ядра (linux-3.18.28, linux-4.13-rc6) на одній машині.
kevmitch

17

Ще одна корисна команда:
vmstat -s | grep memory
зразок виводу на моїй машині:

  2050060 K total memory
  1092992 K used memory
   743072 K active memory
   177084 K inactive memory
   957068 K free memory
   385388 K buffer memory

Ще одна корисна команда для отримання інформації про пам'ять:
free
вибірка зразка:

             total       used       free     shared    buffers     cached
Mem:       2050060    1093324     956736        108     385392     386812
-/+ buffers/cache:     321120    1728940
Swap:      2095100       2732    2092368

Одне зауваження тут полягає в тому, що команда також freeдає інформацію про swap space.
Наступне посилання може бути корисним для вас:
http://www.linuxnix.com/find-ram-details-in-linuxunix/


1
Це приємне просте рішення, якщо ви хочете, щоб ваш вихід у Мегабайти полегшив окоvmstat -s -S M | grep ' memory'
Олівер Данге,

17
free -h | awk '/Mem\:/ { print $2 }' 

Це забезпечить вам загальну пам'ять у вашій системі у читаному для людини форматі та автоматично масштабує відповідний блок (наприклад, байти, КБ, МБ або ГБ).


Тільки те, що я шукав!
Томаш Гонсалес

10
dmidecode -t 17 | grep  Size:

Додавання всіх вище значень, відображених після "Розмір:", дасть точний загальний фізичний розмір усіх палиць ОЗУ на сервері.


2

Загальна онлайн-пам'ять

Обчисліть загальну онлайн-пам’ять за допомогою sys-fs.

totalmem=0;
for mem in /sys/devices/system/memory/memory*; do
  [[ "$(cat ${mem}/online)" == "1" ]] \
    && totalmem=$((totalmem+$((0x$(cat /sys/devices/system/memory/block_size_bytes)))));
done

#one-line code
totalmem=0; for mem in /sys/devices/system/memory/memory*; do [[ "$(cat ${mem}/online)" == "1" ]] && totalmem=$((totalmem+$((0x$(cat /sys/devices/system/memory/block_size_bytes))))); done

echo ${totalmem} bytes
echo $((totalmem/1024**3)) GB

Приклад виводу для системи 4 Гб:

4294967296 bytes
4 GB

Пояснення

/ sys / пристрої / система / пам'ять / block_size_bytes

Кількість байтів у блоці пам'яті (шістнадцяткове значення). Використання 0x перед значенням гарантує, що воно правильно обробляється під час обчислення.

/ sys / пристрої / система / пам'ять / пам'ять *

Ітерація над усіма доступними блоками пам'яті, щоб переконатися, що вони в мережі, і додати обчислений розмір блоку до totalmem, якщо вони є.

[["$ (cat $ {mem} / онлайн)" == "1"]] &&

Ви можете змінити або видалити це, якщо ви бажаєте іншого стану пам'яті.


Я перевірю ваше рішення, як тільки зможу.
Jdamian

порада bash: у вашому коді не потрібно використовувати нахильний знак ( \) для продовження в наступному рядку - насправді ви можете використовувати &&для цього цілі в кінці рядка.
Jdamian

1

Загальна пам'ять у Mb:

x=$(awk '/MemTotal/ {print $2}' /proc/meminfo)
echo $((x/1024))

або:

x=$(awk '/MemTotal/ {print $2}' /proc/meminfo) ; echo $((x/1024))

0

Це способи:

1. / proc / meminfo

MemTotal: 8152200 kB

MemFree: 760808 kB

Ви можете написати код або сценарій для розбору.

2. Використовуйте sysconf, використовуючи макроси нижче

sysconf (_SC_PHYS_PAGES) * sysconf (_SC_PAGESIZE);

3. За допомогою системного виклику sysinfo

int sysinfo (struct sysinfo * info);

struct sysinfo {.

   .

   unsigned long totalram;  /*Total memory size to use */

   unsigned long freeram;   /* Available memory size*/

   .

   . 

  }; 

cat / proc / meminfo працює для мене на моїй вбудованій системі
webbertiger

-7

Я знаходжу htopкорисний інструмент.

sudo apt-get install htop

і потім

вільний -м

дасть необхідну інформацію.

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