我在ARM上运行了一个ARM。有一个默认的top来自busybox 1.13.2。我通过交叉编译构建了一个procps-ng 3.3.11,以便在这个Linux上运行。我发现流程的%cpu通过来自busybox和procps-ng的top输出是不同的。
例如,%cpu的一个进程,procps-ng top显示约30%,而busybox top只显示约10%。来自procps-ng top和busybox top的总procps-ng top是相同的。
然后,我阅读了busybox和procps-ng的计算源代码。我发现,对于一个进程的%cpu,它们确实有不同的计算公式。
- busybox top:
CPU% = s->pcpu/sum(s->pcpu) * busy_cpu_ticks/total_cpu_ticks
(pcpu is delta of sys+user time between samples)
- procps-ng top:
CPU% = s->pcpu/total_cpu_ticks 为什么这两个项目选择不同的计算公式?它们是为不同的应用程序设计的吗?谢谢!
发布于 2017-05-31 05:43:14
已经与procps ng团队讨论了这个问题,以下是重点:
2016年12月28日下午03:12,克雷格·斯莫尔写道: 可能有一种不同的方式来看待这个问题。我要说的第一件事是,busybox应该是在模仿或模仿主程序应该做什么,所以如果busybox和实际程序有什么不同,我会说busybox是错误的。它就像busybox ls打印的文件与实际ls不同。 让我们再看看这个公式:
CPU% = s->pcpu/sum(s->pcpu) * busy_cpu_ticks/total_cpu_ticks
(pcpu是样品之间sys+user时间的增量)CPU% = s->pcpu/total_cpu_ticks现在让我们重新安排一下:
CPU% = s->pcpu/total_cpu_ticks * busy_cpu_ticks/sum(s->pcpu)
CPU% = top_CPU% * busy_cpu_ticks/sum(s->pcpu)
(pcpu是样品之间sys+user时间的增量)这就是区别所在。busybox增加了busy_cpu_ticks/sum(s->pcpu)与top计算结果的比率。这一比率可写为:
RATIO = Sum(Usr + Nice + System + Irq + sirq + steal) / Sum(Usr + System)
您可以在busybox源代码的read_cpu_jiffy中看到这种情况。我不明白这个比率是怎么做的,也不明白为什么要这样做。特别是当你试图模仿的程序没有它。
procps说,在这个周期的总可用jiffies中,X%被这个程序所使用。百事箱在里面放了一些奇怪的比例。因此,如果一个进程在其系统和用户部分中使用10%的CPU,则顶部显示10%。如果该过程在用户和系统中的时间为50%,则busybox将显示20% (10% x 100/50)。
我不知道他们为什么这么做。
详情请参阅讨论连结:
https://stackoverflow.com/questions/41134205
复制相似问题