VirtualBox Linux虚拟机中执行perf stat mem-loads事件报错求助
perf stat提示mem-loads事件无效的问题 这个问题我之前帮不少开发者排查过,大概率是VirtualBox虚拟化环境对性能计数器(PMU)的支持有限,或者事件名称的兼容性问题,咱们一步步来解决:
检查VirtualBox的CPU虚拟化配置
VirtualBox默认可能没完全开启CPU性能计数器的支持,你需要先关闭虚拟机,进入「设置」→「系统」→「处理器」:- 确保勾选了「启用VT-x/AMD-V」(前提是你的物理CPU支持该特性)
- 部分新版本VirtualBox里还有「性能计数器」相关的扩展选项,也需要勾选上
保存设置后重启虚拟机,再尝试执行perf stat -e mem-loads,mem-stores ./test。
确认当前系统可用的perf内存事件
不同CPU架构、内核版本或虚拟化环境下,perf的事件别名可能存在差异。你可以执行perf list memory来查看当前系统支持的所有内存相关事件——比如有些环境下可能需要用mem_loads(下划线)而非mem-loads(横杠),或者只能使用原始的PMU事件编码。尝试使用原始PMU事件编码
如果mem-loads这类高层别名不被支持,你可以直接用CPU对应的原始事件代码。比如对于Intel CPU:- 内存加载事件对应的编码是
r00000001:u - 内存存储事件对应的编码是
r00000002:u
执行命令改成:perf stat -e r00000001:u,r00000002:u ./test
注意:AMD、ARM等其他架构的事件编码不同,你可以通过perf list查看对应原始编码,或者参考CPU官方手册。
- 内存加载事件对应的编码是
检查内核的perf支持状态
有些精简版Linux虚拟机的内核,编译时可能没开启CONFIG_PERF_EVENTS或CONFIG_X86_PERF_EVENT_INTEL_UNCORE这类PMU相关选项。你可以通过zcat /proc/config.gz | grep PERF_EVENTS检查,如果结果是CONFIG_PERF_EVENTS=y才是开启状态,否则需要更换内核或重新编译内核开启相关选项。升级VirtualBox和系统内核
旧版本VirtualBox对PMU的支持很差,升级到最新版(比如7.x系列),同时把虚拟机里的Linux内核升级到5.15以上的稳定版,通常能解决大部分虚拟化环境下的perf事件支持问题。
内容的提问来源于stack exchange,提问作者Jason

