如何从 shell 接收类似 top 的 CPU 统计信息?

如何从 shell 接收类似 top 的 CPU 统计信息?

我正在尝试从 中准确读取我使用的 CPU(以百分比为单位)top。这是我正在运行用于测试的命令:

top -n1 | awk '/Cpu\(s\):/ {print $2}'

这将返回:

10.7%us,

这是我想要的正确数据。但是,每次运行该命令时,即使我在系统上应用不同的负载(更不用说htop告诉我我的用法不同),我也会得到相同的输出。看来每当我启动时top,我的CPU使用率都是一样的。只有在几帧之后它才会给我正确的值。

我似乎无法以这种方式解析 top 的输出,因此我正在寻找其他可靠的应用程序,这些应用程序将为我提供从 shell 的准确读取。我真的很喜欢如何htop为我提供每个核心的读数。

我已经尝试过iostatmpstat但他们似乎给出了不准确且“变化缓慢”的值。

答案1

我使用这个脚本(来自拱门板上的这个帖子):

#!/bin/bash
read cpu a b c previdle rest < /proc/stat
prevtotal=$((a+b+c+previdle))
sleep 0.5
read cpu a b c idle rest < /proc/stat
total=$((a+b+c+idle))
CPU=$((100*( (total-prevtotal) - (idle-previdle) ) / (total-prevtotal) ))

答案2

查看萨尔,还有。每个 nix 的实现可能有很大差异,但它应该为您提供给定快照的基本系统统计信息。我不确定命令首次初始化时的值有多准确,但您可以尝试看看它与topiostat等相比如何。

输出是基于列的,就像 top 一样,因此您应该能够通过管道输出awkcut操作结果。

答案3

你看过吗collectl?它很方便,因为您可以根据需要定制输出。看:http://collectl.sourceforge.net/

答案4

我的发现与上面提出问题的人类似,至少在 CentOS 6 上是这样。如果我以批处理模式运行 top 一次迭代,它似乎会收集相同的数字,几乎就好像它的趋势是从什么开始它最后记得显示。 Top 似乎需要积累至少几个数字才能让增量为您提供正确的百分比。在测试了 10 多次迭代后,我发现弹出的第二个数字在每次运行中都显示出足够的差异。所以,很容易通过

top -b -n 2 | grep Cpu | tail -1

我喜欢将其与加载的正常运行时间以及 ps 中选择进程的 grep 过滤器(例如 postgres 查询)结合起来。一个非常简单的监视器可以用别名来表示:

alias postgresmon="watch -d 'uptime;top -b -n 2 | grep Cpu | tail -1;ps -ef | grep postgres\: | grep -v idle'"

相关内容