首页/系统/Linux 内核与性能调优速查/perf c2c 伪共享与缓存行竞争

perf c2c 伪共享与缓存行竞争

通过缓存一致性事件定位伪共享: 多核之间对同一缓存行的竞争会在报告中显现。

伪共享与缓存行竞争

当多个处理器核心反复访问同一条缓存行时,这条缓存行会在核间来回迁移,每次迁移都要等待一致性协调,这就是伪共享。它的典型特征是:线程数增加而性能不升。该工具基于缓存一致性事件(命中已修改数据)把这笔开销归到具体的缓存行、地址与参与竞争的进程上。

基本信息

适用平台Linux,依赖支持一致性事件的硬件
采集方式记录缓存一致性相关事件后生成报告
聚合维度缓存行地址、参与的进程与访问类型
常用参数整机范围记录、按条件排序输出
关键前提硬件与内核支持相应性能事件

典型使用场景

  • 多线程服务扩展性差:增加线程后吞吐不升反降。
  • 定位共享计数器、统计字段与相邻变量造成的竞争。
  • 验证结构调整(对齐、填充)之后竞争是否下降。
  • 把核间竞争与跨节点访存问题区分开。
  • 评估无锁结构是否真的消除了竞争。

记录与报告

记录与报告
perf c2c record -a -- sleep 5          # 整机记录缓存一致性事件
perf c2c report --stats                # 先看汇总统计
perf c2c report --stdio | head -40     # 完整表格,先看竞争次数最高的行
perf c2c report --stdio -c pid,iaddr --sort=hitm   # 按命中修改次数排序,聚焦竞争
# 输出按缓存行聚合,可定位参与竞争的地址与进程

报告关键信息

信息含义判读要点
缓存行地址发生竞争的缓存行结合符号定位共享变量
参与进程访问该行的进程与线程多个线程出现在同一行即竞争
命中修改次数核间迁移次数数值高的行优先处理
访问类型读或写写共享变量最容易产生竞争
硬件不支持相应事件时记录会为空,这是能力问题不是结论;先确认平台支持,再决定是否用它。必要时用程序内的缓存行对齐与结构拆分来验证猜测。
跨处理器节点的内存访问延迟与缓存行竞争都会表现为「多线程变慢」,两者的处置完全不同:前者调亲和性与放置策略,后者改数据结构布局。

易错点

  • 硬件不支持时记录为空却被忽略,白等一轮排查时间。
  • 把核间竞争与跨节点访存混为一谈,优化方向完全不同。
  • 只看汇总数字不下钻到缓存行地址,无法定位到具体变量。
  • 记录范围与时长不加控制,数据量大到难以解读。
  • 改完结构不做前后对比,无法确认竞争是否真的下降。

数据来源与参考

  • man perf-c2c
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌