x86架构TLB缺失后流程及perf测量异常排查咨询
TLB/STLB缺失后页结构缓存机制的perf测量异常问题
我正在研究TLB/STLB缺失后页缺失处理程序(PMH)/页结构缓存的工作机制,使用perf工具计数器测量时得到了意外结果:对一个随机写入1GB数组的程序进行基准测试,分别采用2MB和4KB页配置,结果显示L1 TLB/DTLB命中率与运行时间正相关,这与我的预期完全相反。

我怀疑在页面遍历过程中,或是TLB/STLB缺失后搜索PDP/PDE/PML4缓存时,存在未被考虑的额外TLB/STLB访问。以下是我梳理的页表遍历流程:

补充信息:
- 基准测试代码逻辑:随机生成数组索引,对1GB数组的对应位置执行写入操作,循环足够次数以保证统计有效性
- 测试环境:Haswell Xeon E3处理器,TLB规格如下:

验证猜想的可行方案
1. 针对性perf事件计数
直接统计页表遍历过程中的TLB访问相关事件,Haswell架构支持以下关键perf事件:
dtlb_load_misses.walk_pending:DTLB缺失后触发页表遍历的次数dtlb_load_misses.walk_completed:完成的页表遍历次数page_walks.dtlb:DTLB缺失引发的页表遍历层级统计page_walks.stlb:STLB缺失引发的页表遍历层级统计
执行命令示例:
perf stat -e dtlb_load_misses.walk_pending,dtlb_load_misses.walk_completed,page_walks.dtlb,page_walks.stlb ./your_program
对比2MB和4KB页配置下的这些事件数,验证是否与TLB命中率、运行时间的异常相关性匹配。
2. 页结构缓存命中/缺失统计
Haswell的页结构缓存(PML4/PDP/PDE缓存)有对应的perf事件:
l2_pend_miss.pf:L2缓存中页结构相关的缺失page_walks.memory_reference:页表遍历过程中访问内存的次数
通过这些事件可判断页结构缓存的命中情况是否影响TLB访问次数,进而解释运行时间的异常。
3. 硬件性能计数器精确采样
使用perf record采样具体指令与事件的关联,定位页表遍历过程中的TLB访问:
perf record -g -e dtlb_load_misses.walk_pending ./your_program perf report --stdio
查看采样到的调用栈,确认页表遍历过程中是否触发了额外TLB访问,尤其是内核态页缺失处理流程中的访问。
4. 控制变量法验证
- 将数组访问模式改为顺序访问,对比随机访问下的TLB命中率与运行时间,观察相关性是否变化
- 调整数组大小(如2GB、512MB),验证TLB命中率与运行时间的异常关系是否稳定,排除内存带宽等其他因素干扰
- 关闭透明大页(THP)等系统特性,确保2MB页配置完全手动可控,避免系统自动调整页大小影响结果
5. 结合CPU架构文档分析
查阅Haswell架构官方手册(Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3),确认页表遍历过程中是否存在隐含TLB访问:比如页结构缓存的访问是否会触发STLB查询,或页缺失处理程序本身的指令是否产生额外TLB缺失。
内容的提问来源于stack exchange,提问作者Hod Badihi
相关产品推荐
相关产品推荐

