我如何找出适合由shell脚本解析的linux盒的总物理内存(RAM)?


123

我正在键入一个shell脚本,以找出某些RHEL linux盒中的总物理内存。

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

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

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页面
页大小4096
_AVPHYS_PAGES 1049978
_PHYS_PAGES 15466409

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


3
应该将其迁移到linux&unix
Kolob Canyon

Answers:


56

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


19
我最近需要这个,并且有一个简单的命令来获取系统上所有内存模块的总内存大小:dmidecode -t 17 | grep“ Size。* MB” | awk'{s + = $ 2} END {print s / 1024}'
Jonesinator 2014年

6
与其他答案不同,dmidecode需要root特权
朱姓

1
它给我这个错误#dmidecode 3.0 / sys / firmware / dmi / tables / smbios_entry_point:权限被拒绝扫描/ dev / mem作为入口点。/ dev / mem:权限被拒绝
-VVB

128

你试过了cat /proc/meminfo吗?然后,您可以awkgrep出所需的内容,例如MemTotal

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

要么

cat /proc/meminfo | grep MemTotal

8
但是MemTotal并不是总的物理内存-请参见proc(5)的手册页
Chris Stratton 2013年

2
@ChrisStratton:您能说得更清楚吗?对于大多数实际意图和目的,此答案可能就足够了。
Dan Dascalescu 2014年

13
awk '/MemTotal/ {print $2}' /proc/meminfo 管道越少越好。
masta

3
备受争议的替代方案:尽可能避免使用awk。Regex / PCRE是一种更为通用的模式匹配语言(即,您也可以在Python或Perl中使用它)。如果您学习了awk,那么您已经拥有了awk。另一方面,如果您使用grep + PCRE ... grep -oP '^MemTotal:\s+\K.*' /proc/meminfo
Gabriel Totusek '17年

5
@GabrielBurkholder也有相反的观点:awk通过POSIX标准,但grep的选项-o-P都没有!您的示例可以在GNU上正常运行grep(但是GNU仍然说PCRE实现是实验性的),但可能无法在其他实现上使用。
pabouk

48

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

我猜您有一个VM时会出现问题,并且您想计算虚拟机监控程序托管的全部内存,但是在这种情况下,您必须登录到虚拟机监控程序。

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
在我的具有4GB内存cat /proc/meminfo | grep MemTotal报告的物理包装上MemTotal: 3957032 kB,这还远远不够4GB。OP(和我)正在寻找可报告4GB的内容。
2015年

1
更直接的方法是grep MemTotal /proc/meminfo
Dan Passaro

3
@TvE 3957032 kB贴错标签。它应该被标记昆明植物研究所,在表示这个职位。这意味着它实际上报告了4,052,000,768字节,略大于4 GB。这是由于/ proc / meminfo实现早于kiB表示法。
杰夫G

4
@JeffG我想您错过了ToolmakerSteve提出的要点。预期值为4GiB,而不是4GB,TvE只是错误地引用了该值。ToolmakerSteve是正确的,在TvE的注释中应将RAM的“ 4 GB”解释为“ 4 GiB”,因此这就是我们要进行比较的值。没错,该值大于4GB,就像它也大于2GB和2GiB,小于6GB和6GiB,但是重要的是它与4GiB的比较,那么谁在乎它与其他度量的比较?是的,您的说法是正确的,但也无关紧要。
蒂姆(Tim)

1
@Tim我只提供了实际上准确的信息,并附有支持文档,可以回答所提出的问题。考虑到要花大量的时间才能找到/proc/meminfo答案,因此我认为在kiB 中报告数字这一事实是此讨论中极为重要的一部分,无论@TvE是否打算提出其他问题。
杰夫G

19

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

例:

DirectMap4k:       10240 kB
DirectMap2M:     4184064 kB

10240 + 4184064 = 4194304 kB = 4096 MB


3
最好的答案是这里,除了使用dmidecode之外,后者需要root。但是DirectMap并不总是精确的。我有一个4GB的服务器,它说:`DirectMap4k:110200 kB DirectMap2M:3993600 kB`那是4007MB,而不是4096MB ...
TvE 2015年

注意:即使TvE的OS以1024字节为单位报告,他的总数4103800 x 1024也少于4 GiB(即4194304 x 1024)。
ToolmakerSteve

另外,并非在所有版本的Linux上都可用。我的Centos5框(是的,我知道)没有报告。
汤姆·夸伦登

作为记录,这些仅存在于x86上。之所以起作用,是因为这些条目计算了TLB中4k,2M,1G页所代表的内存量,该页必须覆盖内核可访问的所有内存
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'
Oliver Dungey

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

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


正是我想要的!
托马斯·冈萨雷斯

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

4294967296 bytes
4 GB

说明

/ sys / devices / system / memory / block_size_bytes

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

/ sys / devices / system / memory / memory *

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

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

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


我会尽快检查您的解决方案。
贾丹(Jdamian),

bash提示:在您的代码中,无需使用斜杠(\)继续下一行-实际上,您可以&&为此目的在行末使用。
杰米安

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 * info);

struct sysinfo {。

   .

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

   unsigned long freeram;   /* Available memory size*/

   .

   . 

  }; 

cat / proc / meminfo在我的嵌入式系统上为我工作
webbertiger

-7

我找到htop了一个有用的工具。

sudo apt-get install htop

然后

自由-m

将提供您所需的信息。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.