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
相关产品推荐
相关产品推荐

