Android多核与单核的性能持平的问题

客户要求使用Antutu工具来测试android的性能,测试过程中发现多核CPU跑分与单核基本持平,后来使用Geekbench工具测试,结果同样,不明白为什么?

接着自己编译一个静态链接的coremark,下到android系统里面测试,发现结果是对,4核分值是单核的约4倍,因coremark并没有经android,所以结果对是自然的,所以问题应在android本身。

Coremark:

Single-core: 11275                Multi-core: 11275

进一步使用mpstat、perfmon的工具监测CPU,发现几乎所有的任务都被调度到CPU 0上,而其他CPU则近乎空闲。

Android多核与单核的性能持平的问题_第1张图片
mpstat -P ALL 1

使用ps -p命令,进一步确认几乎所有的任务都调度到CPU 0上

Android多核与单核的性能持平的问题_第2张图片

......

试图使用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框架分析及其使用

你可能感兴趣的:(Android多核与单核的性能持平的问题)