用 perf 排查内存排序问题
更新时间:2026-10-01。这是 perf 能力边界附近的话题:重排本身难以直接采样,需要专门硬件跟踪和正确内存模型知识。
一、症状与根因
无锁/双检锁/标志位通知在 x86(TSO 较强)正常、在 ARM 上偶发失败,多因 store/load 重排或 store buffer 延迟可见,缺少 acquire/release/屏障。
二、怎么查
- 用硬件指令跟踪(Intel PT / ARM CoreSight ETM)记录执行流,结合时间戳确认观察顺序。
- 在弱序机器上高并发压测提高复现率。
- 审查无锁同步点是否用了正确原子内存序,而不是凭“加个 fence 试试”。

三、常见坑
- 把排序问题当竞态/锁问题处理。
- 乱加 fence 损性能且未必对症。
- 只在 x86 测试。
小结
弱序重排要用硬件跟踪和内存模型知识分析,修复是补“正确”的 acquire/release,而非堆屏障。下一篇 perf 与 eBPF/bpftrace 分工。
总结
无锁、双检锁、标志位通知在 x86(TSO 较强)正常、在 ARM 上偶发失败,根因往往不是锁而是 store/load 重排或 store buffer 延迟可见、缺少正确的 acquire/release/屏障;重排本身很难用 perf 直接“看到”,要靠硬件指令跟踪(Intel PT/ARM CoreSight ETM)结合时间戳确认观察顺序,并在弱序机器上高并发压测提高复现率;修复是核对无锁同步点补上语义正确的内存序,而不是凭“加个 fence 试试”乱堆屏障——那既损性能又未必对症。