Appearance
perf c2c —— 缓存伪共享分析
更新时间:2026-08-06
perf c2c(Cache-to-Cache)分析 CPU 缓存行在多个核之间的共享与争用,是检测 False Sharing(伪共享) 问题的首选工具。
关联:缓存一致性协议、缓存组织、perf-lock.md(锁竞争)、伪共享演示
一、perf c2c 能回答什么问题
| 问题 | 输出中的线索 |
|---|---|
| 哪些缓存行被多个核心争用? | "Shared Cache Line" 列表 |
| 是读共享还是写争用? | HITM(modified)比例 |
| 伪共享发生在哪个数据结构? | 符号名和偏移量定位到具体字段 |
| 哪些 CPU 核在争同一缓存行? | Node 视图显示跨核访问 |
| 争用导致了多少延迟? | %hitm 和 ld_lat(load latency) |
二、基本使用
bash
# 录制(需要采样 load 事件)
perf c2c record -g ./your_program
# 分析
perf c2c report关键:
perf c2c record会采样cpu/mem-loads/和cpu/mem-stores/等 PMU 事件,需要 Intel/AMD 处理器支持。
三、输出解读(核心)
3.1 缓存行争用排行
bash
=================================================
Shared Data Cache Line Table
=================================================
#
# ----------- Cacheline ---------- Total Tot ----- LLC Load Hitm -----
# Index Address Node PA cnt records Hitm Total Lcl Rmt ...
# ..... .................. .... ...... ....... ....... ....... ....... ....... ...
#
0 0x7f1234567800 0 1234 5678 45.23% 2567 1289 1278 ...| 列 | 含义 |
|---|---|
| Address | 缓存行的物理地址 |
| Node | NUMA 节点 |
| records | 该缓存行的采样数 |
| Hitm | LLC Hit Modified 的比例——核心指标 |
| Lcl Hitm | 本节点内的 HITM(同 socket 内争用) |
| Rmt Hitm | 跨节点的 HITM(跨 socket 争用,更严重) |
3.2 HITM 是什么
- HITM(Hit Modified):一个核想读某缓存行,但该行在另一个核的 L1/L2 中以 Modified 状态存在。需要将脏数据写回再转发。这是最昂贵的缓存行访问。
- HITM 比例高 → 多核在争写同一缓存行 → 伪共享或真共享的强烈信号。
3.3 符号解析
perf c2c 能自动关联到符号和偏移量:
bash
Cacheline 0x7f1234567800:
- 0.23% your_program[.] counter # ← 争的就是 counter 这个变量
- 0.15% your_program[.] padding四、常用选项
| 选项 | 含义 |
|---|---|
-g | 记录调用栈 |
--stats | 仅显示统计信息 |
-d <dir> | 指定 perf.data 所在目录 |
-i <file> | 指定 perf.data 文件 |
--stdio | 文本模式输出 |
-f | 显示完整符号名 |
五、诊断流程

六、实战场景
场景 1:多线程计数器性能差
c
// 怀疑伪共享
int counter[NUM_THREADS]; // 多个线程写相邻元素bash
perf c2c record -g ./prog
perf c2c report --stdio如果 counter 所在缓存行 HITM 很高 → 伪共享。修复:加 padding 或使用 per-thread 局部累加。
场景 2:生产者-消费者队列争用
bash
perf c2c record -g -a -- sleep 30
perf c2c report关注队列头尾指针所在的缓存行。如果头尾指针在同一行 → 伪共享(生产者改 tail,消费者读 head)。
七、与 perf lock 的区别
| perf c2c | perf lock | |
|---|---|---|
| 分析对象 | 缓存行共享/争用 | 锁竞争 |
| 回答的问题 | "哪些数据被多核争用" | "哪些锁争用最严重" |
| 适用 | 无锁数据结构、伪共享 | mutex/spinlock/rwsem |
| 关系 | 锁竞争会导致缓存争用,c2c 可以看到锁变量本身的争用 | lock 告诉你"哪个锁在争",c2c 告诉你"缓存层面上怎么争的" |
八、注意事项
- 需要硬件支持:依赖 Intel PEBS / AMD IBS 的 load latency 采样。虚拟机中可能不可用。
- 权限:需要 root 或
CAP_PERFMON。 - 采样开销:
perf c2c record采样 load/store 事件,开销比普通perf record大。 - 区分真共享和伪共享:c2c 告诉你"哪里在争",但不直接告诉你是真共享还是伪共享——需要结合代码逻辑判断。
九、与相关文档的交叉引用
| 场景 | 文档 |
|---|---|
| 缓存一致性协议 | MSI→MESI→MOESI/MESIF/Dragon |
| 缓存组织结构 | 缓存组织与访问 |
| 锁竞争分析 | perf-lock.md |
| 伪共享动手实验 | 伪共享演示 |
| Cache-friendly 编程 | Cache-friendly 编程指南 |
十、一句话总结
perf c2c是缓存争用的"X 光片"——通过 PMU 的 HITM 事件精准定位哪些缓存行在多核间被争抢,让伪共享这个"性能隐形杀手"在符号级别无处遁形。