systemd服务配置CPUAffinity是唯一可靠的持久化方式:必须写在[Service]段,格式为空格分隔的编号或范围(如CPUAffinity=0 2 4或0-3),不支持逗号;多行配置会被逻辑OR合并;修改后需daemon-reload并restart服务。

systemd 服务配置 CPUAffinity 是唯一可靠的持久化方式
Linux 没有“系统级全局亲和力开关”,所谓“设置系统进程绑定规则”,实际是指对 systemd 管理的服务进程(如 sshd、nginx、redis-server)做差异化、可重启生效的绑定。直接改内核参数或试图统一约束所有进程,不仅无效,还可能卡死 SSH 或中断响应。
关键点在于:CPUAffinity 必须写在服务单元文件的 [Service] 段里,且只影响该服务主进程及其显式 fork 的子进程(不自动继承):
-
CPUAffinity=0 2 4表示允许运行在逻辑 CPU 0、2、4 上;CPUAffinity=0-3表示允许 CPU 0/1/2/3 - 不支持逗号分隔,不支持
CPUAffinity=0,2这种写法;混合范围与单数(如0-1 3)是合法的 - 多行
CPUAffinity=会被 systemd 合并为逻辑 OR,例如同时写CPUAffinity=0 1和CPUAffinity=4 5,等效于允许在 CPU 0/1/4/5 上运行 - 修改后必须执行
sudo systemctl daemon-reload && sudo systemctl restart servicename.service,仅daemon-reload不会重载已运行进程
taskset -pc 对已运行进程重绑定常失败,原因要逐条排查
执行 taskset -pc 1,3 1234 看似成功,但几秒后进程又跑到了其他核上——这不是命令失效,而是调度器在干预:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 进程内部调用了
sched_setaffinity(比如 Java JVM 启动时加了-XX:+UseNUMA或 Go runtime 自动调整),覆盖了 shell 层面的设置 - 目标 CPU 被
isolcpus内核参数隔离,但没通过cpusetcgroup 显式授权,导致调度器拒绝迁移 - 进程使用了
SCHED_FIFO实时策略,而你指定的 CPU 正被高优先级 IRQ 占满,内核强制迁出以保障中断响应 -
taskset只作用于当前进程,其fork()出的子进程默认继承全开掩码(0xffffffff),不会自动延续绑定
C/C++ 中调用 sched_setaffinity 必须检查返回值和运行时条件
代码级控制适用于工作线程池、DPDK、实时音频等场景,但“设上就行”是最大误区:
- 必须检查
sched_setaffinity()返回值:if (sched_setaffinity(0, sizeof(cpuset), &cpuset) == -1),常见失败原因包括:EPERM(非 root 绑隔离核)、EINVAL(CPU 编号越界或已 offline)、EIO(cgroup 限制冲突) - 不要硬编码 CPU 编号,先用
sysconf(_SC_NPROCESSORS_ONLN)获取在线核数,再结合lscpu输出的 topology 判断物理核/超线程关系 - 若需绑定到某个物理核的两个逻辑核(HT),应显式
CPU_SET(0, &cpuset); CPU_SET(1, &cpuset);,不能只设CPU_SET(0, &cpuset)期望自动包含超线程伙伴 - 线程级绑定要用
pthread_setaffinity_np(),传入真实线程 ID,而非进程 PID
绑定前不看 lscpu 和 NUMA 拓扑,90% 的性能优化会适得其反
盲目按编号绑 CPU 0/1/2/3,很可能跨 NUMA 节点访问内存,延迟翻倍:
- 运行
lscpu查看NUMA node(s)、CPU(s)、Core(s) per socket和Socket(s),确认逻辑 CPU 编号与物理位置的映射 - 在 NUMA 系统中,优先将进程、其使用的内存、网卡 RSS 队列、GPU 设备绑定在同一 NUMA 节点内;例如
numactl --cpunodebind=0 --membind=0 ./app - 超线程环境下,同物理核的两个逻辑 CPU(如 0 和 1)共享 L1/L2 缓存,高吞吐服务建议错开使用(如绑 0/2/4…),避免缓存争抢
- 务必预留至少 1–2 个 CPU 给系统:IRQ、
ksoftirqd、sshd、监控 agent,否则绑死会导致系统失联或中断饥饿
taskset -cp PID → 监控 perf sched latency 和缓存命中率”。最容易被忽略的是:绑定只是起点,后续的中断分布、内存分配策略、cgroup 限制,都会动态覆盖它。

















