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

Jda*_*ian 116 linux ram memory-size

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

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

首先想到的是读取引导内核消息:

Memory: 61861540k/63438844k available (2577k kernel code, 1042516k reserved, 1305k data, 212k init)
Run Code Online (Sandbox Code Playgroud)

但是在某些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脚本解析?

Rob*_*ert 121

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

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

awk '/MemTotal/ {print $2}' /proc/meminfo
Run Code Online (Sandbox Code Playgroud)

  • `awk'/ MemTotal/{print $ 2}'/ proc/meminfo`管道越少越好. (13认同)
  • 但MemTotal不是总物理内存 - 请参阅proc(5)的手册页 (5认同)
  • @GabrielBurkholder还有一个相反的观点:`awk`是由POSIX标准化的,但`grep`的选项`-o`和`-P`不是!你的例子适用于GNU`grep`(但GNU仍然说PCRE实现是实验性的)但它可能不适用于其他实现. (5认同)
  • 高度自以为是的选择:尽可能避免使用awk.Regex/PCRE是一种更通用的模式匹配语言(即您也可以在Python或Perl中使用它).如果你学习awk,那么你已经是awk了.另一方面,如果你依靠grep + PCRE ......```grep -oP'^ MemTotal:\ s +\K.*'/ proc/meminfo``` (3认同)
  • @ChrisStratton:你能更明确吗?对于大多数实际意图和目的,这个答案可能就足够了. (2认同)

小智 53

如果您对物理RAM感兴趣,请使用该命令dmidecode.它给你一个很大的不仅仅是更多的信息,但根据您的使用情况下,你可能也想知道,如果8G系统来自2x4GB棒或4x2GB棒.

  • 我最近需要这个,并且有一个简单的命令来获取系统上所有内存模块的总内存大小:dmidecode -t 17 | grep"大小.*MB"| awk'{s + = $ 2} END {print s/1024}' (18认同)
  • 与其他答案不同,[dmidecode需要root权限](http://unix.stackexchange.com/questions/24212/how-to-get-dmidecode-information-without-root-privileges). (6认同)

小智 48

cat /proc/meminfo | grep MemTotal或免费为您提供服务器具有的确切RAM量.这不是"可用内存".

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

cat /proc/meminfo | grep MemTotal
Run Code Online (Sandbox Code Playgroud)

相当于

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

  • 在我的4GB内存`cat/proc/meminfo |的物理盒子上 grep MemTotal`报告`MemTotal:3957032 kB`,相当于4GB.OP(和我)正在寻找能报告4GB的东西. (4认同)
  • @TvE`3957032 kB`只是贴错了标签.它应该标记为kiB,如[this post](https://ubuntuforums.org/showthread.php?t=1165076)所示.这意味着它实际报告4,052,000,768字节,略大于4 GB.这是因为/ proc/meminfo实现早于kiB表示法. (3认同)
  • @JeffG我想你错过了ToolmakerSteve的观点.预期值为4GiB,而不是4GB,而TvE只是错误地引用该值.ToolmakerSteve是正确的,在TvE的评论中,"4 GB"的RAM应该被解释为"4 GiB",因此这是我们比较的值.你的价值大于4GB是正确的,就像它还大于2GB和2GiB以及小于6GB和6GiB一样,但重要的是它与4GiB相比如何,那么谁在乎它与其他措施的比较呢?所以是的,你的陈述是正确的,但它也无关紧要. (3认同)
  • 更直接的方法是 `grep MemTotal /proc/meminfo` (2认同)

Yog*_*war 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
Run Code Online (Sandbox Code Playgroud)

获取内存信息的另一个有用命令是:
free
示例输出是:

             total       used       free     shared    buffers     cached
Mem:       2050060    1093324     956736        108     385392     386812
-/+ buffers/cache:     321120    1728940
Swap:      2095100       2732    2092368
Run Code Online (Sandbox Code Playgroud)

这里有一个观察是,该命令还free提供有关交换空间的信息.
以下链接可能对您有用:http:
//www.linuxnix.com/find-ram-details-in-linuxunix/


小智 15

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

例:

DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB
Run Code Online (Sandbox Code Playgroud)

10240 + 4184064 = 4194304 kB = 4096 MB.

  • 除了使用需要root的dmidecode之外,这里有最佳答案.但DirectMap并不总是准确的.我有一个4GB的服务器,它说:`DirectMap4k:110200 kB DirectMap2M:3993600 kB`那是4007MB,而不是4096MB ...... (2认同)
  • 更新:当我在同一台机器上的不同内核版本(linux-3.18.28、linux-4.13-rc6)之间移动时,这个总和略有不同。 (2认同)

小智 14

free -h | awk '/Mem\:/ { print $2 }' 
Run Code Online (Sandbox Code Playgroud)

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


小智 7

dmidecode -t 17 | grep  Size:
Run Code Online (Sandbox Code Playgroud)

添加"Size:"之后显示的所有上述值将给出服务器中所有RAM棒的精确总物理大小.


And*_*dré 6

总在线内存

使用 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
Run Code Online (Sandbox Code Playgroud)

4 GB 系统的输出示例:

4294967296 bytes
4 GB
Run Code Online (Sandbox Code Playgroud)

解释

/sys/devices/系统/内存/block_size_bytes

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

/sys/设备/系统/内存/内存*

迭代所有可用内存块以验证它们是否在线,并将计算出的块大小添加到totalmem(如果在线)。

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

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


jaq*_*que 0

使用lsmem

lsmem -b --summary=only | sed -ne '/online/s/.* //p'
Run Code Online (Sandbox Code Playgroud)

返回物理在线内存(以字节为单位)。如果没有,-b将返回人类可读的值。

lsmem在 RPM 中提供util-linux(已在 CentOS 7、UBI 7、UBI 8 和 UBI 9 上验证),它是 systemd 的直接或间接依赖项。您应该能够lsmem在任何基于 systemd 的 RHEL 系统上找到该实用程序。