Qemu/Kvm中的tracing工具

Qemu提供了一个Trace框架,支持多种debug/trace后端,如nop, dtrace, ftrace等。本文聚焦于无需额外软件的Simple Trace后端,讲解如何在编译Qemu时启用它,添加跟踪事件,启动虚拟机,收集跟踪结果,并利用模块自带的pretty-print工具解析9p模块的追踪信息。" 108244032,8099695,React Router深度解析:动态路由与懒加载实践,"['reactjs', 'javascript', '前端开发', 'Router']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Qemu有自己的Trace框架并支持多个debug/trace后端包括:nop, dtrace, ftrace, log, simple, ust,可以帮助我们分析Qemu中的问题。关于这些backend的介绍,可以看这个链接:http://repo.or.cz/w/qemu/stefanha.git/blob_plain/refs/heads/tracing:/docs/tracing.txt,如果现有的trace point不能满足你的需求,里面还有介绍如何添加新的trace point。这篇文章主要介绍一下Qemu内嵌的一个backend:Simple trace的使用,它不需要安装任何其他软件就可以使用。

1)编译qemu时要enable trace backend

$ ./configure --enable-trace-backends=simple --enable-debug --enable-kvm --target-list=x86_64-softmmu,x86_64-linux-user
$ make
$ make install

2)添加你想要trace的event

$ cat /tmp/events
virtio_blk_req_complete
virtio_blk_handle_write
virtio_blk_handle_read

3)启动虚拟机

$ qemu-system-x86_64 /root/CentOS---6.6-64bit---2015-03-06-a.qcow2 -smp 4 -m 4096 --enable-kvm -nographic -net nic -net tap,ifname=tap0,script=no,downscript=no -trace events=/tmp/events,file=trace.bin
<think>我们正在处理KVM/QEMU环境中块存储IO挂起超时的问题。这种问题通常表现为虚拟机中的磁盘操作长时间无响应,可能由多种原因引起,包括但不限于: 1. 存储后端问题(如NFS超时、iSCSI连接中断) 2. 主机存储设备故障或性能瓶颈 3. 虚拟机内部的问题(如文件系统损坏、内核阻塞) 4. QEMU/KVM配置不当 在KVM/QEMU中,我们可以通过调整一些配置参数来增加IO超时的容忍度或改变超时行为,以防止虚拟机因短暂的IO挂起而完全卡死。 以下是一些关键的配置项和调整方法: ### 1. **调整SCSI命令超时(virtio-scsi)** 如果使用virtio-scsi,可以通过设置`scsi_timeout`属性来增加SCSI命令的超时时间(默认是30秒): ```xml <controller type='scsi' index='0' model='virtio-scsi'> <driver scsi_timeout='60'/> <!-- 单位是秒 --> </controller> ``` ### 2. **使用error_policy处理IO错误** 当发生IO错误时,可以设置不同的错误处理策略: ```xml <disk type='file' device='disk'> <driver name='qemu' type='raw' cache='none' error_policy='report'/> ... </disk> ``` - `error_policy`可选值: - `enospace`: 当磁盘空间不足时,模拟空间不足错误(默认) - `stop`: 暂停虚拟机 - `report`: 向客户机报告错误(客户机可以处理错误) - `ignore`: 忽略错误(危险!可能导致数据损坏) ### 3. **调整块设备超时(rerror和werror)** 在磁盘设备上,可以分别设置读错误(rerror)和写错误(werror)的处理策略: ```xml <disk type='file' device='disk'> ... <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/> <driver name='qemu' type='raw' cache='none'/> <alias name='virtio-disk0'/> <rerror policy='report'/> <werror policy='report'/> </disk> ``` - `rerror`和`werror`的常用策略: - `ignore`: 忽略错误(不推荐) - `report`: 报告错误给客户机(默认) - `enospace`: 当空间不足时报告错误 - `stop`: 停止虚拟机 ### 4. **启用IO线程和绑定** 将磁盘IO分配到独立的IO线程,并绑定到特定的CPU核心,可以减少IO延迟和避免因主机调度导致的超时: ```xml <iothreads>4</iothreads> <disk type='file' device='disk'> ... <driver iothread='2'/> <!-- 指定使用第2个IO线程(从1开始) --> </disk> <cputune> <iothreadpin iothread='1' cpuset='2'/> <iothreadpin iothread='2' cpuset='3'/> ... </cputune> ``` ### 5. **调整QEMU块设备参数(高级)** 在QEMU命令行中,可以调整块设备的超时参数(通过`-device`的额外属性): 例如,调整virtio-blk设备的超时: ``` -device virtio-blk-pci,drive=drive0,scsi=off,config-wce=off,blk_timeout=60 ``` 在libvirt XML中,可以通过`<qemu:commandline>`添加: ```xml <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'> ... <qemu:commandline> <qemu:arg value='-device'/> <qemu:arg value='virtio-blk-pci,drive=drive0,scsi=off,config-wce=off,blk_timeout=60'/> </qemu:commandline> </domain> ``` 注意:使用`<qemu:commandline>`需要修改XML的命名空间。 ### 6. **检查主机存储超时设置** 对于某些存储类型(如NFS),需要调整主机层面的超时设置。例如NFS的`timeo`参数(在`/etc/fstab`中)可以增加,默认是600(60秒),可以尝试增加: ``` nfs-server:/export /mnt nfs rw,hard,intr,timeo=1200 0 0 ``` 注意:调整主机存储超时不是KVM配置,而是主机系统配置。 ### 7. **使用多路径IO(MPIO)** 对于企业级存储,使用多路径IO可以提高可用性,避免单一路径故障导致的IO挂起。 ### 8. **监控和诊断** 启用QEMU的跟踪和日志来诊断IO挂起: ```xml <domain> ... <qemu:commandline> <qemu:arg value='-trace'/> <qemu:arg value='events=/root/events.txt'/> </qemu:commandline> </domain> ``` ### 注意事项: - 调整超时时间并不能解决根本问题,它只是给了系统更多的时间从临时故障中恢复。需要同时调查导致IO挂起的根本原因(如网络、存储硬件等)。 - 过长的超时可能导致虚拟机在遇到永久性故障时长时间无响应。 如果问题仍然存在,请检查: - 主机存储性能(使用`iostat`、`blktrace`等工具- 虚拟机内部是否出现文件系统错误(`dmesg`) - 存储后端日志(如NFS服务器、iSCSI目标服务器日志) 通过以上配置调整,可以在一定程度上缓解IO挂起超时问题,但必须结合底层存储的稳定性来综合解决。 §§相关问题§§ 1. 如何诊断KVM虚拟机中的IO性能问题? 2. virtio-blk和virtio-scsi在错误处理机制上有何不同? 3. 如何配置KVM使用多路径IO(MPIO)? 4. 在KVM中如何监控虚拟磁盘的IO状态? 5. 如何调整Linux主机的SCSI设备超时设置?</think>### KVM/QEMU 块存储 IO 挂起超时问题配置指南 以下是针对块存储 IO 挂起超时问题的关键配置项及解决方案: #### 1. **调整磁盘超时参数** [^1][^2] ```xml <domain> <devices> <disk type='file' device='disk'> <driver name='qemu' type='raw' cache='none' error_policy='report'/> <source file='/path/to/disk.img'/> <target dev='vda' bus='virtio'/> <!-- 关键超时参数 --> <rerror policy='report' timeout='60'/> <werror policy='report' timeout='60'/> </disk> </devices> </domain> ``` - **`timeout='60'`**:将 SCSI 命令超时从默认 30 秒延长到 60 秒 - **`error_policy='report'`**:IO 错误时报告而非暂停虚拟机 - **适用场景**:网络存储(NFS/iSCSI)或高延迟磁盘 #### 2. **启用多队列 VirtIO** [^2] ```xml <disk> <driver name='qemu' queues='4' iothread='1'/> </disk> <iothreads>4</iothreads> ``` - `queues` 值建议等于 vCPU 数量 - 需在客户机内核添加参数: ```bash scsi_mod.use_blk_mq=1 virtio_scsi.num_queues=4 ``` #### 3. **IO 线程绑定优化** ```xml <cputune> <vcpupin vcpu='0' cpuset='0'/> <vcpupin vcpu='1' cpuset='1'/> <iothreadpin iothread='1' cpuset='2'/> </cputune> ``` - 隔离专用 CPU 核心处理 IO - 避免 CPU 竞争导致的 IO 延迟 #### 4. **调整内核参数(主机侧)** ```bash # 增加 SCSI 超时时间 echo 120 > /sys/block/sdX/device/timeout # 调整虚拟机调度参数 sysctl -w vm.dirty_background_ratio=5 sysctl -w vm.dirty_ratio=10 sysctl -w vm.swappiness=10 ``` #### 5. **QEMU 启动参数优化** ```xml <qemu:commandline> <qemu:arg value='-set'/> <qemu:arg value='device.virtio-disk0.scsi=off'/> <qemu:arg value='-device'/> <qemu:arg value='virtio-blk-pci,drive=drive0,blk_timeout=60'/> </qemu:commandline> ``` - 直接设置 virtio-blk 超时为 60 秒 - 禁用 SCSI 模拟层减少开销 #### 诊断命令: ```bash # 查看块设备超时设置 cat /sys/block/vdX/device/timeout # 监控 IO 延迟 iostat -x 1 # 跟踪 SCSI 命令 echo 'scsi:*' > /sys/kernel/debug/tracing/set_event cat /sys/kernel/debug/tracing/trace_pipe ``` ### 根本原因排查方向: 1. **存储后端问题**:检查 NFS/iSCSI 连接状态 2. **资源竞争**:监控主机 CPU 和内存使用 3. **队列拥塞**:检查 `/sys/block/vdX/inflight` 状态 4. **客户机问题**:虚拟机内部 `dmesg | grep -i 'hung'` 5. **硬件故障**:检查磁盘 SMART 状态 > 重要提示:超时配置只能缓解症状,需配合性能监控工具(如`blktrace`)定位根本原因[^2][^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值