最可靠、最常用的方式是通过 systemd 单元文件设置 cpuaffinity,它在服务启动时自动生效且重启后保持;需在 [service] 段添加 cpuaffinity=0 2 4 6 等合法格式,不支持逗号或混合写法。
服务管理中配置服务绑定特定 cpu 核心,最可靠、最常用的方式是通过 systemd 单元文件 设置 cpuaffinity。它在服务启动时自动生效,且系统重启后仍保持,无需额外脚本或手动干预。
确认当前可用 CPU 核心编号
执行以下命令查看逻辑 CPU 列表(编号从 0 开始):
-
nproc—— 显示总逻辑 CPU 数 -
lscpu | grep "CPU(s):"—— 查看在线 CPU 范围 -
cat /proc/cpuinfo | grep "processor" | tail -5—— 确认最高编号(如含 processor : 7,则核心为 0–7)
编辑 systemd 服务单元文件
以 nginx 为例(替换为你自己的服务名):
- 运行
sudo systemctl edit --full nginx.service(推荐,避免覆盖更新)或直接编辑/etc/systemd/system/nginx.service - 在
[Service]段落中添加一行:CPUAffinity=0 2 4 6—— 表示只允许在 CPU 0、2、4、6 上运行
或写成范围:CPUAffinity=0-3—— 允许 CPU 0 到 3 - 注意:不支持逗号分隔,也不支持混合写法(如
0,2-4是非法的)
重载配置并验证生效
保存后执行:
sudo systemctl daemon-reloadsudo systemctl restart nginx- 检查是否生效:
sudo systemctl show nginx --property=CPUAffinity - 进一步确认进程实际绑定情况:
taskset -cp $(pgrep -f "nginx: master")
进阶提示:多组亲和性与 NUMA 场景
若需为不同工作负载分配非连续核心(例如隔离控制面与数据面),可写多行:
CPUAffinity=0 1CPUAffinity=4 5- systemd 会将其合并为逻辑 OR,即允许在 {0,1,4,5} 中任一核心运行
- 在 NUMA 多插槽服务器上,建议配合
numactl --cpunodebind=0 --membind=0使用,但 systemd 本身不解析 numactl,需改用 ExecStart 封装(不推荐,破坏声明式管理)
不复杂但容易忽略:CPUAffinity 只影响该服务主进程及其子进程(继承机制),若服务内部分叉出大量线程且未做线程级绑定,仍可能跨核调度——此时需结合代码层 pthread_setaffinity_np 或 sched_setaffinity 补充控制。











