在QEMU中使用PEBS/PMU采样内存操作精确地址遇阻求助
我在QEMU中尝试使用PEBS/PMU采样内存操作的精确地址时,遇到了与三年前类似的问题,原问题描述如下:
尝试使用perf_event_open()跟踪所有存储指令以获取其访问地址,发现只有当设置attr.precise_ip > 0时才能得到非零地址;但在虚拟机而非宿主机上运行同一进程时,会报错“Operation not supported”。将虚拟机的precise_ip设为0可解决报错,但此时采样得到的地址全为0。我不理解为何precise_ip会与采样地址相关(文档未提及),也不清楚为何宿主机可设置precise_ip=1而虚拟机不行,恳请帮助。
排查步骤
我已开展以下进一步排查:
- 使用
-cpu host参数启动QEMU时,客户机内核日志显示“Performance Events: Skylake events, Intel PMU driver”,启动状态看似正常; - 宿主机
lscpu输出包含arch_perfmon和pebs标识,但客户机仅存在arch_perfmon,缺失pebs,不知如何启用该支持; - 执行
cpuid | grep -A 1 Architecture Performance Monitoring Features (0xa/eax)后发现,宿主机的version ID为4,客户机为2,说明二者支持等级不同,但不知如何修改; - 看到一则补丁说明:
Bug #2:由于KVM始终为PEBS事件设置非零值的precise_ip,perf始终生成自适应记录,即便客户机请求基本记录。需注意,即便未向客户机暴露自适应PEBS,KVM也会为单个计数器启用自适应PEBS,但因MSR_PEBS_DATA_CFG保证为0,客户机只会看到基本记录。
上述三个问题的修复方向一致:将vcpu的EVT_SELx.Adaptive_Record[34]或FCx_Adaptive_Record值传递给perf/core,使PEBS辅助功能按vPEBS预期生效,可在intel_guest_get_msrs()中更新vPMC[x].pPMC.fcctl_or_evtsel.ADAPTIVE = vPMC[x].use_adaptive,因为宿主机PEBS启用时客户机PEBS会被禁用。
疑问
该补丁说明ICE_LAKE默认应支持precise_ip,但我的场景中却不支持。请问这是否是由于KVM/QEMU版本不兼容(已通过Apt升级至最新版本),或是我的CPU型号(Intel Xeon Gold 5218)过旧导致?希望了解自三年前上述问题提出后,该问题是否有进展。
内容的提问来源于stack exchange,提问作者FauraSol

