![如何使用 vmstat 获取内存使用率百分比?](https://linux22.com/image/487642/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20vmstat%20%E8%8E%B7%E5%8F%96%E5%86%85%E5%AD%98%E4%BD%BF%E7%94%A8%E7%8E%87%E7%99%BE%E5%88%86%E6%AF%94%EF%BC%9F.png)
我需要从 vmstat 获取内存使用率的百分比,但我不太明白 vmstat 中显示的与内存有关的一些数字。
具体来说,给出这样的输出
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 139728 45396 199128 1236360 1 2 4 622 3 1 51 4 43 2 0
系统总内存量是多少?是 'swpd' + 'free' + 'buff' + 'cache',总计 1620612 吗?
系统的可用内存量是多少?‘free’ 列中显示的是 45396 吗?
问题是它们加起来与“top”报告的结果不符,甚至看起来与“top”报告的结果相差甚远。我与上面的“vmstat”同时得到的“top”输出如下:
[...]
Mem: 4059616k total, 3965504k used, 94112k free, 200020k buffers
[...]
所以...我假设“vmstat”中一定存在我不知道的隐藏数字/选项?
我需要为此目的使用“vmstat”而不是其他命令,因为这是要求所述的。
因此理想情况下,我希望从“vmstat”获得内存使用率的百分比,如下所示:
<used_memory>/<total_memory> * 100%.
谢谢!
答案1
您正在寻找的是“free”的输出:
$ free
total used free shared buffers cached
Mem: 775556 759456 16100 0 22132 592484
-/+ buffers/cache: 144840 630716
Swap: 500344 21972 478372
以下是一次游览:
这是一个具有 768MB 物理 RAM 和 500344KB 交换分区的盒子。
759456KB 为“已使用”(第二列,顶行)。在这些“已使用”内存中,23132KB 为缓冲区(第五列,顶行),592484KB(第六列,顶行)为缓存,剩余 144840KB(第二列,第二行)的物理内存由活动进程使用。
当您考虑到缓冲区和缓存使用的内存可用于进程时,就会留下 630716KB(第 3 列,第 2 行)的可用物理内存。
正如我所说,交换分区为 500344KB(第 1 列,底行)。交换文件中有 21972KB(第 2 列,底行)正在使用,剩余 478372KB(第 3 列,底行)可用。
因此,您对可用内存百分比的定义取决于您是否计算缓冲区和缓存,以及是否计算交换。
这应该足以让您继续计算您认为合适的百分比。
以下是 top 和 free 的输出:
$ top -n1 | grep "used," ; free
Mem: 775556k total, 751472k used, 24084k free, 20776k buffers
Swap: 500344k total, 21972k used, 478372k free, 586648k cached
total used free shared buffers cached
Mem: 775556 751344 24212 0 20776 586648
-/+ buffers/cache: 143920 631636
Swap: 500344 21972 478372
您可以看到 top 和 free 是如何一致的(尽管有一点差别——这是一台多用户机器,top 和 free 程序的内存使用情况反映在其中)。
在调用 vmstate 时添加“-s”,您将看到相同的输出,只是形式不同:
$ vmstat -s ; free
775556 total memory
759920 used memory
674680 active memory
18440 inactive memory
15636 free memory
21892 buffer memory
594372 swap cache
500344 total swap
21972 used swap
478372 free swap
... output truncated ...
total used free shared buffers cached
Mem: 775556 759920 15636 0 21892 594372
-/+ buffers/cache: 143656 631900
Swap: 500344 21972 478372
您可以看到 vmstat 显示的数字与可用数字相同。
答案2
我和你有同样的问题,并想出了一个公式
vmstat -s | awk ' $0 ~ /total memory/ {total=$1 } $0 ~/free memory/ {free=$1} $0 ~/buffer memory/ {buffer=$1} $0 ~/cache/ {cache=$1} END{print (total-free-buffer-cache)/total*100}'
我已经在 procps-ng 3.3.10 的 vmstat 版本和 procps-ng 3.3.9 的 vmstat 版本上进行了测试
答案3
我建议您阅读这本 IBM 红皮书《Linux 性能和调优指南》(http://www.redbooks.ibm.com/abstracts/redp4285.html?Open)。它包含许多命令返回的数据的详细信息,应该可以为您提供帮助。
我通常使用 Linux 中的“free”命令或“cat /proc/meminfo”。
答案4
这是一个POSIXshell 函数将所需百分比向下舍入到最接近的整数(对于脚本目的,这可能更有用,因为POSIXshell 算术比较测试仅适用于整数):
# Vmstat (derived) Used Ram Percent
vurp() { vmstat -s | { read a b ; read c d ; echo $((100*$c/$a)) ; } ; }
vurp
输出(在我的系统上):
12
同样的事情,还有free
:
furp() { free | { read z; read a b c d; echo $((100*$c/$b)) ; } }