taskset -c 0 可将进程绑定到0号逻辑核心,但需先用lscpu确认物理拓扑;运行中可用taskset -cp 0 pid重绑定,taskset -p pid查看当前亲和性;进程可能因内部调用、子进程继承或调试器接管而“逃逸”,应结合ps -o pid,psr检查实际运行核;多线程程序须在各关键线程内调用sched_setaffinity;相比taskset的进程级瞬时控制,cpuset cgroup提供持久化、隔离与配额能力。

taskset 命令怎么绑定进程到单个 CPU 核心
直接用 taskset -c 0 就能绑到 0 号核心,但注意:数字从 0 开始,不是从 1;核心编号不等于物理 CPU 插槽编号,得看 /proc/cpuinfo 或 lscpu 确认真实拓扑。
常见错误是以为 taskset -c 1 绑的是“第一个物理核”,结果绑到了超线程的逻辑核上,实际和另一个进程挤同一物理单元。建议先用 lscpu | grep "CPU\(s\)" 和 lscpu | grep "Core\(s\) per socket" 搞清逻辑核与物理核映射关系。
-
taskset -c 0 ./myapp:启动时绑定 -
taskset -cp 0 <code>pid:运行中重绑定(需权限,普通用户只能绑自己进程) - 绑定后检查:
taskset -p <code>pid,输出类似pid's current affinity mask: 00000001,对应二进制最低位为 1 表示只用了 core 0
为什么 taskset 绑定后进程还是跑其他核上
根本原因:Linux 调度器会尊重 cpu_affinity,但某些场景下仍可能“逃逸”——比如进程主动调用 sched_setaffinity() 改了亲和性,或被 ptrace、调试器临时接管,又或者内核线程(如 ksoftirqd)不受用户态 taskset 控制。
更隐蔽的是:如果进程 fork 出子进程,默认继承父进程的 CPU 亲和性掩码;但若子进程自己调用 sched_setaffinity() 或被 systemd 等管理器重设,就失效了。所以不能只绑父进程,得确认关键工作线程是否也被覆盖。
- 用
ps -o pid,psr,comm -p <code>pid实时看当前运行在哪颗核(psr列) - 长期观察用
watch -n1 'taskset -p <code>pid; ps -o pid,psr,comm -ppid' - 如果
psr频繁跳变,大概率是进程内部改了亲和性,或用了线程池且未统一设置
Python / C 程序里怎么在代码里绑定 CPU 而不依赖 shell
靠外部 taskset 启动不保险,尤其多线程服务;得在代码里调用系统 API 主动设亲和性。
Python 用 os.sched_setaffinity()(3.3+),C 用 sched_setaffinity() 系统调用。注意:必须在主线程设置,子线程默认继承,但 pthread 创建后若没显式设置,可能被调度到任意核。
- Python 示例:
os.sched_setaffinity(0, {0})—— 把当前进程(pid 0 表示调用者)绑到 core 0 - C 示例:
cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(0, &cpuset); sched_setaffinity(0, sizeof(cpuset), &cpuset); - 别在多线程程序里只绑主线程:每个关键 worker 线程都应单独调用,否则线程间负载不均
- 调用失败会返回 -1 并设 errno,常见
EPERM(权限不足)、EINVAL(core 编号越界)
taskset 和 cgroups v2 的 CPUSet 有什么区别
taskset 是进程级、瞬时、无持久策略的亲和性控制;cpuset cgroup 是资源控制器级、可嵌套、带配额和隔离能力的完整 CPU 分配方案。
比如你只想让某服务固定用 2、3 号核,taskset -c 2,3 能做到;但如果你还要求它不能超过 50% 的 CPU 时间、不能和数据库进程争核、重启后自动恢复绑定——那就得上 cpuset + cpu cgroup v2,taskset 做不到这些。
-
taskset不防其他进程抢占目标核,cpuset可以把核独占(cpuset.cpus.exclusive = 1) -
taskset对 fork 子进程有效,但对容器、systemd service 单元不天然集成;cgroup 配合 systemd 的AllowedCPUs=才真正落地 - 混用风险:先用 cgroup 限定了可用核,再用
taskset绑一个不在该集合里的核,会失败并报Operation not permitted
真要稳定压测或低延迟场景,别只信 taskset —— 它只是第一层胶带,后面还得补 cgroup、IRQ 绑定、甚至 BIOS 关超线程。










