当前位置: 首页 > backend >正文

Linux CPU 亲和性

🌟 概述

CPU 亲和性(CPU Affinity)是指将线程(或任务)绑定到特定 CPU 核心运行,以优化性能、减少缓存失效或确保实时任务的确定性。在 Linux 中,CPU 亲和性常与调度策略(如 SCHED_FIFO、SCHED_RR、SCHED_OTHER)结合使用。

🔍 核心概念

  • 定义:通过设置线程的 CPU 亲和掩码(affinity mask),限制其运行的 CPU 核心。
  • 目的
    • 提高缓存命中率,减少跨核心数据迁移。
    • 降低上下文切换开销,提升实时任务确定性。
    • 隔离任务,避免多核干扰。
  • 调度单位:线程(Linux 内核的任务)。
  • 与调度策略的关系
    • SCHED_FIFO/SCHED_RR:亲和性可确保实时线程固定在高性能核心,减少延迟。
    • SCHED_OTHER (CFS):亲和性优化普通任务的缓存局部性。

🛠️ 主要 API

以下是 Linux 中管理 CPU 亲和性的核心 API(定义在 <sched.h>):

1. sched_setaffinity

int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);
  • 功能:设置线程的 CPU 亲和掩码。
  • 参数
    • pid:线程 ID(0 表示当前线程)。
    • cpusetsize:掩码大小(通常为 sizeof(cpu_set_t))。
    • maskcpu_set_t 类型,指定允许的 CPU 核心。
  • 返回值:成功返回 0,失败返回 -1(检查 errno)。

2. sched_getaffinity

int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);
  • 功能:获取线程的 CPU 亲和掩码。
  • 返回值:成功返回 0,失败返回 -1。

3. cpu_set_t 操作宏

  • 定义cpu_set_t 是一个位图,表示 CPU 核心。
  • 常用宏
    • CPU_ZERO(&set):清空掩码。
    • CPU_SET(cpu, &set):添加 CPU 核心(cpu 从 0 开始)。
    • CPU_CLR(cpu, &set):移除 CPU 核心。
    • CPU_ISSET(cpu, &set):检查 CPU 是否在掩码中。

⚠️ 注意事项

  • 权限:普通用户可设置亲和性,但受系统限制(如 cgroupnumactl 配置)。
  • 实时调度:SCHED_FIFO/SCHED_RR 结合亲和性可提高确定性,但高优先级线程可能导致低优先级线程饿死。
  • 多核影响:绑定单一核心可能限制并行性,需权衡。
  • 动态调整:亲和性可随时修改,但频繁更改可能增加开销。
  • 工具:使用 taskset 命令查看/设置亲和性(如 taskset -c 0,1 <pid> 绑定到 CPU 0 和 1)。

📊 CPU 亲和性与调度策略结合

调度策略亲和性用途注意点
SCHED_FIFO绑定高性能核心,确保硬实时低延迟避免低优先级线程饿死
SCHED_RR固定核心,减少软实时任务切换时间片切换可能受核心负载影响
SCHED_OTHER优化缓存局部性,提升普通任务性能动态调度可能削弱亲和性效果

✅ 优点

  • 提高缓存效率,减少跨核心迁移。
  • 增强实时任务确定性。
  • 隔离任务,降低干扰。

🚫 局限性

  • 绑定单一核心可能降低多核利用率。
  • 配置不当可能导致负载不均。
  • 不适合频繁迁移的动态任务。
http://www.xdnf.cn/news/13687.html

相关文章:

  • ARM架构下安装mysql8.0
  • Dagster软件定义资产(SDA)完全指南:从概念到落地实践
  • 研发效能提升--质量改进完美闭环
  • TTS走向拟人化时代:数据堂高质量语音资源全面支撑模型升级
  • 库架一体式货架:重塑现代仓储空间的智能解决方案
  • 简单的五子棋实现简介
  • 【【大模型训练】中短序列attention 和MOE层并行方式】(三)
  • 从编辑到安全设置: 如何满足专业文档PDF处理需求
  • 汇编字符串比较函数
  • yapi服务端可视化安装
  • C++设计模式:八股文
  • (简单介绍)EleutherAI
  • MS8188是一款36V高精度低噪声的运算放大器,采用高压斩波技术来实现零温漂的特性,可替代LT1012/ADA4522/MAX44244/TPA1831
  • π0.5与π0区别
  • Mentalab Explore 开源 EEG 软件方案:构建开放兼容的脑电研究生态
  • 动态规划1——线性动态规划
  • 创客匠人助力家庭教育IP破局:从0到1打造创始人个人品牌全攻略
  • Android Compose 自定义滑动进度条
  • RAGFlow迁移到GPU服务器(Docker容器元数据修复)
  • Springboot3+的id字符串转化问题
  • LaTeX常用数学公式语法
  • 香橙派3B学习笔记10:snap打包C/C++程序与动态链接库(.so)
  • 数组方法_join()+_concat()+_reverse()+ _indexOf()
  • MS5110模数转换器可pin to pin兼容ADS1110
  • 「AI产业」| 《2025中国低空经济商业洞察报告(商业无人机应用篇)》
  • 【mysql】联合索引和单列索引的区别
  • Ceph分布式存储方案
  • 比亚迪座舱接入通义大模型,未来将联合打造更多AI智能座舱场景
  • 【JUC面试篇】Java并发编程高频八股——线程与多线程
  • 各项目变更频繁时,如何保持整体稳定