【发布时间】:2021-08-03 09:43:24
【问题描述】:
我有一个Intel(R) Core(TM) i7-4720HQ CPU @ 2.60GHz (Haswell) 处理器。在相对空闲的情况下,我运行了以下Perf 命令,它们的输出显示在下面。计数器是offcore_response.all_data_rd.l3_miss.any_response 和mem_load_uops_retired.l3_miss:
sudo perf stat -a -e offcore_response.all_data_rd.l3_miss.any_response,mem_load_uops_retired.l3_miss sleep 10
Performance counter stats for 'system wide':
3,713,037 offcore_response.all_data_rd.l3_miss.any_response
2,909,573 mem_load_uops_retired.l3_miss
10.016644133 seconds time elapsed
这两个值似乎一致,因为后者排除 预取请求和那些不以@987654334为目标的请求@。但它们确实不与IMC 中的读取计数器匹配。此计数器称为UNC_IMC_DRAM_DATA_READS,并记录在案here。我阅读计数器重读它1 秒后。差异在30,000,000 (EDITED) 左右。如果 乘 乘以 10(估计 10 秒),结果值将在 300 百万 (EDITED) 左右,即 100 times 上述性能计数器(EDITED)的值。它在3 百万附近无处!我缺少什么?
P.S.:当系统有更多负载时,差异要小得多(但仍然很大)。
这个问题也被问到了,这里: https://community.intel.com/t5/Software-Tuning-Performance/Performance-Counters-and-IMC-Counter-Not-Matching/m-p/1288832
更新:
请注意,PCM 输出与我的 IMC 计数器读数相匹配。
这是相关的PCM 输出:
READ、WRITE 和 IO 列的值分别基于 UNC_IMC_DRAM_DATA_READS、UNC_IMC_DRAM_DATA_WRITES 和 UNC_IMC_DRAM_IO_REQUESTS计算。似乎 分类 为 IO 的请求将 成为 READ 或 WRITE。换句话说,在描述的一秒间隔内,几乎(由于不准确报告in the above-mentioned doc)2.01GB 2.42GB READ 和 WRITE 的请求属于到IO。根据this的解释,上面的三个列似乎一致彼此。
问题在于IMC 和PMC 值之间仍然存在LARGE 差距!
当我在 runlevel 1 中启动时,情况相同。调度程序上的进程是swapper、kworker和migration之一。 磁盘 IO 几乎是85KB/s。我想知道 什么 会导致(相对)巨大 数量的IO。是否可以检测(例如,使用counter 或工具)?
更新 2:
我认为IO 列存在错误。它总是在[1.99,2.01] 范围内,无论系统中的负载量如何!
更新 3:
在运行级别1中,uops_retired.all 事件在1 秒间隔内的平均发生次数为@987654374 @。在同一期间,相关IMC计数器记录的读取请求数约为30,000,000。换句话说,假设所有内存访问都是由cpu指令直接引起的,对于每个退休的微操作,存在两个内存访问。这似乎不可能,特别是考虑到存在 多个 级缓存的事实。因此,在空闲场景中,read 访问可能是由IO引起的。
【问题讨论】:
-
为什么要显示
perf的两个不同运行(来自不同的时间间隔),而不是像-e foo,bar或-e foo -e bar那样对同一运行使用两个事件?大概有一个 10 秒的间隔与另一个类似,但没有必要假设,这会使您的问题更加紧凑。
标签: linux-kernel performancecounter perf memory-access intel-pmu