1、安装 taskset
lark@ubuntu:~$ sudo apt-get install util-linux
lark@ubuntu:~$ taskset --help
用法: taskset [选项] [mask | cpu-list] [pid|cmd [args...]]
显示或更改进程的 CPU 关联性。选项:
-a, --all-tasks 对给定 pid
的所有任务(线程)进行作 -p, --pid 对现有的给定 pid
进行作 -c, --cpu-list display 并以列表格式
指定 cpu -h, --help 显示此帮助
-V, --version 显示版本默认行为是运行新命令:
taskset 03 sshd -b 1024
您可以检索现有任务的掩码:
taskset -p 700
或设置它:
taskset -p 03 700
列表格式使用逗号分隔的列表而不是掩码:
taskset -pc 0,3,7-11 700
列表格式的范围可以采用 stride 参数:
例如,0-31:2 等同于掩码 0x55555555有关更多详细信息,请参阅 taskset(1)。
2,,查询确认系统是几个核的
lark@ubuntu:~$ cat /proc/cpuinfo |grep “processor”
处理器 : 0
处理器 : 1
处理器 : 2
处理器 : 3
处理器 : 4
处理器 : 5
处理器 : 6
处理器 : 7
lark@ubuntu:~$ taskset -c -p 3109
PID 3109 的当前亲和力列表:0-7
lark@ubuntu:~$ taskset -a -p 3554
pid 3554 的当前亲和掩码:ff
绑定内核,指定进程pid在cpu_id上 taskset -pc cpu_id PID
lark@ubuntu:~$ taskset -c -p 3109
pid 3109 的当前亲和值列表:0-7
lark@ubuntu:~$
lark@ubuntu:~$ taskset -pc 1 3109
PID 3109 的当前亲和值列表:0-7
PID 3109 的新亲和值列表:1
lark@ubuntu:~$ taskset -c -p 3109
PID 3109 的当前亲和值列表:1
更改具体某一进程(或 线程)CPU亲和性
taskset -p hexadecimal mask PID/LWP
上面号线程可以在0~3号CPU之间允许,现在设置掩码0x11(二进制0001 0001),表示可以在0~3号CPU上允许。
为具体某一进程(或 线程)CPU亲和性指定一组范围
lark@ubuntu:~$ taskset -pc 0,1,2 3109
pid 3109 的当前亲和力列表:7
pid 3109 的新亲和力列表:0-2
lark@ubuntu:~$ taskset -c -p 3109
pid 3109 当前的亲和力列表:0-2
3,内核态函数绑定cpu以及用户态绑定cpu举例
sched_setaffinity()
:绑定线程到 CPU 核心。
#define _GNU_SOURCE
#include <stdio.h>
#include <sched.h>
#include <pthread.h> void* thread_func(void* arg) { cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(1, &cpuset); // 绑定到 CPU 1 if (sched_setaffinity(0, sizeof(cpu_set_t), &cpuset) == -1) { perror("sched_setaffinity failed"); } while (1); // 模拟线程工作 return NULL;
} int main() { pthread_t thread; pthread_create(&thread, NULL, thread_func, NULL); pthread_join(thread, NULL); return 0;
}
2,内核态绑定cpu,set_cpus_allowed_ptr()
:设置内核线程的 CPU 亲和性
<linux/kthread.h>
#include <linux/cpumask.h> static int kernel_thread_func(void* data) { cpumask_var_t mask; alloc_cpumask_var(&mask, GFP_KERNEL); cpumask_clear(mask); cpumask_set_cpu(2, mask); // 绑定到 CPU 2 set_cpus_allowed_ptr(current, mask); while (!kthread_should_stop()) { // 内核线程任务 } return 0;
} static int __init init_module(void) { struct task_struct *task = kthread_run(kernel_thread_func, NULL, "kbind_thread"); return 0;
}
用户态通过sched_setaffinity() 绑定线程,内核态需操作 cpumask和任务调度器绑定内核线程。