Как я могу узнать общую физическую память (ОЗУ) моего linux box, подходящую для анализа скриптом оболочки?
Я набираю сценарий оболочки, чтобы узнать общую физическую память в некоторых коробках RHEL linux.
прежде всего я хочу подчеркнуть, что меня интересует физической распознается ядром, а не только память. Поэтому, пожалуйста, избегайте ответов, предлагающих читать / proc / meminfo или свободный, top или sar команды -- во всех этих случаях "общий память!--6-->" значения "память" те.
первой мыслью было прочитать сообщения ядра загрузки:
Memory: 61861540k/63438844k available (2577k kernel code, 1042516k reserved, 1305k data, 212k init)
но в некоторых Linux-боксах из-за использования программного обеспечения PowerPath EMC2 и его флуд загрузочные сообщения при запуске ядра, что полезное сообщение ядра загрузки недоступно, даже в /var/log / dmesg.
второй вариант dmidecode (Я предупрежден о возможном несоответствии ядра признанной ОЗУ и реальной ОЗУ из-за ограничений некоторых старых ядер и архитектур). Вариант -- упрощает скрипт, но я понял, что старые версии этой команды нет --.
мой последний шанс был getconf. Он сообщает размер страницы памяти, но не общее количество физических страниц -_PHYS_PAGES системная переменная будьте доступными физическими страницами, а не общими физическими страницами.
# getconf -a | grep PAGES PAGESIZE 4096 _AVPHYS_PAGES 1049978 _PHYS_PAGES 15466409
мой вопрос: есть ли другой способ получить общий объем физической памяти, подходящий для анализа скриптом оболочки?
10 ответов
Если вас интересует физическая ОЗУ, используйте команду dmidecode
. Это дает вам много больше информации, чем просто это, но в зависимости от вашего случая использования, вы также можете узнать, если 8G в системе приходят от 2x4gb палочки или 4x2gb палочки.
ты пробовал cat /proc/meminfo
? Затем вы можете grep, что вы хотите,используется параметр memtotal например
обновленный пример (кстати. спасибо, Маста):
awk '/MemTotal/ {print }' /proc/meminfo
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"}'
добавить последние 2 записи /proc/meminfo
, они дадут вам точную память на хосте.
пример:
DirectMap4k: 10240 kB
DirectMap2M: 4184064 kB
10240 + 4184064 = 4194304 КБ = 4096 МБ.
еще одна полезная команда: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/
free -h | awk '/Mem\:/ { print }'
это предоставит вам общую память в вашей системе в удобочитаемом формате и автоматически масштабируется до соответствующего блока (например, байты, КБ, Мб или ГБ).
dmidecode -t 17 | grep Size:
добавление всех вышеуказанных значений, отображаемых после " Size:", даст точный общий физический размер всех RAM-палочек на сервере.
общий объем Mb
:
x=$(awk '/MemTotal/ {print }' /proc/meminfo)
echo $((x/1024))
или:
x=$(awk '/MemTotal/ {print }' /proc/meminfo) ; echo $((x/1024))
это способы :
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);
структура программы sysinfo { .
.
unsigned long totalram; /*Total memory size to use */
unsigned long freeram; /* Available memory size*/
.
.
};