如何检测和分析伪共享¶
perf record/report/stat 被广泛用于性能调优,一旦检测到热点,可以使用 ‘perf-c2c’ 和 ‘pahole’ 等工具进一步检测和精确定位可能的伪共享数据结构。当存在多层内联函数时,‘addr2line’ 也擅长解码指令指针。
perf-c2c 可以捕获具有最多伪共享命中的缓存行、访问该缓存行的解码函数(文件行号)以及数据的内联偏移量。简单的命令是
$ perf c2c record -ag sleep 3
$ perf c2c report --call-graph none -k vmlinux
在测试期间运行上述命令将-it-scale 的 tlb_flush1 案例时,perf 报告类似以下内容
Total records : 1658231
Locked Load/Store Operations : 89439
Load Operations : 623219
Load Local HITM : 92117
Load Remote HITM : 139
#----------------------------------------------------------------------
4 0 2374 0 0 0 0xff1100088366d880
#----------------------------------------------------------------------
0.00% 42.29% 0.00% 0.00% 0.00% 0x8 1 1 0xffffffff81373b7b 0 231 129 5312 64 [k] __mod_lruvec_page_state [kernel.vmlinux] memcontrol.h:752 1
0.00% 13.10% 0.00% 0.00% 0.00% 0x8 1 1 0xffffffff81374718 0 226 97 3551 64 [k] folio_lruvec_lock_irqsave [kernel.vmlinux] memcontrol.h:752 1
0.00% 11.20% 0.00% 0.00% 0.00% 0x8 1 1 0xffffffff812c29bf 0 170 136 555 64 [k] lru_add_fn [kernel.vmlinux] mm_inline.h:41 1
0.00% 7.62% 0.00% 0.00% 0.00% 0x8 1 1 0xffffffff812c3ec5 0 175 108 632 64 [k] release_pages [kernel.vmlinux] mm_inline.h:41 1
0.00% 23.29% 0.00% 0.00% 0.00% 0x10 1 1 0xffffffff81372d0a 0 234 279 1051 64 [k] __mod_memcg_lruvec_state [kernel.vmlinux] memcontrol.c:736 1
关于 perf-c2c 的一个很好的介绍是 [3]。
‘pahole’ 解码以缓存行粒度分隔的数据结构布局。用户可以将 perf-c2c 输出中的偏移量与 pahole 的解码匹配,以定位确切的数据成员。对于全局数据,用户可以在 System.map 中搜索数据地址。