伪共享¶

伪共享¶

如何检测和分析伪共享¶

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 中搜索数据地址。

相关文章