news 2026/6/8 11:18:40

多核 DMA 性能损耗

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
多核 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 就全开。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 10:57:13

ACN配电监控模块:过流保护+能耗统计,工业场景适配

智能配电监控模块主要用于实时监测、保护、控制、远程管理配电回路,广泛覆盖需要稳定供电、能耗管理、安全报警、无人值守的场景。一、规格分类 4DO(50A)4DI4AI485232 50A电流检测4DO(50A)4DI4AI485232 50A电流检测4DO(50A)4DI4AI网口485232 50A电流检测4DO(50A)4DI…

作者头像 李华
网站建设 2026/5/31 12:00:07

ACN配电监控模块:4路/8路全电参监控,50A磁保持继电器长效运行

ACN配电监控模块是一款集成监测、控制、保护、远程管理功能于一体的智能电力终端设备,特别适用于照明与动力配电回路的精细化管理,通过内置磁保持继电器与智能芯片,实现“监、控、保、管”全流程智能化。一、核心定位 ACN配电监控模块是智能配…

作者头像 李华
网站建设 2026/5/29 0:43:03

天然氧吧的“守护者”:景区负氧离子监测站揭秘

走进山林景区,清新的空气总能让人神清气爽,这背后离不开“空气维生素”——负氧离子的滋养。而撑起这片“天.然氧吧”的,还有一位默默坚守的“守护者”,它就是景区负氧离子监测站。看似不起眼的它,藏着太多鲜为人知的奥…

作者头像 李华
网站建设 2026/6/5 16:19:16

招人求职哪个平台好用?2026招聘平台效果排行榜揭晓

在人才竞争日益激烈的当下,企业HR和求职者都面临一个共同难题:如何高效、精准地完成人岗匹配?传统“海投简历”“广撒网式招聘”已难以满足快节奏的职场需求。据艾瑞咨询《2025年中国智能招聘行业报告》显示,超68%的企业希望借助A…

作者头像 李华
网站建设 2026/6/3 3:27:14

教师录课提词器推荐:芦笋提词器助力高效录制专业网课

在当下教育信息化高速发展的背景下,越来越多教师加入了线上课程录制的队伍。无论是网课、知识付费内容,还是大大小小的教学比赛,屏幕前的教学表达已然成为教师职业能力的重要一环。然而,很多老师初次录制课程时常常会遇到这样的困…

作者头像 李华