如何用Perf排查多核心场景下的写绑定与L3缓存失效问题?
问题背景
我有一个运行速度低于预期的循环,统计单集合处理耗时后发现:
- 使用8核时单集合耗时翻倍,但整体速度仅为4倍提升,且无数据重叠。
- 怀疑问题源于两点:
- 写操作瓶颈:写入2GB数据耗时600ms,预期<250ms;
- 多核互相驱逐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事件推荐
一、排查写操作瓶颈
l2_wcb_req.wcb_write+ls_st_commit_cancel2.st_commit_cancel_wcb_full:前者统计LS单元向L2写合并缓冲区(WCB)的写请求数,后者统计因WCB满导致的写提交取消次数。如果后者数值较高,说明WCB资源不足,写操作被频繁阻塞,这是写入速度不达预期的核心原因之一。mem_inst_retired.stores:统计已完成的存储指令总数,结合实际写入的数据量,可以计算每字节对应的存储指令开销,判断是否存在冗余写操作。l2_store_misses:统计L2存储未命中次数,若该数值偏高,说明写操作频繁穿透到L3甚至内存,大幅增加了写入延迟。cpu_clk_unhalted.thread:统计线程非停顿的时钟周期数,结合存储指令数计算每条存储指令的平均时钟周期消耗,直观判断写操作的执行效率。
二、排查L3缓存竞争问题
AMD CPU的L3缓存事件命名有别于Intel,以下是核心排查事件:
l3_cache_misses+l3_cache_accesses:前者统计L3缓存未命中次数,后者统计L3总访问次数,两者相除可得到L3命中率。若命中率随核心数增加大幅下降(比如低于90%),说明多核间存在严重的L3缓存驱逐竞争。l3_cache_lines_invalidate:统计L3缓存行的无效化次数,数值偏高意味着多核间频繁触发缓存行无效,直接印证了L3驱逐导致其他核心L1/L2失效的猜测。l3_cache_lines_replaced:统计L3缓存行被替换的次数,若该数值随核心数增加激增,说明L3缓存空间不足,驱逐行为过于频繁。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
相关产品推荐
相关产品推荐

