在 Linux 下,将进程或线程绑定到指定 CPU(CPU 亲和性,CPU affinity)有多种方式,下面按使用场景和难易程度给你总结。
taskset(推荐,最简单)taskset -p <pid>
taskset -c 1 ./your_program
taskset -c 0,2,3 ./your_program
taskset -pc 1 <pid>
✅ 优点:无需改代码
❌ 缺点:只能整体控制
sched_setaffinity(系统调用)#define _GNU_SOURCE
#include <sched.h>
#include <unistd.h>
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(1, &mask); // 绑定到 CPU 1
sched_setaffinity(0, sizeof(mask), &mask);
绑定线程:
sched_setaffinity(pthread_self(), sizeof(mask), &mask);
✅ 精确控制线程级
❌ 需要代码支持
pthread_setaffinity_npcpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(2, &cpuset);
pthread_setaffinity_np(pthread_self(), sizeof(cpuset), &cpuset);
适合:
docker run --cpuset-cpus="0,1" my_image
resources:
limits:
cpu: "2"
requests:
cpu: "2"
或
cpuset: "0-3"
numactl --cpunodebind=0 --membind=0 ./app
常用于:
lscpu
nproc
cat /proc/cpuinfo
⚠️ 绑 CPU 不会提升性能,只在以下情况有用:
⚠️ 绑定过多进程到同一 CPU 会反而变慢
如果你能告诉我:
我可以给你更精确的方案。