不同进程的%cpu通过busybox和procps的顶部输出
我有一个Embedded Linux(Kernel 2.6.37)
在ARM
上运行。从busybox 1.13.2
有一个默认top
。我通过交叉编译构建procps-ng 3.3.11
以运行在Linux
上。我发现这个过程的%cpu
通过top
输出的busybox
和procps-ng
是不同的。不同进程的%cpu通过busybox和procps的顶部输出
例如,一个进程的%cpu
,procps-ng top
显示约30%,但busybox top
只显示约10%。 procps-ng top
和busybox top
的总数为%cpu
是相同的。
然后我看了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
为什么这两个项目选择不同的计算公式?他们是否为不同的应用案例而设计? 谢谢!
已经讨论过这个问题与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