ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Rocky Linux 10虚拟机变慢?先确认KVM加速是否生效的完整排查指南

Rocky Linux 10虚拟机变慢?先确认KVM加速是否生效的完整排查指南 虚拟机变慢很多人第一反应是加 vCPU、加内存或者去调一堆内核参数。但在 Rocky Linux 10 这类企业级系统上我更建议先花 30 秒确认一个更底层的问题这台虚拟机到底是不是真的跑在 KVM 加速上。如果底层是 QEMU 纯软件模拟或者嵌套虚拟化没有开启后面任何调优都是事倍功半。Rocky Linux 10 基于 RHEL 10 构建在服务端场景里的角色越来越接近“长期稳定发行版 企业级工作负载底座”。而 KVM 又是 Linux 服务端虚拟化的主流方案大量私有化部署、桌面虚拟化、云平台底层都是它。实际排障中真正由 Rocky 10 系统本身引起的变慢只占一部分更多时候是虚拟化层配置出了问题。所以这篇文章会按“客户机判断 - 宿主机验证 - libvirt 配置检查 - 性能验证 - 排错”的顺序把完整检查链路走一遍。先说结论最快的判断命令是systemd-detect-virt看到输出kvm说明 KVM 加速大概率生效但只有一个输出还不够需要结合/dev/kvm设备、CPU 标志位、QEMU 启动参数和 libvirt XML 交叉验证。下面进入正题。1. 核心能力速览这套排障流程能做什么排障目标确认 Rocky 10 虚拟机是否使用 KVM 硬件加速定位“慢”的根因判断方法systemd-detect-virt、virt-what、/dev/kvm、CPU flags、QEMU 进程参数、libvirt XML支持平台Linux 宿主机 KVM/QEMU覆盖 Rocky 10、RHEL 系Debian/Ubuntu 系同样适用对宿主机要求物理机或已开启嵌套虚拟化的虚拟机CPU 支持 Intel VT-x / AMD-V主要命令systemd-detect-virt、virt-what、virsh、dmesg、lscpu、sysbench是否需要图形界面不需要全命令行即可完成是否支持批量排查支持可通过 ssh 脚本对多台虚拟机批量收集状态常见陷阱输出qemu不代表纯软件模拟需结合 accel 参数判断/dev/kvm存在但 QEMU 没走 KVM 时性能同样断崖适合读者Rocky/RHEL 系统管理员、虚拟化排障工程师、IT 运维、KVM 学习入门者这套流程不依赖图形化工具也不要求额外部署监控组件所以很适合作为虚拟机性能排障的第一道检查步骤。确认虚拟化加速正常后再把精力放到 CPU 超卖、NUMA 拓扑、磁盘 IO、网络中断等下一层问题上。2. 适用场景与使用边界这组检查命令最常用的场景有三个。第一Rocky 10 虚拟机业务响应慢但宿主机负载不高怀疑虚拟化层拖了后腿。这时候先在客户机内判断虚拟化类型速度最快、干扰最小。第二服务器从 VMware 或其他虚拟化平台迁移到 KVM迁移后性能出现明显波动。此时不仅要确认加速状态还要对比新旧平台的 CPU 型号透传策略和 virtio 驱动配置。第三在 KVM 虚拟机里再开虚拟机做测试或 CI 环境。嵌套虚拟化没有开启是这类场景最常见的坑/dev/kvm不存在或 CPU 标志缺少vmx/svm都能直接说明问题。这套流程也有明确边界。如果是纯容器环境不需要用它如果已经确认虚拟化加速正常就不要反复做同样检查应该转向应用层、数据库慢查询、存储延迟等方向。另外大部分检查命令需要 root 权限或 sudo操作前要确认环境是否授权生产环境不要随意重启服务或修改 libvirt 配置。3. 为什么虚拟机慢要优先确认虚拟化类型KVM 全称 Kernel-based Virtual Machine它依赖 Intel VT-x 或 AMD-V 硬件虚拟化能力让虚拟机 CPU 指令能直接跑在物理 CPU 上所以性能非常接近物理机。而 QEMU 还有一种纯软件模拟模式叫 TCG它不用硬件虚拟化指令而是把客户机指令翻译成宿主机指令执行。TCG 模式下 CPU 开销极高通常只有 KVM 加速性能的十分之一左右业务系统一旦跑在上面最典型的表现就是“CPU 100% 但事倍功半”。还有一个容易忽略的场景是嵌套虚拟化。如果 Rocky 10 虚拟机本身要作为二级宿主机再创建虚拟机就必须让宿主机打开嵌套虚拟化开关。否则客户机里即使能看到vmx标志真正调用 KVM 时依然无法启动/dev/kvm最终退化到 TCG慢得让人抓狂。所以“虚拟机很慢”这个问题的排查优先级应当是先确认虚拟化加速是否生效再考虑资源配置和参数调优。虚拟化类型对了后面才有优化空间类型错了加多少 CPU 都是白搭。4. Rocky 10 下确认 KVM 加速的 5 个命令这一部分是整套排障的核心每个命令对应一个判断维度。不要只看一个结果组合使用才能下结论。4.1 systemd-detect-virt第一判断systemd-detect-virt是 systemd 自带工具不需要额外安装在 Rocky 10 客户机里直接执行即可。systemd-detect-virt不同输出含义如下表输出含义none当前机器是物理机kvm当前以 KVM 虚拟机身份运行加速已生效qemu可能是 QEMU 纯软件模拟或 hypervisor CPU 标志未正确透传vmware当前运行在 VMware 上microsoft当前运行在 Hyper-V 上xen当前运行在 Xen 上这里要提醒一点systemd-detect-virt的判定原理主要看 DMI 表、SMBIOS 信息和 CPUID 标志。有些 KVM 客户机因为设备模型或 firmware 比较旧输出会是qemu但这不代表绝对没有加速。例如 libvirt 在 domain XML 中明确写了domain typekvm系统仍然可能识别成qemu。所以看到qemu不要直接下结论继续往下查。4.2 virt-what交叉验证virt-what是 Red Hat 出品的小工具在 Rocky 10 上可以用 dnf 直接安装dnf install -y virt-what virt-what在 KVM 加速环境里常见输出是kvm。如果同时看到kvm和qemu说明底层具备 KVM 加速能力但具体是否被启用还要看 QEMU 进程参数。virt-what对 KVM 与 QEMU 的区分比较保守不会因为 DMI 信息缺失就误报适合和systemd-detect-virt做交叉验证。如果执行后输出为空可能是权限不足。virt-what需要读取 DMI 和系统设备信息一般要用 root 或 sudo 运行。4.3 检查 /dev/kvm 设备节点/dev/kvm是 KVM 加速的设备接口。在 Rocky 10 客户机或宿主机上执行ls -l /dev/kvm如果输出形如crw-rw-rw- 1 root kvm 10, 232的设备文件说明宿主机已经创建了 KVM 设备节点。这个节点的存在说明宿主机 CPU 支持硬件虚拟化并且 kvm 内核模块已加载。注意/dev/kvm存在不代表当前这个客户机进程一定使用了它。还要看 QEMU 启动参数是否带-accel kvm。如果/dev/kvm不存在则要从以下几项排查宿主机 CPU 不支持 Intel VT-x / AMD-VBIOS 中虚拟化功能未开启kvm_intel 或 kvm_amd 模块未加载当前运行环境是容器或缺少 /dev 权限4.4 检查 CPU 标志位CPU 标志位能直接反映当前系统是否运行在虚拟化环境中。在 Rocky 10 客户机里执行grep -E -m1 flags /proc/cpuinfo重点看两个标志hypervisor表示当前系统是虚拟机物理机通常没有这个标志vmxIntel或svmAMD表示 CPU 暴露了硬件虚拟化指令在 KVM 加速模式下客户机通常会隐藏物理机的vmx标志除非开启了嵌套虚拟化但会保留hypervisor标志。在纯软件模拟的 QEMU 下CPU 标志里一般只有hypervisor没有vmx/svm。如果一台虚拟机同时有hypervisor和vmx/svm说明它是开启了嵌套虚拟化的 KVM 虚拟机嵌套里再跑 KVM 才具备条件。也可以配合 lscpu 快速查看lscpu | grep -E Hypervisor|Virtualization4.5 查看 QEMU 进程启动参数在宿主机上找到目标虚拟机对应的 QEMU 进程ps -ef | grep qemu | grep -i rocky10-guest如果启动参数里包含-machine accelkvm或-accel kvm说明当前客户机正使用 KVM 加速。如果只有-accel tcg或者相关参数里没有accelkvm则说明运行在 TCG 纯软件模拟模式。在 libvirt 管理环境中直接看 domain XML 更可靠virsh dumpxml rocky10-guest | grep -E domain type|accel正常 KVM 加速时一般能看到domain typekvm。如果显示domain typeqemu说明 libvirt 创建的是纯 QEMU 虚拟机没有使用 KVM 加速。5. 从宿主机到客户机的完整链路检查命令级判断完成之后还需要把检查延伸到内核模块、libvirt 配置和 virtio 驱动这部分才是真正定位性能瓶颈的关键。5.1 检查 KVM 内核模块是否加载在宿主机上执行lsmod | grep -E kvm_intel|kvm_amd|kvmIntel 平台应该能看到kvm_intelAMD 平台应该看到kvm_amd两者共同依赖kvm模块。模块正常加载是 KVM 加速的基础。如果模块没加载可以尝试手动加载modprobe kvm_intel但手动加载只是临时方案。更稳妥的做法是确认 BIOS 已经开启 VT-x/AMD-V并把模块加入开机加载配置。如果加载时提示“Operation not supported”说明 CPU 不支持硬件虚拟化或 BIOS 未开启。5.2 检查 libvirt XML 中的 CPU 模型与加速参数libvirt 管理的 KVM 虚拟机CPU 模型配置对性能影响很大。导出配置virsh dumpxml rocky10-guest一个正常使用 KVM 加速且性能较好的配置核心片段类似下面这样domain typekvm namerocky10-check/name memory unitGiB4/memory vcpu placementstatic4/vcpu cpu modehost-passthrough checknone/ devices emulator/usr/libexec/qemu-kvm/emulator /devices /domain重点检查三点domain typekvm代表使用 KVM 加速如果是qemu则是纯软件模拟cpu modehost-passthrough将宿主机 CPU 特性直接透传给客户机性能最好vcpu placementstatic表示 vCPU 采用静态放置可以配合 CPU pinning如果cpu modecustom中指定了qemu64这类通用 CPU 型号性能会明显打折扣。qemu64只暴露了很基础的 CPU 指令集很多现代应用依赖的指令扩展无法使用。生产环境优先用host-passthrough需要跨宿主机迁移时再用host-model。5.3 检查 virtio 驱动是否生效CPU 加速正常后磁盘和网络设备是否使用 virtio 直接决定 IO 性能。KVM 全虚拟化虽然 CPU 接近原生但如果磁盘走 IDE/SATA 模拟网络走 e1000 模拟IO 开销会很高。查看磁盘类型lsblk -d -o NAME,TRAN,MODEL如果 TRAN 列为virtio说明磁盘使用 virtio-blk性能接近原生。如果显示sata或ide则走了模拟控制器应该考虑改为 virtio 并安装对应驱动。查看网卡驱动ethtool -i eth0 | grep driverRocky Linux 10 环境下的理想输出是virtio_net。如果看到e1000或rtl8139说明网卡是模拟设备网络吞吐和 CPU 占用都会受影响。5.4 检查嵌套虚拟化开关如果 Rocky 10 虚拟机内部还要再运行 KVM 虚拟机必须在宿主机上开启嵌套虚拟化。在宿主机执行cat /sys/module/kvm_intel/parameters/nested返回Y或1表示开启返回N或0表示关闭。AMD 平台对应查看cat /sys/module/kvm_amd/parameters/nested如果未开启需要修改模块参数modprobe kvm_intel nested1但更推荐在 modprobe 配置文件中写入持久化配置例如创建/etc/modprobe.d/kvm-nested.confoptions kvm_intel nested1需要说明的是嵌套虚拟化开启后客户机的 CPU 型号必须能透传vmx标志一般配合cpu modehost-passthrough/才能正常工作。6. 性能验证与资源观察配置确认无误后还需要实际验证虚拟机性能是否符合预期。这里给出几条轻量级验证思路。6.1 CPU 型号识别在 Rocky 10 客户机内执行lscpu | grep Model nameKVM 加速且使用 host-passthrough 时通常会显示宿主机真实 CPU 型号例如Intel(R) Xeon(R) Gold或AMD EPYC系列。如果显示QEMU Virtual CPU version之类的通用型号说明 CPU 模型被设置为qemu64或更低等级或者当前运行在 TCG 模式下。这个信号比基准测试更早暴露问题。6.2 使用 sysbench 做快速基准先安装 sysbench 再做对比dnf install -y sysbench sysbench cpu run --threads4 --time30执行结束后关注events per second指标。同一台宿主机上同样 4 vCPU 配置的 KVM 虚拟机性能应明显高于 TCG 模式。如果测出来性能只有物理机的 20% 到 30%优先怀疑 TCG 模拟、CPU 超卖过高或 NUMA 配置不当。注意跑基准前要观察宿主机负载。宿主机本身 load average 已经很高时客户机的 sysbench 结果不具备参考意义。可以顺手执行uptime确认宿主机负载在合理范围后再做客户机基准测试。6.3 看物理 CPU 亲和性在宿主机上执行virsh vcpuinfo rocky10-check输出中每一行 VCPU 会对应一个 CPU 编号和运行状态。如果发现所有 vCPU 都挤在同一颗物理 CPU 上说明需要设置 pinning。例如 4 个 vCPU 分别固定到物理 CPU 0、1、2、3virsh vcpupin rocky10-check 0 0 virsh vcpupin rocky10-check 1 1 virsh vcpupin rocky10-check 2 2 virsh vcpupin rocky10-check 3 3使用 vcpupin 前要确认物理 CPU 编号避免和宿主机关键进程抢核心。生产环境建议先查看/proc/cpuinfo或lscpu -e了解物理 CPU 布局再设置亲和性。6.4 检查内核日志中的 KVM 提示在宿主机上执行dmesg | grep -i kvm如果出现kvm: disabled by bios或类似提示说明 BIOS 中的虚拟化选项被关闭需要重启宿主机进入 BIOS 开启 VT-x 或 AMD-V。如果 dmesg 里没有任何 KVM 报错且模块加载正常基本可以认为加速链路没有异常。7. 常见问题与排查方法下面这张表总结了 Rocky 10 虚拟机“慢”和 KVM 加速相关的典型问题可以直接对照排查。问题现象可能原因排查方式解决方案systemd-detect-virt 输出 qemu纯软件模拟或旧 libvirt 配置检查 virsh dumpxml 确认 type 是否为 kvm将 domain type 改为 kvm并确认 accelkvm/dev/kvm 不存在宿主机 CPU 不支持虚拟化或模块未加载lsmod 查看 kvm 模块dmesg 查 BIOS 提示开启 BIOS 虚拟化加载 kvm_intel/kvm_amd客户机 CPU 显示 QEMU Virtual CPUCPU model 配置为 qemu64 或 TCG 模式lscpu 查看 Model name改为 host-passthrough 或 host-model虚拟机内再开 KVM 失败嵌套虚拟化未开启cat /sys/module/kvm_intel/parameters/nested设置 nested1 并持久化配置磁盘 IO 慢未使用 virtio-blklsblk -d -o NAME,TRAN,MODEL 查看 TRAN将磁盘控制器改为 virtio 并安装驱动网络延迟高未使用 virtio-net 或网卡中断不均ethtool -i 查看驱动使用 virtio-net 并配置多队列dmesg 提示 KVM disabled by BIOSBIOS 关闭 VT-x/AMD-Vdmesg 查看 kvm 相关日志重启进 BIOS 开启虚拟化vCPU 占用高但物理 CPU 空闲CPU 亲和性或 NUMA 跨片问题virsh vcpuinfo 查看 vCPU 分布配置 vcpupin 和 numatune批量虚拟机同时卡顿CPU 超卖严重或宿主机负载过高宿主机执行 uptime、mpstat 观察降低超卖比例迁移部分虚拟机CPU 型号显示正常但编译/加密很慢缺少特定 CPU 指令集grep flags /proc/cpuinfo 检查使用 host-passthrough 透传完整指令集排查时建议按顺序执行先看/dev/kvm和systemd-detect-virt再检查 domain type 和 CPU model最后测试 virtio 和性能。这个顺序能把最严重的问题先排除掉避免在一个已经失效的虚拟化层上浪费调优时间。8. 最佳实践与合规使用建议8.1 建立最小检查脚本把常用检查命令写成脚本可以显著提高多台虚拟机排障效率。这里给一个通用模板实际使用时需要替换主机名和虚拟机名称#!/usr/bin/env bash # 批量检查多台 Rocky 10 服务器的虚拟化状态 # 用法将目标主机名填入 HOSTS 变量需要配置 ssh 免密或可输入密码 HOSTSsrv01 srv02 srv03 for host in $HOSTS; do echo $host ssh $host systemd-detect-virt; ls -l /dev/kvm; lsmod | grep -E kvm_intel|kvm_amd done这个脚本只做信息采集不做修改适合在运维巡检前跑一遍快速定位哪些虚拟机可能没有走 KVM 加速。8.2 修改配置前先备份调整 libvirt XML、CPU model、vcpupin 等配置前先备份virsh dumpxml rocky10-guest /root/backup/rocky10-guest.xml.$(date %F)修改后可以用virsh define重新加载配置但要注意 CPU 模型切换会要求客户机重启可能导致业务中断。生产环境务必先在测试机验证。8.3 合规与授权边界所有检查都应基于已授权的测试或生产环境。CPU 直通、大页内存、NUMA 绑定、嵌套虚拟化等高级功能先在测试环境验证稳定后再上生产。涉及业务数据时不要用排障工具抓取或外传客户机数据。如果服务器上有第三方应用或敏感数据操作前应该和相关负责人确认窗口期避免影响在线业务。8.4 性能优化优先级性能优化的优先级建议是虚拟化加速确认 - virtio 驱动确认 - CPU 型号与指令集透传 - vCPU 亲和性与 NUMA - IO 线程与多队列 - 大页内存与容器化拆分。前两步没有做好之前不要急着调内核参数和迁移业务。很多“虚拟机很慢”的问题其实不是 Rocky 10 的锅而是虚拟化层根本就没跑在正确的工作模式上。9. 总结与下一步回到最初的问题Rocky 10 虚拟机很慢先确认它真的跑在 KVM 上。最值得先做的三个检查是systemd-detect-virt输出是否包含kvm、/dev/kvm是否存在、libvirt XML 中domain type是否为kvm。这三个检查全部通过后再进入 virtio 驱动、CPU 型号透传和 vCPU 亲和性环节。最容易踩的坑是看到systemd-detect-virt输出qemu就认定是纯软件模拟忽略了旧 libvirt 配置可能导致的误报。正确的做法是结合virsh dumpxml和 QEMU 进程参数里的accelkvm一起判断。另一个高发坑是嵌套虚拟化没开启虚拟机里即使显示vmx标志实际也无法使用 KVM 加速。后续可以继续扩展的方向包括为关键虚拟机配置 CPU pinning 和 NUMA 绑定、将磁盘和网卡完全切换为 virtio 并开启多队列、在大内存场景下配置大页内存以及在性能要求更高的网络场景下评估 vhost-user 和 SR-IOV。这套排障思路不仅能用于 Rocky 10RHEL、CentOS Stream、AlmaLinux 等基于 RHEL 的发行版都适用。建议把文章中第 4 节和第 5 节的检查命令整理成一份自己的排障清单下次遇到虚拟机变慢时直接照单排查。
返回列表