You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Perf排查多核心场景下的写绑定与L3缓存失效问题?

问题背景

我有一个运行速度低于预期的循环,统计单集合处理耗时后发现:

  • 使用8核时单集合耗时翻倍,但整体速度仅为4倍提升,且无数据重叠。
  • 怀疑问题源于两点:
    1. 写操作瓶颈:写入2GB数据耗时600ms,预期<250ms;
    2. 多核互相驱逐L3缓存中的数据,导致实际仅能使用L1/L2缓存。
  • 额外疑问:某核心是否可通过驱逐L3缓存项来淘汰其他核心的L1/L2数据?

我尝试用Perf工具排查,但不清楚该选用哪些事件。搜索写相关事件得到如下结果:

$ perf list | grep -iP "(write|wcb|wt)"
    l2_wcb_req.cl_zero
        [LS to L2 WCB cache line zeroing requests. LS (Load/Store unit) to L2
            WCB (Write Combining Buffer) cache line zeroing requests]
    l2_wcb_req.wcb_close
        [LS to L2 WCB close requests. LS (Load/Store unit) to L2 WCB (Write
    l2_wcb_req.wcb_write
        [LS to L2 WCB write requests. LS (Load/Store unit) to L2 WCB (Write
            Combining Buffer) write requests]
    l2_wcb_req.zero_byte_store
        [LS to L2 WCB zero byte store requests. LS (Load/Store unit) to L2 WCB
            (Write Combining Buffer) zero byte store requests]
    ls_st_commit_cancel2.st_commit_cancel_wcb_full

已排查情况:

  • TLB相关数值不高;
  • l2_cache_accesses_from_dc_misses显示L1缺失后L2命中率很高,但无法获取L3缓存相关信息(使用AMD CPU)。

请问应该尝试哪些Perf事件?


问题解答

关于L3缓存驱逐对其他核心L1/L2的影响

没错,某核心驱逐L3缓存行时,会触发MESI缓存一致性协议的无效信号:其他核心中对应缓存行的L1/L2副本会被标记为无效。后续这些核心访问该缓存行时,会出现缓存未命中,需要重新从内存或L3加载,这会显著增加访问延迟,直接拖慢单核心处理速度。

针对AMD CPU的Perf事件推荐

一、排查写操作瓶颈

  1. l2_wcb_req.wcb_write + ls_st_commit_cancel2.st_commit_cancel_wcb_full:前者统计LS单元向L2写合并缓冲区(WCB)的写请求数,后者统计因WCB满导致的写提交取消次数。如果后者数值较高,说明WCB资源不足,写操作被频繁阻塞,这是写入速度不达预期的核心原因之一。
  2. mem_inst_retired.stores:统计已完成的存储指令总数,结合实际写入的数据量,可以计算每字节对应的存储指令开销,判断是否存在冗余写操作。
  3. l2_store_misses:统计L2存储未命中次数,若该数值偏高,说明写操作频繁穿透到L3甚至内存,大幅增加了写入延迟。
  4. cpu_clk_unhalted.thread:统计线程非停顿的时钟周期数,结合存储指令数计算每条存储指令的平均时钟周期消耗,直观判断写操作的执行效率。

二、排查L3缓存竞争问题

AMD CPU的L3缓存事件命名有别于Intel,以下是核心排查事件:

  1. l3_cache_misses + l3_cache_accesses:前者统计L3缓存未命中次数,后者统计L3总访问次数,两者相除可得到L3命中率。若命中率随核心数增加大幅下降(比如低于90%),说明多核间存在严重的L3缓存驱逐竞争。
  2. l3_cache_lines_invalidate:统计L3缓存行的无效化次数,数值偏高意味着多核间频繁触发缓存行无效,直接印证了L3驱逐导致其他核心L1/L2失效的猜测。
  3. l3_cache_lines_replaced:统计L3缓存行被替换的次数,若该数值随核心数增加激增,说明L3缓存空间不足,驱逐行为过于频繁。
  4. dc_accesses + dc_misses:前者是数据缓存总访问数,后者是数据缓存未命中数。结合你已有的L2命中数据,若L1/L2命中率高但L3命中率低,说明大部分未命中都穿透到L3甚至内存,是L3竞争的典型表现。

三、实用采样命令示例

可以同时采样多个关键事件,快速定位瓶颈:

perf stat -e mem_inst_retired.stores,l2_store_misses,l3_cache_misses,l3_cache_accesses,cpu_clk_unhalted.thread ./your_program

也可以采集事件并记录调用栈,后续分析热点函数的缓存行为:

perf record -e l3_cache_misses,ls_st_commit_cancel2.st_commit_cancel_wcb_full -g ./your_program
perf report

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 02:06:06