You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

perf kvm record与perf record结果差异原因及选型咨询

KVM多VM负载性能分析:perf与perf kvm结果差异解析

实验背景

我在对基于KVM的多虚拟机(VM)负载做性能分析时,发现perf kvm record+perf kvm report与perf record+perf report的统计结果存在明显差异,具体环境与现象如下:

  • VM配置:100个由Firecracker v1.9.0启动的VM,均通过快照创建,单vCPU、2GB客户机物理内存,运行相同应用与Linux 5.10.226内核;
  • 主机配置:Linux 6.12.17内核,禁用交换、超线程、KSM与透明大页,所有VM绑定至同一cgroup,指定cpuset.cpus为单个物理CPU(ID 26);
  • 负载特征:网络IO密集型(CPU时间:网络IO时间约1:100);
  • 现象:
    • 执行perf record -F 99 -e cycles -g -C 26 <启动负载命令>后,perf report显示handle_ept_violation占比约25%;
    • 改用perf kvm --host --guest --guestkallsyms=/path/to/guest/kallsyms record -F 99 -e cycles -g -C 26 <启动负载命令>,perf kvm --host --guest report显示该函数占比不足3%;
  • 佐证数据:/sys/kernel/debug/kvm/计数器显示,850秒内pf_fixed5949089次、pf_taken7584753次,结合该数据认为perf kvm结果更合理。

问题解答

1. 结果差异原因与准确性判断

两者的核心差异在于对虚拟化上下文的处理能力:

  • 普通perf record无法区分CPU的根模式(host运行)与非根模式(guest运行)上下文。当guest触发EPT violation导致VM exit时,CPU切换到root模式执行host的handle_ept_violation函数,但perf的采样逻辑可能会将guest运行期间的部分周期错误关联到host的KVM处理函数上——尤其是在IO密集型负载下,guest频繁触发VM exit,这种上下文混淆会大幅拉高handle_ept_violation的占比统计。
  • perf kvm是专门针对KVM虚拟化场景优化的工具,它会跟踪VMX切换事件,准确拆分host与guest的执行周期:只有host实际处理VM exit的时间才会被统计到handle_ept_violation,而guest运行的周期会被正确归属到guest的代码路径。结合/sys/kernel/debug/kvm/的计数器数据,perf kvm的结果更符合实际开销,普通perf record的结果存在统计偏差,是不准确的。

2. 主机内核与Firecracker开销分析的工具选择

如果目标是分析主机内核与Firecracker/hypervisor的开销,应选用perf kvm工具,具体建议:

  • 执行记录时使用perf kvm --host record -F 99 -e cycles -g -C 26 <启动负载命令>(若需要同时对比guest开销,可加上--guest --guestkallsyms=/path/to/guest/kallsyms参数);
  • 报告分析时使用perf kvm --host report,该命令会精准过滤并统计host侧的内核与hypervisor开销,避免普通perf的上下文混淆问题,能更准确反映Firecracker与KVM模块的实际CPU消耗。

内容的提问来源于stack exchange,提问作者huangjl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:12:44