top 命令第一次迭代总是返回相同的结果

Posted

技术标签:

【中文标题】top 命令第一次迭代总是返回相同的结果【英文标题】:top command first iteration always returns the same result 【发布时间】:2011-06-23 20:08:03 【问题描述】:

运行 top -b -n 1 时,该命令始终返回相同的 CPU 值。 考虑连续运行 5 次以下测试:

[user@server ~]$ top -b -n 5 -d.2 | grep "Cpu(s)"
Cpu(s): 18.5%us, 10.0%sy,  0.0%ni, 67.0%id,  4.2%wa,  0.0%hi,  0.2%si,  0.1%st
Cpu(s): 39.8%us, 27.7%sy,  0.0%ni, 31.3%id,  0.0%wa,  0.0%hi,  1.2%si,  0.0%st
Cpu(s): 39.0%us, 35.4%sy,  0.0%ni, 23.2%id,  0.0%wa,  0.0%hi,  1.2%si,  1.2%st
Cpu(s): 41.2%us, 34.1%sy,  0.0%ni, 15.3%id,  1.2%wa,  0.0%hi,  2.4%si,  5.9%st
Cpu(s): 59.0%us, 30.1%sy,  0.0%ni,  4.8%id,  0.0%wa,  0.0%hi,  3.6%si,  2.4%st
[user@server ~]$ top -b -n 5 -d.2 | grep "Cpu(s)"
Cpu(s): 18.5%us, 10.0%sy,  0.0%ni, 67.0%id,  4.2%wa,  0.0%hi,  0.2%si,  0.1%st
Cpu(s): 18.9%us, 17.8%sy,  0.0%ni, 63.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu(s): 18.8%us, 21.2%sy,  0.0%ni, 55.3%id,  2.4%wa,  0.0%hi,  1.2%si,  1.2%st
Cpu(s): 29.4%us, 24.7%sy,  0.0%ni, 45.9%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu(s): 60.5%us, 24.4%sy,  0.0%ni, 11.6%id,  1.2%wa,  0.0%hi,  1.2%si,  1.2%st
[user@server ~]$ top -b -n 5 -d.2 | grep "Cpu(s)"
Cpu(s): 18.5%us, 10.0%sy,  0.0%ni, 67.0%id,  4.2%wa,  0.0%hi,  0.2%si,  0.1%st
Cpu(s): 43.4%us, 38.6%sy,  0.0%ni, 15.7%id,  0.0%wa,  0.0%hi,  1.2%si,  1.2%st
Cpu(s): 55.3%us, 40.0%sy,  0.0%ni,  4.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu(s): 39.5%us, 48.8%sy,  0.0%ni,  5.8%id,  1.2%wa,  0.0%hi,  1.2%si,  3.5%st
Cpu(s): 40.7%us, 55.6%sy,  0.0%ni,  2.5%id,  0.0%wa,  0.0%hi,  0.0%si,  1.2%st
[user@server ~]$ top -b -n 5 -d.2 | grep "Cpu(s)"
Cpu(s): 18.5%us, 10.0%sy,  0.0%ni, 67.0%id,  4.2%wa,  0.0%hi,  0.2%si,  0.1%st
Cpu(s): 27.1%us, 10.6%sy,  0.0%ni, 61.2%id,  1.2%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu(s): 25.3%us,  5.7%sy,  0.0%ni, 67.8%id,  0.0%wa,  0.0%hi,  0.0%si,  1.1%st
Cpu(s): 15.5%us, 16.7%sy,  0.0%ni, 64.3%id,  0.0%wa,  0.0%hi,  0.0%si,  3.6%st
Cpu(s): 57.3%us, 11.2%sy,  0.0%ni, 30.3%id,  0.0%wa,  0.0%hi,  0.0%si,  1.1%st
[user@server ~]$ top -b -n 5 -d.2 | grep "Cpu(s)"
Cpu(s): 18.5%us, 10.0%sy,  0.0%ni, 67.0%id,  4.2%wa,  0.0%hi,  0.2%si,  0.1%st
Cpu(s): 44.0%us,  6.0%sy,  0.0%ni, 42.9%id,  0.0%wa,  0.0%hi,  3.6%si,  3.6%st
Cpu(s): 45.8%us,  9.6%sy,  0.0%ni, 44.6%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu(s): 34.5%us,  8.3%sy,  0.0%ni, 57.1%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu(s): 38.6%us, 14.5%sy,  0.0%ni, 45.8%id,  0.0%wa,  0.0%hi,  0.0%si,  1.2%st

知道这里可能是什么问题吗?

【问题讨论】:

不确定,但我可以重现这个。运行 Kubuntu 业力。我什至在后台运行了一个 python 进程来进行 CPU 计算。没有变化。 【参考方案1】:

如果有人正在寻找单行获取 cpu 的值,那么试试这个

top -b -n 5 -d.2 | grep "Cpu" | tail -n1 | awk 'print($2)' | cut -d'%' -f 1

【讨论】:

【参考方案2】:

CPU 利用率数据是按时间间隔内的平均值计算的。对于第一次迭代,该时间间隔是“从系统启动到现在”;对于后续迭代,时间间隔为“从上次迭代到现在”。

【讨论】:

同样基于 sysrqb 的解决方案和接受的答案,我现在使用:top -b -n 2 -d1 | grep "CPU" |尾 -n+2【参考方案3】:

Top 在开始之前不知道进程时间计数是多少,因此它会在第一遍中根据负载平均和等待线程等各种因素进行猜测。

如果您以交互方式启动 top 并快速检查它返回的第一批结果,您可以看到相同的效果。

简单的解决方案:top -b -n 5 -d.2 | grep "Cpu(s)" | tail -n+2

【讨论】:

【参考方案4】:

我也遇到了这个问题并做了一些挖掘。

如果你'man top' 并向下滚动,你会从第 7 部分中找到以下内容。 . .

top 命令通过查看样本之间 CPU 时间值的变化来计算 Cpu(s)。当你第一次运行它时,它没有以前的样本可以比较,所以这些初始值是自启动以来的百分比。这意味着您至少需要两个循环,或者您必须忽略第一个循环的摘要输出。这是批处理模式的问题。如果您定义 CPULOOP=1 环境变量,则有一个可能的解决方法。 top 命令将在标准输出之前为 CPU 数据运行一个额外的隐藏循环。

希望这会有所帮助!

【讨论】:

【参考方案5】:

这是一个计算顶部所有进程的总 CPU 使用率的示例。我使用 -d 标志来增加默认间隔以平滑值。不使用 tail,因为标头可能特定于 Linux 发行版。

top -b -d 5 -n 2 | awk '$1 == "PID" block_num++; next block_num == 2 sum += $9; END print sum'

【讨论】:

以上是关于top 命令第一次迭代总是返回相同的结果的主要内容,如果未能解决你的问题,请参考以下文章

结果集在while循环中仅迭代一次

Html Agility Pack SelectSingleNode 在迭代中总是给出相同的结果?

WinRT Geolocator 总是返回相同的位置

pyUSB read() 总是返回相同的值

AsyncTask的onPostExecute方法获取相同的参数

迭代是啥意思?