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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:40:13