使用taskset将task绑定到指定的CPU上

目前的平台是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的亲和数!!!

你可能感兴趣的:(Android/linux杂学)