正在计算 CPU 进程在 Android 中的使用情况

Calculating CPU Usage of a Process in Android

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

从 jiffie 转换为秒:jiffie / hertz

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

第二步:/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq.

获取每秒时钟滴答数

第 3 步:/proc/[pid]/stat

获取进程 (utime(14) +stime(15)) 参数花费的总时间

第 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

编辑

输出

第一步:226.06 1211.19

第 2 步:1000000

步骤3:9347(example.com)S 3573 3573 0 0 0 -1 1077952832 8971 0 1 0 38 32 0 0 20 0 20 0 25 0 25 0 13137 983830528 13137 983330528 14330 42949497295 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 4612 0 38888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888太平洋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?

错误说明

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

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

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

获取数据

  • 正常运行时间226.06
  • utime: 38 时钟节拍
  • stime: 32 时钟滴答
  • 开始时间13137 时钟节拍
  • 赫兹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 用法。

虽然在大多数 Android 设备上该值确实是 100,但在某些设备上它可能是不同的值。这是因为此值取决于 CPU 的体系结构。 ARM CPUs 对于 USER_HZ 常数值会有 100x86 CPUs 将有 1000,如您所见 here