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

多核 DMA 性能损耗

核心就 3 条根因:

  1. CPU 缓存一致性(CCE/coherency)冲突
  2. 缓存抖动、反复 flush/invalidate 造成 “空跑周期”
  3. 总线争用、内存带宽瓶颈、跨 NUMA 访问

这些在单核基本不明显,多核高并发 DMA会被剧烈放大。

最核心损耗:Cache 一致性 & 缓存冲刷

DMA 是非一致性访问(绝大多数设备)

  • 设备直接读写内存,不看 CPU Cache
  • CPU 写的数据还在 L1/L2,内存是旧的 → DMA 读错
  • DMA 写完内存,CPU Cache 还是旧的 → CPU 读错

所以内核 / 驱动必须做:

  • flush_dcache_range()// 写回 + 失效
  • invalidate_dcache_range()

这些操作在多核下极贵

多核下缓存操作的真实代价

  • 单个flush不是 “本地核操作”,会穿透整个缓存层次
  • 会引发:
    • 大量cache line 回写内存
    • 其他核的缓存行无效(snoop /invalidate)
    • 总线(AXI/PCIe)大量事务
    • CPU 空等缓存状态同步

典型表现:

  • 核越多,单 DMA 的 overhead 反而上升
  • 系统软中断 / 系统耗时暴涨,但业务计算不重
  • perf top看到大量cacheflushdsbisbbus lock

这就是DMA 导致的多核扩展性极差

第二大损耗:伪共享 & 缓存行乒乓

很多驱动设计:

  • 一个 DMA 描述符(descriptor)被多个核同时访问
  • 完成状态、所有权、控制位混在同一缓存行(64B)

后果:

  • 核 A 改完 → 核 B 的缓存行立即失效
  • 核 B 再改 → 核 A 又失效
  • 缓存行在核之间来回弹跳(ping-pong)

即使没有 DMA 流量,多核并发访问同一个小结构就会吃掉大量性能。

第三大损耗:NUMA 下的跨节点 DMA

  • 设备在 NUMA node 0
  • 内存分配在 node 1
  • DMA + CPU 访问都要走跨 NUMA 链路

表现:

  • 延迟翻倍
  • 带宽上不去
  • 多核并发时NUMA 链路拥塞,所有核一起变慢

第四:PCIe / 总线争用与中断风暴

  • 多设备 / 多队列同时 DMA → PCIe 带宽打满
  • 大量短小包 DMA →往返握手开销 > 数据传输
  • 多核分散处理中断 → 频繁核间迁移、缓存重建

典型:

  • 网卡多队列收小包,CPU 利用率很高但 PPS 上不去
  • 大量sysirqsoftirq,IPC(指令 / 周期)暴跌

内核中 DMA 与缓存一致性的关键机制

1. 两类 DMA 映射(决定你要不要 flush)

(1) 非一致性映射(最常见、最耗性能)

dma_map_single(..., DMA_FROM_DEVICE/TO_DEVICE)
  • 内核必须 flush /invalidate
  • 多核下开销巨大

(2) 一致性映射(coherent)

dma_alloc_coherent()
  • 内存属性设置为Non-cacheable 或 Write-through
  • CPU 写直通内存,不需要 flush
  • 但 CPU 访问极慢,不适合大数据、频繁访问

结论:coherent 省掉 cache flush,但 CPU 访问慢;非 coherent CPU 快,但多核 flush 爆炸。

2. 多核下最痛的点:dma_unmap是隐形杀手

很多人不知道:

dma_unmap_single(..., DMA_FROM_DEVICE)

内部会做:

  • invalidate_dcache_range()
  • 强制丢弃该范围所有缓存

这意味着:CPU 刚处理完的数据,缓存直接被废掉

下一次访问必须从内存重新读 → 性能雪崩。

多核 DMA 性能优化

1. 优先使用DMA 多队列 + 核绑定

  • 每个核 / 每个组独占一个 DMA 通道 / 队列
  • 数据、描述符、缓冲区不跨核共享
  • 中断绑定(irq affinity),避免核间迁移

目标:局部化、无共享、无乒乓


2. 彻底避免不必要的 flush:使用dma_alloc_coherent做控制面

  • 描述符、状态位、门控:放coherent 内存
  • 真正大数据 payload:用非 coherent + 批量 flush

控制面不频繁、小数据;payload 连续、可批量。


3. 缓存行隔离,杜绝伪共享

  • DMA 描述符、完成标志、所有权:每个核独立缓存行
  • 对齐到____cacheline_aligned
  • 只读数据与可写数据分开
struct dma_chan_ctx { dma_desc_t desc; u8 pad[SMP_CACHE_BYTES - sizeof(dma_desc_t)]; } ____cacheline_aligned;

4. 批量 DMA、批量 flush,减少次数

  • 少次多量 > 多次少量
  • 一次flush128KB 远快于 32 次 flush 4KB
  • 合并 DMA 描述符,减少中断 & 缓存操作次数

5. NUMA 亲和:内存与设备同节点

numa_node_id = dev_to_node(dev); buf = alloc_pages_node(numa_node_id, GFP_KERNEL | __GFP_NOWARN, order);
  • DMA 不走跨 NUMA
  • CPU 访问本地内存
  • 多核扩展性立刻提升

6. 尽量使用硬件 IOMMU + snoop 支持(SMMU/Snoop IO)

如果平台 / 设备支持IO coherency(snoopable DMA)

  • 硬件自动保证缓存一致
  • 驱动完全不需要 flush dcache
  • 多核性能几乎无损耗

这是终极解法,但依赖:

  • PCIe NoSnoop = 0
  • 设备支持 ACS、snoop
  • IOMMU 开启并配置正确

核心结论

多核 DMA 性能损耗 90% 来自:缓存 flush/invalidate + 缓存行伪共享 + NUMA 跨节点 + 中断 / 队列未绑定。

最优解:队列核绑定、同 NUMA、缓存隔离、批量 DMA、能开硬件 snoop 就全开。

http://www.jsqmd.com/news/361824/

相关文章:

  • 小白也能上手,2026年OpenClaw(Clawdbot)极速简易部署方案
  • Flutter 三端应用实战:OpenHarmony “废墟回声”——在遗忘的砖石间,为你听见时间的低语
  • 2026年大型集团资产管理系统都有哪些 ?五大优质企业推荐 - 品牌2025
  • AI偏好训练 SOTA模型
  • 天然氧吧的“守护者”:景区负氧离子监测站揭秘
  • 雷达静压水位计
  • Agentic RAG 来了:让大模型自己决定怎么检索,A-RAG 框架全面解析
  • Cross-Modal Redundancy and the Geometry of Vision-Language Embeddings
  • python元宇宙平台的整车生产线管理系统的设计与实现
  • 2025 烟台本地生活团购代运营 TOP 服务商甄选:专业赋能本地商户流量变现与业绩增长 - 野榜数据排行
  • 软考高项:第8章:项目整合管理(占分分析/考点/题)
  • python元宇宙平台的房屋租赁管理系统
  • 什么是HTTP长连接、短连接?谁更能抗DoS攻击?
  • 500永辉超市购物卡回收别着急,1分钟看懂变现价格与避坑指南 - 淘淘收小程序
  • 2026年预言:基因测试员薪资反超量子工程师?——软件测试从业者的专业视角
  • 带标注的USB插口类型识别数据集下载,可识别typeC,HDMI等常见插口插槽,支持yolo,coco json,pascal voc等格式
  • 2026年软件测试新范式:驯化AI为何比优化算法更重要?
  • 你写得越规范,系统越不信你是人?百考通「降重+降AI」,专治“好论文被算法冤枉”
  • 降重省心了!专科生专用的降AI率工具 —— 千笔·降AIGC助手
  • 2026年冷冻干燥机哪家口碑好?售后服务满意度+用户真实反馈排行+专业冷冻干燥机品牌分析 - 品牌推荐大师1
  • web渗透测试入门靶场推荐,从零基础入门到精通,收藏这一篇就够了!
  • 新手也能上手!当红之选的AI论文写作软件 —— 千笔·专业学术智能体
  • 开发转行海洋科技:蓝碳经济中的3个入口
  • 《构建之法》第三章 软件工程师的成长 读书笔记 - GENGAR
  • 【教培管家】小程序实战(五):体验课预约——从流量到转化的闭环
  • 教师录课提词器推荐:芦笋提词器助力高效录制专业网课
  • 不踩雷!AI论文网站 千笔·专业学术智能体 VS PaperRed,研究生专属神器
  • 2026年四川废铜回收厂家TOP5推荐:五大专业企业权威解析报告 - 深度智识库
  • 2026元宇宙营销:AR虚拟形象赋能软件测试开发者IP
  • 空调集中管理控制系统解决方案:全域管控,节能调度智慧运维