我正在尝试按如下方式计算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?
答案 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
秒38
时钟滴答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总使用率较低。
答案 1 :(得分:0)
虽然在大多数Android设备上确实值为100,但在某些设备上它可能是不同的值。那是因为这个值取决于CPU的架构。 ARM 对于USER_HZ常量值,CPU 100 ,但 x86 CPU将 1000 ,因为您可以看到{{ 3}}。