我怎样才能找到适合shell脚本解析的linux盒子的总物理内存(RAM)?

时间:2013-12-03 10:02:54

标签: linux ram memory-size

我正在键入一个shell脚本来查找某些RHEL linux框中的总物理内存。

首先,我想强调一点,我对内核识别的总物理内存感兴趣,而不仅仅是可用内存。因此,请避免答案建议阅读 / proc / meminfo 或使用免费顶部 sar 命令 - 在所有这些情况下,它们的“总内存”值表示“可用内存”。

首先想到的是阅读启动内核消息:

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

但在某些Linux机箱中,由于在内核启动时使用了EMC2的PowerPath软件及其泛滥启动消息,因此无法获得有用的启动内核消息,即使在中也是如此/ var / log / dmesg 文件。

第二个选项是 dmidecode 命令(由于某些旧内核和架构的限制,我警告内核识别的RAM和实际RAM可能不匹配)。选项 - memory 简化了脚本,但我意识到该命令的旧版本没有 - memory 选项。

我的最后一次机会是 getconf 命令。它报告内存页面大小,但不报告物理页面总数 - _PHYS_PAGES 系统变量似乎是可用的物理页面,而不是总物理页面。

# getconf -a | grep PAGES
PAGESIZE                           4096
_AVPHYS_PAGES                      1049978
_PHYS_PAGES                        15466409

我的问题:是否有另一种获取物理内存总量的方法,适合由shell脚本解析?

13 个答案:

答案 0 :(得分:114)

你试过cat /proc/meminfo吗?然后你可以把你想要的东西, MemTotal 例如

更新示例(顺便说一句,谢谢,Masta):

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

答案 1 :(得分:48)

如果您对物理RAM感兴趣,请使用命令dmidecode。它为您提供了 lot 更多信息,但根据您的使用情况,您可能还想知道系统中的8G是来自2x4GB棒还是4x2GB棒。

答案 2 :(得分:48)

$string='bla bla xxx bla *xxx bla bla **xxx bla bla ***xxx bla bla ****xxx'; $search='xxx'; $preceding_character='*'; $array_of_strings = explode($search, $string); foreach ($array_of_strings as $key => $value) { if($value == end($array_of_strings)) break; $count_preceding_character = substr_count($value, $preceding_character); if($count_preceding_character % 2 == 0) { $array_of_strings[$key] = $value.$preceding_character; } } $final_string = implode($search, $array_of_strings); echo $final_string; 或免费为您提供服务器具有的确切RAM量。这不是"可用内存"。

我猜你的问题出现了,当你有一台虚拟机而你想计算虚拟机管理程序托管的全部内存量时,你必须在这种情况下登录虚拟机管理程序。

cat /proc/meminfo | grep MemTotal

相当于

cat /proc/meminfo | grep MemTotal

答案 3 :(得分:15)

添加/proc/meminfo的最后两个条目,它们会为您提供主机上的确切内存。

示例:

DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB

10240 + 4184064 = 4194304 kB = 4096 MB。

答案 4 :(得分:14)

一个更有用的命令:
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/

答案 5 :(得分:11)

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

这将以人类可读的格式为您提供系统中的总内存,并自动缩放到适当的单位(例如字节,KB,MB或GB)。

答案 6 :(得分:6)

dmidecode -t 17 | grep  Size:

添加“尺寸:”之后显示的所有上述值将给出服务器中所有RAM棒的精确总物理尺寸。

答案 7 :(得分:2)

Mb中的总内存:

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

或:

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

答案 8 :(得分:1)

以下是:

<强> 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*/

   .

   . 

  }; 

答案 9 :(得分:0)

在线总内存

使用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 GB系统的示例输出:

4294967296 bytes
4 GB

说明

  

/ sys / devices / system / memory / block_size_bytes

内存块中的字节数(十六进制值)。在值前面使用0x可以确保在计算过程中正确处理了该值。

  

/ sys / devices / system /内存/内存*

遍历所有可用的内存块以验证它们是否处于联机状态,如果存在,则将计算出的块大小添加到totalmem中。

  

[[“ $(cat $ {mem} / online)” ==“ 1”]] &&

如果您喜欢其他内存状态,则可以更改或删除它。

答案 10 :(得分:0)

在Linux内核中,当前页面是内核可以看到的RAM的物理页面。从字面上看,当前页面是以4KB为单位的RAM的总大小。

grep present /proc/zoneinfo | awk '{sum+=$2}END{print sum*4,"KB"}'

'MemTotal'格式/ proc / meminfo是伙伴系统管理的内存总大小,我们也可以这样计算:

grep managed /proc/zoneinfo | awk '{sum+=$2}END{print sum*4,"KB"}'

答案 11 :(得分:0)

我知道这个问题是很久以前提出的,但是我想提供另一种方法来解决这个问题,我发现它对我刚解决的问题很有用:

lshw -c memory

lshw

lshw是提取有关机器硬件配置的详细信息的小工具。它可以报告具有DMI功能的x86或IA-64系统以及某些PowerPC机器上确切的内存配置,固件版本,主板配置,CPU版本和速度,缓存配置,总线速度等(已知PowerMac G4可以工作)。

答案 12 :(得分:-7)

我发现htop是一个有用的工具。

  

sudo apt-get install htop

然后

  

free -m

将提供您需要的信息。