一尘不染

计算Android中进程的CPU使用率

linux

我正在尝试按以下方式计算Android中进程的CPU使用率,但是由于产生的输出,我不确定它是否正确。

要将吉菲转换为秒:吉菲/赫兹

第一步: 使用/proc/uptime文件的第一个参数获取正常运行时间。

第二步: 从中获取每秒的时钟滴答数/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

第三步: 从中获取过程(utime(14) +stime(15))参数花费的总时间/proc/[pid]/stat

第四步:/proc/[pid]/stat Linux
2.6之后的时钟滴答声中除以sysconf(_SC_CLK_TCK)表示的值,获取进程的starttime(22)。

第五步: 获取自进程启动(uptime - (starttime / hertz)以来的总运行时间(因为正常运行时间以秒为单位,而启动时间以时钟滴答为单位)。

第六步: 获取CPU使用率百分比((totaltime / hertz) / elapsedTime) * 100

计算后的输出类似于5.702244483458246E-6,大约等于〜0.000005702244483

编辑

输出量

步骤1:226.06 1211.19

步骤2:1000000

步骤3:9347(example.com)S 3573 3573 0 0 -1 1077952832 8971 0 1 0 38 32 0 0 20 0
25 0 13137 983830528 14330 4294967295 1 1 0 0 0 0 4612 0 38136 4294967295 0 0
17 5 0 0 0 0 0 0 0 0 0 0 0 0 0

参考:如何从/ proc / pid /
stat获取应用程序的CPU总使用率?


阅读 762

收藏
2020-06-07

共1个答案

一尘不染

错误说明

我怀疑您将其中的值/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq用作您的hertz值。这是不正确的,因为该文件为您提供了CPU硬件时钟频率,但是您必须使用Linux内核时钟频率作为您的hertz值。

CPU硬件时钟和Linux内核时钟不同。Android运行的Linux内核具有自己的计时器(时钟),并以一定的频率更新。此计时器更新的频率是内核赫兹(HZ)值。

由于历史原因,Linux
proc和sys文件中列出的时钟滴答值HZ通过Linux内核USER_HZ常数从内核频率缩放到公共频率。USER_HZ我们必须hertz在计算中使用此常量作为值。

数据采集

  • 正常运行时间226.06
  • utime38时钟滴答
  • stime32时钟滴答
  • 开始时间13137时钟滴答
  • Hertz100(Linux内核USER_HZ常数)
    • 这是基于未修改的Android系统的假设。

计算方式

total_time = utime + stime = 38 + 32 = 70

seconds = uptime - (starttime / Hertz) = 226.06 - (13137 / 100) = 94.69

cpu_usage = 100 * ((total_time / Hertz) / seconds) = 100 * ((70 / 100) / 94.69) = 0.7392...

您的进程的总CPU使用率约为 0.739%
。如果这看起来很小,请记住您的进程与系统上的所有其他进程共享CPU:大多数普通进程在其整个生命周期中都处于空闲状态,因此任何一个进程通常平均总CPU使用率较低。

2020-06-07