不同进程的%cpu通过busybox和procps的顶部输出

问题描述:

我有一个Embedded Linux(Kernel 2.6.37)ARM上运行。从busybox 1.13.2有一个默认top。我通过交叉编译构建procps-ng 3.3.11以运行在Linux上。我发现这个过程的%cpu通过top输出的busyboxprocps-ng是不同的。不同进程的%cpu通过busybox和procps的顶部输出

例如,一个进程的%cpuprocps-ng top显示约30%,但busybox top只显示约10%。 procps-ng topbusybox top的总数为%cpu是相同的。
然后我看了busyboxprocps-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 

为什么这两个项目选择不同的计算公式?他们是否为不同的应用案例而设计? 谢谢!

已经讨论过这个问题与procps的-NG团队,这里的关键点:

在2016年12月28日下午3时12,克雷格小写道:
有可能是一个不同的方式看看这个。我要说的第一件事就是busybox应该模仿或模仿主要程序应该做什么,所以如果busybox和真正的程序有区别,我会说busybox是错误的。这就像busybox的打印文件与真正的ls不同。

让我们来看看这个公式再次:

  • busybox的顶部:
    CPU% = s->pcpu/sum(s->pcpu) * busy_cpu_ticks/total_cpu_ticks
    (PCPU是SYS的Δ+用户的样本之间的时间)

  • procps的-NG顶部:
    CPU% = s->pcpu/total_cpu_ticks

现在让我们来重新安排一下:

  • busybox的顶部:
    CPU% = s->pcpu/total_cpu_ticks * busy_cpu_ticks/sum(s->pcpu)
    CPU% = top_CPU% * busy_cpu_ticks/sum(s->pcpu)
    (PCPU是SYS三角洲+用户样本之间的时间)

这就是区别。 busybox将busy_cpu_ticks/sum(s->pcpu)的比率增加到顶峰。这个比例可以写成:

RATIO = Sum(Usr + Nice + System + Irq + sirq + steal)/Sum(Usr + System)

您可以排序的看到这个read_cpu_jiffy在busybox的来源。我不知道这个比例试图做什么或为什么它是必需的。特别是当你试图模拟的程序没有它时。

procps top说在这个周期中可用的jiffies中,X%被这个程序使用。 busybox在那里放了一些奇怪的缩放。因此,如果某个进程在其系统和用户部件中使用了10%的CPU,则顶部会显示10%。如果对于该周期,该过程在50%的时间内处于用户和系统中,busybox将显示20%(10%x 100/50)。

我不知道他们为什么这么做。

请参阅的讨论链接查看更多细节:
discussion: different process's %cpu output via top from busybox and procps-ng