1

我有一个Embedded Linux(Kernel 2.6.37)运行ARM。有一个默认值top来自busybox 1.13.2. 我建立了一个procps-ng 3.3.11通过交叉编译来运行它Linux。我发现该过程的%cpu输出top来自busyboxprocps-ng是不同的。

比如%cpu一个进程,procps-ng top显示30%左右,但busybox top只显示10%左右。%cpuprocps-ng top和的总数busybox top是相同的。然后我阅读了和
的计算源代码。我发现他们对一个进程的计算公式确实不同。 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  

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

4

1 回答 1

1

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

在 2016 年 12 月 28 日下午 3:12,Craig Small 写道:
可能有不同的方式来看待这个问题。我要说的第一件事是busybox应该是模仿或模仿主程序应该做的事情,所以如果busybox和真实程序之间存在差异,我会说busybox是错误的。就像busybox ls 打印文件与真正的ls 不同。

我们再来看看这个公式:

  • busybox 顶部:
    CPU% = s->pcpu/sum(s->pcpu) * busy_cpu_ticks/total_cpu_ticks
    (pcpu 是样本之间的 sys+user 时间的增量)

  • 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+user 时间的增量)

这就是区别。busybox 增加了busy_cpu_ticks/sum(s->pcpu)与 top 计算结果的比率。这个比率可以写成:

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

read_cpu_jiffy您可以在busybox源代码中看到这一点。我不明白这个比率试图做什么或为什么需要它。特别是当您尝试模拟的程序没有它时。

procps top 说在这个循环中可用的 jiffies 总数中,X% 被这个程序使用了。busybox 在那里放了一些奇怪的缩放比例。因此,如果一个进程在其系统和用户部分中使用 10% 的 CPU,top 显示 10%。如果对于那个周期,进程有 50% 的时间在用户和系统中,busybox 将显示 20% (10% x 100/50)。

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

有关详细信息,请参阅讨论链接:
讨论:不同进程的 %cpu 输出通过来自busybox 和 procps-ng 的顶部

于 2017-05-31T05:43:14.860 回答