perf_event_open
我正在系统调用之上进行自定义实现。
该实现旨在支持任何核心上特定线程的PERF_TYPE_HARDWARE
各种事件PERF_TYPE_SOFTWARE
和PERF_TYPE_HW_CACHE
事件。
在Intel® 64 and IA-32 Architectures Software Developer's Manual vol 3B中,我看到以下测试 CPU(Kaby Lake):
到目前为止,据我所知,可以同时监视(理论上)无限PERF_TYPE_SOFTWARE
事件,但同时监视(没有多路复用)PERF_TYPE_HARDWARE
和PERF_TYPE_HW_CACHE
事件是有限的,因为每个事件都是通过 CPU 的 PMU 的有限(如上面的手册中所见)计数器数量来衡量的。
因此,对于启用了超线程的四核 Kaby Lake CPU,我假设最多可以同时监视 4 个PERF_TYPE_HARDWARE
/PERF_TYPE_HW_CACHE
事件(如果只使用 4 个线程,则最多可以监视 8 个)。
对上述假设进行实验后,我发现虽然我可以成功监控多达 4 个事件(对于 8 个线程),但对于最多只能同时监控 2 个事件PERF_TYPE_HARDWARE
的事件,情况并非如此!PERF_TYPE_HW_CACHE
我也尝试只使用 4 个线程,但同时监视的“PERF_TYPE_HARDWARE”事件的上限仍然是 4。禁用超线程时也会发生同样的情况!
有人可能会问:为什么需要避免多路复用。首先,实现需要尽可能准确,避免多路复用的潜在盲点,其次,当超过“上限”时,所有事件值都为 0...
PERF_TYPE_HW_CACHE
我要定位的事件是:
CACHE_LLC_READ(PERF_HW_CACHE_TYPE_ID.PERF_COUNT_HW_CACHE_LL.value | PERF_HW_CACHE_OP_ID.PERF_COUNT_HW_CACHE_OP_READ.value << 8 | PERF_HW_CACHE_OP_RESULT_ID.PERF_COUNT_HW_CACHE_RESULT_ACCESS.value << 16),
CACHE_LLC_WRITE(PERF_HW_CACHE_TYPE_ID.PERF_COUNT_HW_CACHE_LL.value | PERF_HW_CACHE_OP_ID.PERF_COUNT_HW_CACHE_OP_WRITE.value << 8 | PERF_HW_CACHE_OP_RESULT_ID.PERF_COUNT_HW_CACHE_RESULT_ACCESS.value << 16),
CACHE_LLC_READ_MISS(PERF_HW_CACHE_TYPE_ID.PERF_COUNT_HW_CACHE_LL.value | PERF_HW_CACHE_OP_ID.PERF_COUNT_HW_CACHE_OP_READ.value << 8 | PERF_HW_CACHE_OP_RESULT_ID.PERF_COUNT_HW_CACHE_RESULT_MISS.value << 16),
CACHE_LLC_WRITE_MISS(PERF_HW_CACHE_TYPE_ID.PERF_COUNT_HW_CACHE_LL.value | PERF_HW_CACHE_OP_ID.PERF_COUNT_HW_CACHE_OP_WRITE.value << 8 | PERF_HW_CACHE_OP_RESULT_ID.PERF_COUNT_HW_CACHE_RESULT_MISS.value << 16),
所有都使用提供的公式实现:
(perf_hw_cache_id) | (perf_hw_cache_op_id << 8) |
(perf_hw_cache_op_result_id << 16)
并作为一个群体被操纵(第一个是组长等)。
所以,我的问题如下:
- PMU 的哪些计数器用于事件
PERF_TYPE_HARDWARE
,哪些用于PERF_TYPE_HW_CACHE
事件,我在哪里可以找到这些信息? PERF_TYPE_HARDWARE
预定义事件(例如PERF_COUNT_HW_CACHE_MISSES
)和事件之间有什么区别PERF_TYPE_HW_CACHE
?- 关于如何在不复用所有列出的
PERF_TYPE_HW_CACHE
事件的情况下进行监控的任何建议? - 关于如何在不复用多达 8 个
PERF_TYPE_HARDWARE
或/和PERF_TYPE_HW_CACHE
事件的情况下进行监控的任何建议?
提前致谢!