我跑了
perf stat -e itlb_misses.miss_causes_a_walk,itlb_misses.walk_completed,itlb_misses.walk_pending grep Hecuba /storage/nvme6/complete_shakespeare_4096_times
并得到了
Performance counter stats for 'grep Hecuba /storage/nvme6/complete_shakespeare_4096_times':
27,732 itlb_misses.miss_causes_a_walk
13,492 itlb_misses.walk_completed
1,048,087 itlb_misses.walk_pending
0.252038252 seconds time elapsed
显然这三个都是不同的。我运行 perf 的实际工作负载并不重要,因为无论我运行什么工作负载,计数器的相对值都是相似的。
我知道为什么失误会导致步行,但上述似乎暗示并非所有步行都完成。为什么是这样?
另外,为什么待处理的步行比引起的步行大得多?
最后,如果我想了解 itlb 未命中率,我应该使用上述哪个计数器?
答案1
计数器是描述如下:
0x01:(name=miss_causes_a_walk) 在导致页遍历的所有 ITLB 级别上未命中
0x10:(name=walk_pending) 对于忙于指令获取请求的页遍历的每个 PMH,每个周期计数 1。
0x0e:(name=walk_completed)所有 TLB 级别中的代码缺失会导致页面遍历完成。 (所有页面尺寸)
如果页表中实际上没有描述所需的页面,则页面遍历可能无法完成;到达“不存在”页面的页面遍历被视为失败的页面遍历(如果不是推测,则会导致页面错误)。
待处理步行计数器并不反映待处理步行的瞬时数量;它计算浏览页面所花费的周期数。
要计算 iTLB 丢失率,您通常会使用第一个计数器(相对于 iTLB 查询总数)。
也可以看看有关多级分页中页表遍历的详细信息。