如何从Shell接收类似顶部的CPU统计信息?


12

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

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

返回:

10.7%us,

这是我想要的适当数据。但是,即使我在系统上施加不同的负载,每次运行命令时也会得到相同的输出(更不用说htop告诉我我的用法是不同的)。看来,每当我开始时top,我的CPU使用率都是相同的。只有经过几帧,它才能为我提供适当的值。

看来我无法以这种方式解析top的输出,因此我正在寻找其他可靠的应用程序,这些应用程序将使我能够从shell中获得准确的读数。我真的很喜欢如何htop为我提供每核的阅读。

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


2
别。正确的问题是:如何从外壳中获取类似CPU的顶部使用情况统计信息?
斯蒂芬·吉梅内斯

@StéphaneGimenez,谢谢,我修改了我的问题
n0pe 2011年

Answers:


12

我使用以下脚本(从Arch板上的该线程):

#!/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) ))

Linux在/ proc /中提供了一些很棒的信息- 有关所有优点,请参见linux.die.net/man/5/proc。请注意,这些仅是Linux。除非使用Sigar之类的库,否则实际上并没有跨平台的方式来获取该信息。
Pat Notz

这个主意不错,但有些细节不正确。空闲值是第5列,您还应该添加iowait列(第6列)以获得合理的百分比。为了完全正确,您还必须添加所有“剩余”值,但是它们通常很小。
Peter Eisentraut

如果要计算“ cpu”列,则空闲值是第五列。否则,它是第四。
SunSparc 2014年

6

同时查看sar。各个实现之间的实现差异很大,但是在给定的快照下,它应该为您提供基本的系统统计信息。我不知道该值如何准确的处该命令首先被初始化了点,但你可能会玩,看看它是如何比较topiostat等等。

输出是基于列的,就像top一样,因此您应该能够将输出传递给awkcut操纵结果。


我之前尝试sar过混合结果。我将在这里使用@jasonwryan的答案,因为我可以轻松地对其进行修改以代表两个CPU内核的使用情况。
n0pe 2011年


0

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

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

我喜欢将其与正常运行时间(用于负载)和gps筛选器(从ps中选择过程)(例如postgres查询)结合在一起。一个非常简单的监视器可以用别名表示:

alias postgresmon="watch -d 'uptime;top -b -n 2 | grep Cpu | tail -1;ps -ef | grep postgres\: | grep -v idle'"
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.