我想问题是,我可以通过读取 /proc/stat 一次以某种方式计算 CPU 利用率吗?
# head -1 /proc/stat
cpu 67891300 39035 6949171 2849641614 118251644 365498 2341854 0
我正在考虑总结除 IOWait 之外的列(我在某处读到它被计入空闲),这将给我 100%,并且每个单独的列都可以通过 (column/100_percent)*100 转换为百分比。
- user:在用户模式下执行的正常进程
- nice:在用户模式下执行的 niced 进程
- system:在内核模式下执行的进程
- 闲置:摆弄大拇指
- iowait:等待 I/O 完成
- irq:服务中断
- 软中断:服务软中断
- 偷:不自觉的等待
- 来宾:运行普通来宾
- guest_nice:运行一个友好的来宾
这是一种可行的方法还是我完全偏离了轨道?
您走在正确的轨道上,
top
为此目的使用此文件。但是你需要多读一遍。利用率是随时间变化的使用量度。如果您知道主机的正常运行时间(以秒为单位),您可以阅读一次,然后除以它,但这将为您提供自机器启动以来主机的实用率。
如果您想要超过 5 秒的速率,您将读取文件一次,休眠 5 秒,再次读取,获得计算的差值并除以 5。
你的方法是正确的。您可以使用 /proc/stat 作为原始数据并使用它来提供例如 rrdtool 。我自己做过这样的事情,所以我知道 100% 这是可能的。然后,您可以很好地单独绘制整个系统负载或每个核心。
这是我自己的一个工作示例:
重新假设->你可以做到,这不仅仅是基础数学,我的图表就是一个活生生的例子。为了收集数据,我将 /proc/stat 的快照保存到 ramdisk 上本地化的临时文件中,然后解析该文件以每 1 分钟收集一次数据。
我如何解析数据(bash 脚本的片段):
将数据输入 rrd 数据库后,您可以绘制图表,天空是极限:) http://oss.oetiker.ch/rrdtool/doc/rrdgraph.en.html
如果你想要 oneliner,它可能看起来像这样:
结果:
97.17000000000000000000
这个怎么运作:
然后产生
( 1055057784 - 1055058055 )/100
这个换行到 bc。会有类似的东西-7.84000000000000000000
,然后把它包起来再100-$(value)
喂给bc有:
sleep #
- 1 秒延迟,如果更改此值,则中间结果应除以秒数。 - 第 5 个字段,$5
根据http://www.linuxhowtos.org/System/procstat.htmman proc
如果这对您不起作用,请告诉我。
或者,如果您对点之后的两位数感到满意,那么 awk 可以更简单、更易读: