客户要求使用Antutu工具来测试android的性能,测试过程中发现多核CPU跑分与单核基本持平,后来使用Geekbench工具测试,结果同样,不明白为什么?
接着自己编译一个静态链接的coremark,下到android系统里面测试,发现结果是对,4核分值是单核的约4倍,因coremark并没有经android,所以结果对是自然的,所以问题应在android本身。
Coremark:
Single-core: 11275 Multi-core: 11275
进一步使用mpstat、perfmon的工具监测CPU,发现几乎所有的任务都被调度到CPU 0上,而其他CPU则近乎空闲。
使用ps -p命令,进一步确认几乎所有的任务都调度到CPU 0上
......
试图使用taskset命令把某一个进程亲合到CPU 0以为的CPU,发现不成功:
layerscape:/ # busybox taskset -p 0xf 4162 #指定此PID可以在4个CPU上跑
pid 4162's current affinity mask: 1
pid 4162's new affinity mask: 1 #返回1表示被Android限死在CPU 0上
至此,问题找到。但具体如何解决呢?CPU控制管理由CPU CGROUP来负责,而它则是通过其文件系统/dev/cpuset中的相关文件来实现,具体的几个文件分别如下,他们的当前值也如下:
/dev/cpuset/cpus 0-3
/dev/cpuset/background/cpus 0
/dev/cpuset/foreground/cpus 0
/dev/cpuset/system-background/cpus 0
/dev/cpuset/top-app/cpus 0
由此可见,虽然有4核,但所有几个权限组的都指定了只能调度到CPU 0上,使用echo修改这些之后,立马就可以发现任务可以调度到其他CPU上了。
layerscape:/ # echo 0-3 > /dev/cpuset/top-app/cpus
代码中关于CPU CGROUP管理设置初始配置在system/core/rootdir/init.rc文件,我们具体的配置则放置在device/nxp/layerscape/init.layerscape.rc,如下:
on init
write /dev/cpuset/foreground/cpus 0-3
write /dev/cpuset/background/cpus 0-3
write /dev/cpuset/system-background/cpus 0-3
write /dev/cpuset/top-app/cpus 0-3
它们会覆盖system/core/rootdir/init.rc中的初始配置,如此问题解决,最后Antutu测试结果为:
single-core: 8428 Multi-core: 32531
参看文献:
1. CPU Cgroup in android N and Huawei Mate 9 Implement
2. Android O 绑定SurfaceFlinger到大核
3. Android/Linux下CGroup框架分析及其使用