2016-12-14 68 views
1

我有一個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 

爲什麼這兩個項目選擇不同的計算公式?他們是否爲不同的應用案例而設計? 謝謝!

回答

0

已經討論過這個問題與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

相關問題