![如何从 shell 接收类似 top 的 CPU 统计信息?](https://linux22.com/image/19554/%E5%A6%82%E4%BD%95%E4%BB%8E%20shell%20%E6%8E%A5%E6%94%B6%E7%B1%BB%E4%BC%BC%20top%20%E7%9A%84%20CPU%20%E7%BB%9F%E8%AE%A1%E4%BF%A1%E6%81%AF%EF%BC%9F.png)
我正在尝试从 中准确读取我使用的 CPU(以百分比为单位)top
。这是我正在运行用于测试的命令:
top -n1 | awk '/Cpu\(s\):/ {print $2}'
这将返回:
10.7%us,
这是我想要的正确数据。但是,每次运行该命令时,即使我在系统上应用不同的负载(更不用说htop
告诉我我的用法不同),我也会得到相同的输出。看来每当我启动时top
,我的CPU使用率都是一样的。只有在几帧之后它才会给我正确的值。
我似乎无法以这种方式解析 top 的输出,因此我正在寻找其他可靠的应用程序,这些应用程序将为我提供从 shell 的准确读取。我真的很喜欢如何htop
为我提供每个核心的读数。
我已经尝试过iostat
,mpstat
但他们似乎给出了不准确且“变化缓慢”的值。
答案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 的实现可能有很大差异,但它应该为您提供给定快照的基本系统统计信息。我不确定命令首次初始化时的值有多准确,但您可以尝试看看它与top
、iostat
等相比如何。
输出是基于列的,就像 top 一样,因此您应该能够通过管道输出awk
或cut
操作结果。
答案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'"