Как я могу узнать общую физическую память (RAM) моего Linux-бокса, подходящую для анализа с помощью сценария оболочки?

123

Я набираю сценарий оболочки, чтобы узнать общую физическую память в некоторых окнах RHEL linux.

Прежде всего, я хочу подчеркнуть, что меня интересует общая физическая память, распознаваемая ядром, а не только доступная память . Поэтому, пожалуйста, избегайте ответов, предлагающих прочитать / proc / meminfo или использовать команды free , top или sar - во всех этих случаях их значения « общая память » означают значения « доступная память ».

Первой мыслью было прочитать сообщения загрузочного ядра:

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

Но в некоторых Linux-системах из-за использования программного обеспечения EMC2 PowerPath и его лавинных загрузочных сообщений при запуске ядра это полезное загрузочное сообщение ядра недоступно, даже в файле / var / log / dmesg .

Второй вариант - это команда dmidecode (меня предупреждают о возможном несоответствии ОЗУ, распознаваемой ядром, и реальной ОЗУ из-за ограничений некоторых старых ядер и архитектур). Параметр --memory упрощает сценарий, но я понял, что более старые версии этой команды не имеют параметра --memory .

Моим последним шансом была команда getconf . Он сообщает размер страницы памяти, но не общее количество физических страниц - системная переменная _PHYS_PAGES кажется доступными физическими страницами, а не общим количеством физических страниц.

# getconf -a | grep PAGES
РАЗМЕР СТРАНИЦЫ 4096
_AVPHYS_PAGES 1049978
_PHYS_PAGES 15466409

Мой вопрос: есть ли другой способ получить общий объем физической памяти, пригодный для анализа с помощью сценария оболочки?

Jdamian
источник
3
Это должно быть перенесено на linux и unix
Kolob Canyon

Ответы:

56

Если вас интересует физическая оперативная память, используйте команду dmidecode. Он дает вам гораздо больше информации, чем просто это, но в зависимости от вашего варианта использования вы также можете узнать, идет ли 8G в системе от флешек 2x4 ГБ или 4x2GB.

Dummy00001
источник
19
Мне это понадобилось недавно, и у меня есть простая команда, чтобы получить общий объем памяти всех модулей памяти в системе: dmidecode -t 17 | grep "Размер. * МБ" | awk '{s + = $ 2} END {print s / 1024}'
Jonesinator
6
В отличие от других ответов, dmidecode требует привилегий root .
chus
1
Это дает мне эту ошибку # dmidecode 3.0 / sys / firmware / dmi / tables / smbios_entry_point: Permission denied Scanning / dev / mem for entry point. / DEV / MEM: Доступ запрещен
Vvb
128

Вы пробовали cat /proc/meminfo? Затем вы можете использовать awk или grep , что хотите, MemTotal, например

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

или

cat /proc/meminfo | grep MemTotal
Alex
источник
8
Но MemTotal - это не общая физическая память - см. Страницу руководства по proc (5)
Крис Стрэттон
2
@ChrisStratton: можешь быть более откровенным? Для большинства практических намерений и целей этого ответа может быть достаточно.
Дэн Даскалеску
13
awk '/MemTotal/ {print $2}' /proc/meminfo Чем меньше трубок, тем лучше.
маста
3
Совершенно самоуверенная альтернатива: по возможности избегайте awk. Regex / PCRE - гораздо более универсальный язык сопоставления с образцом (то есть вы также можете использовать его в Python или Perl). Если вы изучаете awk, все, что у вас уже есть, - это awk. Если вы воспользуетесь grep + PCRE с другой стороны ... grep -oP '^MemTotal:\s+\K.*' /proc/meminfo
Габриэль Тотусек
5
@GabrielBurkholder есть также мнение противоположное: awkстандартизован POSIX , но grep«s варианты -oи -Pне являются! Ваш пример будет нормально работать с GNU grep(но GNU по-прежнему говорит, что реализация PCRE является экспериментальной), но, вероятно, не будет работать с другими реализациями.
pabouk
48

cat /proc/meminfo | grep MemTotalили бесплатно дает вам точный объем оперативной памяти, имеющейся на вашем сервере. Это не «доступная память».

Я предполагаю, что ваша проблема возникает, когда у вас есть виртуальная машина, и вы хотите рассчитать полный объем памяти, размещенной на гипервизоре, но в этом случае вам придется войти в гипервизор.

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
В моем физическом ящике с cat /proc/meminfo | grep MemTotalотчетами MemTotal: 3957032 kBо 4 ГБ памяти это немного меньше 4 ГБ. OP (и я) ищут что-то, что сообщало бы о 4 ГБ.
TvE,
1
Более прямой способ сделать это простоgrep MemTotal /proc/meminfo
Дэн Пассаро
3
@TvE 3957032 kBпросто неправильно маркирован. Он должен быть помечен как kiB, как указано в этом сообщении . Это означает, что на самом деле он сообщает 4 052 000 768 байт, что немного больше 4 ГБ. Это связано с тем, что реализации / proc / meminfo предшествуют нотации kiB.
Jeff G
4
@JeffG Я думаю, вы упустили то, о чем говорил Стив Toolmaker. Ожидаемое значение - 4 ГБ, а не 4 ГБ, и TvE просто неверно цитирует значение. ToolmakerSteve прав в том, что «4 ГБ» ОЗУ следует интерпретировать как «4 ГБ» в комментарии TvE, и, следовательно, это значение, с которым мы сравниваем. Вы правы, что значение больше 4 ГБ, точно так же, как оно также больше 2 ГБ и 2 ГБ и меньше 6 ГБ и 6 ГБ, но здесь важно то, как оно сравнивается с 4 ГБ, так кого волнует, как оно сравнивается с другими показателями? Так что да, ваше утверждение верно, но оно также не имеет значения.
Тим
1
@Tim Я предоставил только фактическую точную информацию с подтверждающей документацией, которая ответила на заданный вопрос. Учитывая, что для поиска потребовался более чем тривиальный поиск, я думаю, что тот факт, что /proc/meminfoчисла в отчетах в kiB являются чрезвычайно важной частью этого обсуждения, независимо от того, собирался ли @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
ПРИМЕЧАНИЕ. Даже если ОС TvE сообщает в единицах 1024 байта, его общее количество 4103800 x 1024 меньше 4 ГиБ (что было бы 4194304 x 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дает информацию о пространстве подкачки.
Следующая ссылка может быть вам полезна:
http://www.linuxnix.com/find-ram-details-in-linuxunix/

Йогеш Джилхавар
источник
1
Это хорошее простое решение, если вы хотите, чтобы результат в мегабайтах был удобнее для глаз,vmstat -s -S M | grep ' memory'
Оливер Данжи,
17
free -h | awk '/Mem\:/ { print $2 }' 

Это предоставит вам общий объем памяти в вашей системе в удобочитаемом формате и автоматически масштабируется до соответствующих единиц (например, байтов, КБ, МБ или ГБ).

JayEek
источник
Именно то, что я искал!
Томас Гонсалес,
10
dmidecode -t 17 | grep  Size:

Добавление всех вышеуказанных значений, отображаемых после «Size:», даст точный общий физический размер всех модулей RAM на сервере.

Рагху Ни
источник
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

объяснение

/ системы / устройства / системы / память / block_size_bytes

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

/ SYS / устройства / системы / память / память *

Перебор всех доступных блоков памяти, чтобы убедиться, что они подключены к сети, и прибавить рассчитанный размер блока к totalmem, если они есть.

[["$ (cat $ {mem} / online)" == "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 * информация);

struct sysinfo {.

   .

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

   unsigned long freeram;   /* Available memory size*/

   .

   . 

  }; 
Sandeep_black
источник
cat / proc / meminfo работает у меня в моей встроенной системе
webbertiger
-7

Нахожу htopполезный инструмент.

sudo apt-get install htop

а потом

бесплатно -m

предоставит вам необходимую информацию.

Sathyam
источник