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.launcher32.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_20142.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-72.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 00x2(1): CPU 10x3(3): CPU 0 和 10x4(4): CPU 2
三:小结
3.1 如何查看进程运行在哪个核上
adb shell ps -A -o pid,name,psr
pid是进程的pid,name是进程的名字,psr是进程运行的核
3.2 针对2.2所描述的cgroup绑核
需要对cgroup有细致全面的理解,再进行cgroup的修改,修改影响较大。
版权声明:本文标题:进程绑定优化:提升性能与节能的策略, 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1774378292a3571049.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论