使用perf分析QEMU源码时进程挂死的问题排查求助
用Perf分析QEMU时触发内核Oops导致QEMU挂死的解决思路
问题描述
计划使用Perf分析QEMU源码定位执行热点,但对QEMU进程执行Perf采样时,QEMU挂死,同时宿主机抛出内核页错误Oops。
操作步骤
- 启动QEMU客户机:
sudo /opt/qemu/bin/qemu-system-x86_64 \ -hda ./images/ubuntu-22.04-server-cloudimg-amd64.img \ -hdb ./images/user-data.img \ -M q35,cxl=on \ -m 16G,maxmem=32G,slots=8 -smp 16 \ -enable-kvm \ -nographic \ -net nic \ -net user,hostfwd=tcp::1811-:22
- 在宿主机上对QEMU进程(PID:49320)执行Perf采样:
sudo /opt/perf/perf record -p 49320
错误日志
BUG: unable to handle page fault for address: fffffe2ad7e28038 [ 244.956759] #PF: supervisor read access in kernel mode [ 244.958401] #PF: error_code(0x0000) - not-present page [ 244.960029] PGD 47ffdf067 P4D 47ffdf067 PUD 0 [ 244.961481] Oops: 0000 [#1] PREEMPT SMP PTI [ 244.962836] CPU: 5 PID: 990 Comm: ext4lazyinit Not tainted 6.5.0-rc2-00046-gccff6d117d8d #3 [ 244.965390] Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS rel-1.16.2-0-gea1b7a073390-prebuilt.qemu.org 04/01/2014 [ 244.968785] RIP: 0010:__memcpy_flushcache+0x67/0x160 [ 244.970373] Code: 48 8d 14 06 4c 8b 00 4c 8b 48 08 4c 8b 50 10 4c 8b 58 18 4c 0f c3 02 4c 0f c3 4a 08 4c 0f c3 52 10 4c 0f c3 5a 18 48 83 c0 20 <48> 39 c8 75 d1 48 83 e7 e0 83 e5 1f 4e 8d 64 27 20 4a 8d 1c 2f 48 [ 244.975871] RSP: 0018:ffffb696809afba0 EFLAGS: 00010282 [ 244.977515] RAX: ffffa05c80918b80
宿主机环境信息
注:宿主机内核与Perf同源编译
Dist : Ubuntu 22.04.3 LTS Kernel : 6.5.0 perf : 6.5.g2dde18cd1d8f QEMU : 8.1.50
解决思路
1. 排查内核版本与编译配置
- 切换到6.5.x系列的正式稳定版内核:当前使用的是6.5.0-rc2候选版本,这类版本通常存在未修复的bug,尤其是Perf、KVM相关的内核路径,稳定版能大概率规避这类问题。
- 核对内核编译配置:确保开启
CONFIG_PERF_EVENTS=y、CONFIG_KVM=y、CONFIG_KVM_INTEL=y(Intel CPU)或CONFIG_KVM_AMD=y(AMD CPU)等关键选项,避免因编译配置缺失导致的兼容性冲突。
2. 调整Perf采样参数
默认采样配置可能触发兼容性问题,尝试以下调整:
- 降低采样频率:
sudo perf record -p 49320 -F 99(用99Hz替代默认的1000Hz,减少采样对系统的压力) - 指定采样事件:
sudo perf record -p 49320 -e cycles,避免默认周期采样带来的未知冲突 - 禁用子进程追踪:
sudo perf record -p 49320 --no-inherit,减少Perf追踪的进程范围,降低复杂度
3. 排查QEMU配置与版本
- 关闭CXL选项测试:启动QEMU时去掉
cxl=on参数,若问题消失,说明CXL模块与Perf采样存在冲突,可等待QEMU正式版修复或跟进CXL相关补丁。 - 切换到QEMU 8.1正式版:当前使用的8.1.50是开发版本,内存管理相关代码可能存在未修复的bug,正式版稳定性更高。
4. 深入分析内核Oops
- 收集完整Oops日志:当前日志缺少寄存器信息、栈回溯等关键内容,完整日志能帮助定位具体内核路径的问题。
- 检查宿主机内存状态:用
free -h查看内存使用情况,dmesg排查是否有OOM、硬件内存错误等前兆。
5. 替换调试工具
若Perf直接采样QEMU仍有问题,可尝试替代方案:
- 使用QEMU自带的
-d exec参数追踪执行流程(注意会产生大量日志,适合小范围测试) - 使用
perf kvm专门针对KVM场景采样:sudo perf kvm record -p 49320,该工具对KVM虚拟机的兼容性更好
内容的提问来源于stack exchange,提问作者user3156262
相关产品推荐
相关产品推荐

