如何获取主机架构原始Perf事件并解决libpfm4事件识别问题?
解决libpfm4相关Perf事件问题
获取主机架构原始Perf事件
- 直接运行libpfm4自带的
pfm_discover_events工具,它会列出当前CPU架构支持的所有原始硬件事件,包含事件名、编码、描述信息。 - 参考对应CPU厂商的官方手册:Intel用户查《Intel 64 and IA-32 Architectures Software Developer Manual》的性能监控章节;AMD用户查《AMD64 Architecture Programmer’s Manual》的性能监控部分,里面有所有原始事件的编码和定义。
编译可读事件映射列表与pfm_get_os_event_encoding()使用
libpfm4的事件映射逻辑内置在库中,无需手动编译单独的映射列表,只需确保正确使用:
- 若使用标准硬件事件,直接用libpfm4支持的事件名(比如
cycles、instructions)或原始编码格式(如cpu/event=0x3C,umask=0x00/)作为输入参数传给pfm_get_os_event_encoding()。 - 若自定义事件,需在代码中通过
pfm_event_info_t结构体定义事件的名称、编码、掩码等属性,再调用pfm_get_event_info()注册后使用。 - 编译程序时,需链接libpfm4库:
gcc your_code.c -o your_bin -lpfm,确保头文件路径正确(若库安装在非默认路径,需加-I指定头文件目录、-L指定库目录)。
解决libpfm4无法识别perf list多数事件的问题
perf list输出的部分事件是内核封装的高层别名或组事件,libpfm4仅识别底层硬件原始事件和自身定义的标准别名,解决方法:
- 用
perf list --details查看目标事件的原始硬件编码,比如L1-dcache-loads对应的原始编码可能是cpu/event=0x00,umask=0x01/,将这个原始编码传入pfm_get_os_event_encoding()即可。 - 确保使用的libpfm4是最新版本,部分新CPU架构的事件支持需要更新库来适配。
- 调用
pfm_get_os_event_encoding()时,指定正确的参数:目标类型设为PFM_OS_PERF_EVENT,权限掩码设为对应层级(比如用户态事件用PFM_PLM0|PFM_PLM3)。
内容的提问来源于stack exchange,提问作者drip
相关产品推荐
相关产品推荐

