温馨提示×

linux进程如何绑定cpu

小樊
43
2026-10-21 02:03:02
栏目: 智能运维

在 Linux 下,将进程或线程绑定到指定 CPU(CPU 亲和性,CPU affinity)有多种方式,下面按使用场景和难易程度给你总结。


一、启动时就绑定(最常用)

1️⃣ taskset(推荐,最简单)

查看进程当前绑定

taskset -p <pid>

启动新进程并绑定到 CPU 1

taskset -c 1 ./your_program

绑定到多个 CPU(如 0、2、3)

taskset -c 0,2,3 ./your_program

修改已运行进程

taskset -pc 1 <pid>

✅ 优点:无需改代码
❌ 缺点:只能整体控制


二、在程序中绑定(C / C++)

2️⃣ 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)

3️⃣ pthread_setaffinity_np

cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(2, &cpuset);

pthread_setaffinity_np(pthread_self(), sizeof(cpuset), &cpuset);

适合:

  • 多线程服务器
  • NUMA 优化
  • 实时系统

四、容器 / 虚拟化场景

4️⃣ Docker

docker run --cpuset-cpus="0,1" my_image

5️⃣ Kubernetes

resources:
  limits:
    cpu: "2"
  requests:
    cpu: "2"

或

cpuset: "0-3"

五、NUMA 场景(高级)

numactl --cpunodebind=0 --membind=0 ./app

常用于:

  • 数据库
  • 高性能计算
  • 低延迟系统

六、查看 CPU 信息

lscpu
nproc
cat /proc/cpuinfo

七、常见注意事项

⚠️ 绑 CPU 不会提升性能,只在以下情况有用:

  • 减少上下文切换
  • 避免跨 NUMA 访问
  • 实时性要求
  • 避免 CPU 迁移导致的缓存失效

⚠️ 绑定过多进程到同一 CPU 会反而变慢


如果你能告诉我:

  • 是 进程还是线程
  • 用 C / Java / Python / Shell
  • 是否 容器 / 服务器 / 实时系统

我可以给你更精确的方案。

0 踩