今天我们迎来了第二个课后作业,我们尝试模仿ProcessCpuTracker.java拿到一段时间内各个线程的耗时占比
下面是一个结果的样例:
usage: CPU usage 5000ms(from 23:23:33.000 to 23:23:38.000):
System TOTAL: 2.1% user + 16% kernel + 9.2% iowait + 0.2% irq + 0.1% softirq + 72% idle
CPU Core: 8
Load Average: 8.74 / 7.74 / 7.36
Process:com.sample.app
50% 23468/com.sample.app(S): 11% user + 38% kernel faults:4965
Threads:
43% 23493/singleThread(R): 6.5% user + 36% kernel faults:3094
3.2% 23485/RenderThread(S): 2.1% user + 1% kernel faults:329
0.3% 23468/.sample.app(S): 0.3% user + 0% kernel faults:6
0.3% 23479/HeapTaskDaemon(S): 0.3% user + 0% kernel faults:982
...
统计一段时间内的CPU使用情况
processCpuTracker.update();
dosomething();
processCpuTracker.update();
// 输出结果
processCpuTracker.printCurrentState(SystemClock.uptimeMillis());
其中数据可以从各个系统文件中获取:
系统CPU使用率可以通过 /proc/stat 文件获得,各个字段的含义可以参考文件Linux环境下进程的CPU占用率和Linux文档
System TOTAL: 2.1% user + 16% kernel + 9.2% iowait + 0.2% irq + 0.1% softirq + 72% idle
可以通过文件/proc/cpuinfo获得
CPU Core: 8
系统通过/proc/loadavg获得
Load Average: 8.74 / 7.74 / 7.36
- 从/proc/[pid]/stat可以获得进程CPU使用情况
- 从/proc/[pid]/task/[tid]/stat可以获得进程下面各个线程的CPU使用情况
Threads:
43% 23493/singleThread(R): 6.5% user + 36% kernel faults:3094
3.2% 23485/RenderThread(S): 2.1% user + 1% kernel faults:329
0.3% 23468/.sample.io.test(S): 0.3% user + 0% kernel faults:6
0.3% 23479/HeapTaskDaemon(S): 0.3% user + 0% kernel faults:982
...
整个提交方法如下:
- 完善ProcessTrackerSample项目
- 注明极客时间的账号 + 实现原理与心得体会
- 发送pull request 到本repo
根据项目质量和提交pull request的时间,抽取部分同学送上经典书籍。
最终结果也会在极客时间和repo中公布,欢迎大家积极参与!