android app cpu核心限制尝试

背景

希望强制app运行只运行大核或者小核上,以观察其是否卡顿或能耗增加。

查看可以使用的cpu核心

1
cat /proc/cpuinfo

观察具体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 亲和性。

1
taskset -ap f $pid

需要注意的是: -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下,已经默认配置了很多这样的规则,如下所示

1
ls /dev/cpuset

查看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 就能将应用限制在小核上运行。