Как я могу узнать общую физическую память (ОЗУ) моего 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*/
.
.
};