背景
希望强制app运行只运行大核或者小核上,以观察其是否卡顿或能耗增加。
查看可以使用的cpu核心
观察具体core的标识
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| Processor : AArch64 Processor rev 14 (aarch64) processor : 0 BogoMIPS : 38.40 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp CPU implementer : 0x51 CPU architecture: 8 CPU variant : 0xd CPU part : 0x805 CPU revision : 14
processor : 1 BogoMIPS : 38.40 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp CPU implementer : 0x51 CPU architecture: 8 CPU variant : 0xd CPU part : 0x805 CPU revision : 14 ....
processor : 4 BogoMIPS : 38.40 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp CPU implementer : 0x51 CPU architecture: 8 CPU variant : 0xd CPU part : 0x804 CPU revision : 14
processor : 5 BogoMIPS : 38.40 Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm lrcpc dcpop asimddp CPU implementer : 0x51 CPU architecture: 8 CPU variant : 0xd CPU part : 0x804 CPU revision : 14 Hardware : Qualcomm Technologies, Inc SM8150
|
可以看到SM8150,03 核心为一组,47 为一组。
从测试性能的表现 和/dev/cpuset/backend的设置 来看, 0~3 是小核心。
使用taskset设置进程可使用的cpu核心
在android下,可以直接使用如下命令测试某个进程的cpu 亲和性。
需要注意的是: -ap后的mask,其为16进制的数字。f = 0b1111,表示$pid进程可以使用0~3 核心。
-a可以保证该进程所属app的所有进程都被设置。
另外,需要注意到,应用可能会自行调整cpu亲和性。如下所示,最好多执行两次命令,观察current affinity mask是不是被设置为了预期值。
1 2
| pid 25962's current affinity mask: 50 pid 25962's new affinity mask: c
|
使用cpuset约束app可使用cpu
实际测试时发现app中部分进程会频繁调整自己的cpu 亲和性,导致taskset不能达到预期的效果。
经过检查,发现app中使用zygote 启动的renderscript 就会维护自己的cpu亲和性。
为了获得想要的纯净效果,需要进一步约束进程能使用的cpu。
参考man cpuset,在linux下可以通过文件系统来控制进程能使用的cpu。
在android下,已经默认配置了很多这样的规则,如下所示
查看app所属的cpu限制规则可以参考
1 2
| cat /proc/26937/cpuset /top-app
|
对26937约束,我们可以。
1 2
| cd /dev/cpuset/top-app echo "0-3" > cpus
|
这样再去使用taskset -ap f $pid 就能将应用限制在小核上运行。