admin 管理员组

文章数量: 1184232

一:概念

进程绑核就是让进程只能在某一个或者某几个核上运行。在和用户交互中,对一些关键进程如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命令进行进程绑核

taskset 是 Linux 系统中用于设置或查询进程(或线程)与 CPU 核心绑定关系的工具,即控制进程在哪些 CPU 核心上运行。它通过操作 CPU 亲和性(affinity)来实现,可以优化多核环境下的性能或避免资源竞争

2.3.1 常用选项
选项 说明
-a 设置所有线程(包括未来创建的线程)的亲和性。
-p 操作现有进程(通过 PID 指定)。
-c 以 CPU 编号列表(如 0,2,3 )代替掩码(mask)。

2.3.2 使用示例
2.3.2.1 启动新进程并绑定到指定 CPU
taskset -c 0,2,3 ./my_program
  • my_program 绑定到 CPU 核心 0、2、3 上运行。

2.3.2.2 查询现有进程的 CPU 亲和性
taskset -p PID
  • 输出为十六进制掩码(如 0x3 表示 CPU 0 和 1)。

2.3.2.3 修改现有进程的 CPU 亲和性
taskset -pc 1,3 PID
  • 将进程 PID 绑定到 CPU 1 和 3。

2.3.2.4 使用掩码(hex 或十进制)绑定
taskset 0x1 ./my_program  # 绑定到 CPU 0(掩码 0x1 = 二进制 0001)
taskset 3 ./my_program     # 绑定到 CPU 0 和 1(掩码 0x3 = 二进制 0011)
2.3.3 掩码与 CPU 核心的对应关系
  • 掩码的每一位代表一个 CPU 核心(从右到左,最低位为 CPU 0):

    • 0x1 (1): CPU 0

    • 0x2 (1): CPU 1

    • 0x3 (3): CPU 0 和 1

    • 0x4 (4): CPU 2

三:小结

3.1 如何查看进程运行在哪个核上

adb shell ps -A -o pid,name,psr

pid是进程的pid,name是进程的名字,psr是进程运行的核

3.2 针对2.2所描述的cgroup绑核

需要对cgroup有细致全面的理解,再进行cgroup的修改,修改影响较大。

本文标签: 获取进程 绑定到 编程