计算Android中进程的CPU使用率

时间:2015-07-04 19:15:30

标签: android linux cpu-usage

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

从jiffie转换为秒:jiffie / hertz

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

第二步:/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq获取每秒钟表滴答数。

第3步:获取(utime(14) +stime(15))

中流程/proc/[pid]/stat参数所花费的总时间

第4步:/proc/[pid]/stat获取流程的开始时间(22) 在Linux 2.6之后,该值以时钟周期表示(除以sysconf(_SC_CLK_TCK))。

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

第6步:获取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

参考:How do I get the total CPU usage of an application from /proc/pid/stat?

2 个答案:

答案 0 :(得分:5)

错误说明

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

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

对于historical reasons,Linux proc和sys文件中列出的时钟刻度值通过Linux内核HZ常量从内核USER_HZ频率缩放到公共频率。这是USER_HZ常量,我们必须在计算中将其用作hertz值。

获取数据

  • 正常运行时间226.06
  • utime 38时钟滴答
  • stime 32时钟滴答
  • starttime 13137时钟滴答
  • Hertz 100(Linux内核USER_HZ常量)

计算

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总使用率较低。

答案 1 :(得分:0)

虽然在大多数Android设备上确实值为100,但在某些设备上它可能是不同的值。那是因为这个值取决于CPU的架构。 ARM 对于USER_HZ常量值,CPU 100 ,但 x86 CPU将 1000 ,因为您可以看到{{ 3}}。