如何在Linux中设置具体的系统进程亲和力绑定规则

陌雪小哥_6677

陌雪小哥_6677

2026-08-09

1015人浏览

原创

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

如何在linux中设置具体的系统进程亲和力绑定规则

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 Linux Hardware Debug
Zynq Linux Hardware Debug

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 内核参数隔离,但没通过 cpuset cgroup 显式授权,导致调度器拒绝迁移
  • 进程使用了 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,否则绑死会导致系统失联或中断饥饿
实际生效的绑定从来不是“设完就稳”,而是“查拓扑 → 定策略 → 配 systemd 或写代码 → 验证 taskset -cp PID → 监控 perf sched latency 和缓存命中率”。最容易被忽略的是:绑定只是起点,后续的中断分布、内存分配策略、cgroup 限制,都会动态覆盖它。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

4010

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

3433

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

2593

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

6310

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

5962

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

3473

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

2965

4

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

2023.07.25

3199

6

linux查找文件命令
linux查找文件命令

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.31

297

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习