一:概念
进程绑核就是让进程只能在某一个或者某几个核上运行。在和用户交互中,对一些关键进程如inputdispatcher、surfaceflinger等关键进程进行绑定大核操作,可以提高流畅度。对一些后台进程,不需要和用户交互的,进行绑小核或者限定在特定核上运行,可以减少功耗,还可以避免后台进程抢占CPU资源造成前台进程卡顿。
二:绑核方式
2.1 在代码中绑核
可以在对应进程初始化的地方添加如下代码,主要是调用int sched_setaffinity(pid_t pid, unsigned int cpusetsize, cpu_set_t *mask)这个系统接口。需要传三个参数,第一个参数pid为进程的pid,第二个参数cpusetsize是要绑定的核的长度,第三个参数mask是要绑定的核
#include <sched.h>
cpu_set_t set;
CPU_ZERO(&set);
CPU_SET(0, &set);
CPU_SET(1, &set);
CPU_SET(2, &set);
CPU_SET(3, &set);
sched_setaffinity(gettid(), sizeof(cpu_set_t), &set);
2.2 cgroup进行绑核操作
2.2.1 获取进程包名
打开应用执行,adb shell dumpsys actitivity activities |grep "ResumedActivity"
$ adb shell dumpsys activity activities |grep "ResumedActivity"
ResumedActivity: ActivityRecord{f8b9c7c u0 com.android.launcher3/.uioverrides.QuickstepLauncher} t7}
2.2.2 获取进程pid
adb shell ps -A |grep com.android.launcher3
$ adb shell ps -A |grep com.android.launcher3
u0_a176 2014 805 14872400 185740 do_epoll_wait 0 S com.android.launcher3
2.2.3 获取进程所属于的组
adb shell进入手机,进入proc目录,所有进程都会在此目录下有对应的文件夹,进程对应的pid就是该进程在此目录下文件夹的名字,进入对应文件夹,查看cgroup节点,cpu:后面跟的就是进程所在的组
$ adb shell
XXXXX:/ # cd proc/2014
XXXXX:/proc/2014 # cat cgroup
4:memory:/
3:cpuset:/restricted
2:cpu:/foreground
1:blkio:/
0::/uid_10176/pid_2014
2.2.4 对组进行绑核
注:此修改影响较大,调试可用,如果要在代码中直接修改cgroup不同组绑定不同的核,慎重!
XXXXX:/ # cd dev/cpuset/foreground/
XXXXX:/dev/cpuset/foreground # cat cpus
0-7
XXXXX:/dev/cpuset/foreground # echo "4-7" >cpus
XXXXX:/dev/cpuset/foreground # cat cpus
4-7
2.3 taskset命令进行进程绑核
adb shell taskset -ap 80 2014
可执行adb shell taskset --help 查看taskset支持的参数,80是16进制,转化成2进制是10000000,即对应的CPU7,2014是Launcher对应的pid,这个命令是让launcher及其子线程都跑在CPU7上。
三:小结
3.1 如何查看进程运行在哪个核上
adb shell ps -A -o pid,name,psr
pid是进程的pid,name是进程的名字,psr是进程运行的核
3.2 针对2.2所描述的cgroup绑核
需要对cgroup有细致全面的理解,再进行cgroup的修改,修改影响较大。