目前的平台是big.LITTLE 架构,遇到一个卡顿问题,怀疑和小核上中断过于频繁有关,所以想把SF绑定到大核看看。
首先ps -e获取SurfaceFlinger的pid
:/ # ps -e | grep "surfaceflinger"
system 347 1 103288 21192 SyS_epoll_wait 70e0ffd704 S surfaceflinger
通过taskset绑定:
adb shell
$ taskset -p f0 707 //f0 是掩码 11110000,大核4-7都可以运行
但是出错了:
:/ # taskset -p 0xf0 347
pid 347's current affinity mask: f
taskset: bad mask '0xf0'
从上面的信息可以看到,sf只能在小core上面运行,但是修改失败,check以下:
:/ # cat /proc/347/cpuset
/system-background
:/ # cat /dev/cpuset/system-background/cpus
0-3
充分验证了,sf是后台进程,被限制在小core上面,我们看下其他group cpu的可使用情况
:/ # cat /dev/cpuset/top-app/cpus
0-7 //ff
:/ # cat /dev/cpuset/foreground/cpus
0-5 //3f
所以为了能够修改,需要把sf添加到对应的进程组内
:/ # echo 347 > /dev/cpuset/foreground/task
:/ # taskset -p 30 347
pid 347's current affinity mask: 3f
pid 347's new affinity mask: 30
:/ # echo 347 > /dev/cpuset/top-app/tasks
:/ # taskset -p f0 347
pid 347's current affinity mask: ff
pid 347's new affinity mask: f0
至此,成功绑定你想绑定的cpu上。
上面的top-app,foreground,system-background信息的设定在如下位置:在如下文件设定
init.common.rc
on property:sys.boot_completed=1
# Setup final cpuset
write /dev/cpuset/top-app/cpus 0-7
write /dev/cpuset/foreground/boost/cpus 0-5
write /dev/cpuset/foreground/cpus 0-5
write /dev/cpuset/background/cpus 0-1
write /dev/cpuset/system-background/cpus 0-3
OK,完毕,对于taskset的源码,主要的一点就是设置cpu的亲和数!!!