我正在 Saphire Rapid 服务器上使用启用了
kvm
的 qemu。我想使用英特尔的 PEBS
来宾内部采样。
我的印象是,自 Linux 内核 6.3 以来,对
kvm
计数器虚拟化有了一些 PEBS
支持,如果我在 qemu 源代码树中 grep 单词“pebs”,我会发现一些提及。
我跑步:
perf record -d -e cpu/event=0xd1,umask=0x20/ppu -c 1 <command>
在 qemu-kvm 来宾虚拟机设置中使用
-cpu host
参数。
我使用的是Linux内核6.6。无论是客人还是主人。
pebs
标志在虚拟机内的/proc/cpuinfo中设置。
命令返回给我:
PMU Hardware doesn't support sampling/overflow-interrupts
.
相同的命令在主机中成功运行。
所以,我想知道是否有某种特定版本的 qemu 或特定参数可以在来宾虚拟机内部启用
PEBS
使用?
或者
PEBS
仍然不支持使用?
可以在具有 QEMU/KVM 的来宾 Linux VM 内启用英特尔基于精确事件的采样 (PEBS) 硬件计数器,但需要主机和来宾内核的特定配置和支持。
KVM 来宾中对 PEBS 虚拟化的最初支持是在 Linux 内核 3.14 中引入的,并带有来自 Andi Kleen 的补丁。这允许通过直接将 PEBS 记录传送到来宾缓冲区并固定来宾页面以避免交换问题,在 KVM 来宾中进行 PEBS 分析。
但是,实施过程中也存在一些限制和担忧,例如:
fork()
创建可以换出的新页表出现问题。根据互联网搜索分析,KVM 中的 PEBS 虚拟化支持似乎随着时间的推移有所改进,但仍然存在一些要求和潜在的限制:
内核版本:主机和来宾内核都应该足够新以支持 PEBS 虚拟化。互联网搜索结果提到正在使用 Linux 内核 5.17 和 6.6,因此最近的内核版本似乎提供了支持。
CPU 支持:PEBS 虚拟化可能仅限于特定的 CPU 型号或架构。初始补丁提到仅支持基于 Silvermont 的系统。
QEMU 版本:需要支持 KVM 的最新版本的 QEMU。互联网搜索结果提到了 QEMU 6.2,但可能需要更新的版本以获得更好的支持。
内核配置:确保为 PEBS 虚拟化启用必要的内核配置选项,例如
CONFIG_PEBS_VIRTUALIZATION
和 CONFIG_PEBS_GUEST_SUPPORT
。
QEMU 命令行选项:启动来宾 VM 时使用
-cpu host
选项以确保来宾 CPU 型号与主机匹配。
访客配置:在访客内部,确保在
/proc/cpuinfo
中设置 PEBS 标志,并且 perf
命令能够访问 PEBS 计数器。
如果您已执行所有必要的步骤,但 PEBS 仍然无法在来宾虚拟机内工作,则当前实施可能仍然存在一些限制或问题。您可能需要进一步调查或咨询 QEMU/KVM 社区以获取更具体的指导。
值得注意的是,互联网搜索调查表明 PEBS 虚拟化支持是一项持续的努力,未来的内核和 QEMU 版本可能会有改进或更改。