如果你的 Rocky Linux 10 虚拟机跑起来明显拖沓,CPU 占用高、磁盘写入像蜗牛、网络吞吐上不去,先别急着调内核参数。很多情况下,问题根本不是 Rocky 10 本身,而是虚拟机压根没有获得硬件虚拟化加速,甚至已经退回到了纯软件模拟模式。排障的第一步,就是先确认它到底跑在哪一层虚拟化平台上。
这篇文章围绕“确认虚拟化类型”这条主线展开。我会带你从宿主机、Guest 内部、设备型号、CPU 虚拟化透传几个层面逐一排查,把 Rocky 10 虚拟机变慢的常见原因定位到具体环节。文章会给出可复制的检查命令、判断标准和整改建议,适合刚接触 KVM 虚拟化、在 PVE 或 OpenStack 上运行 Rocky Linux 10,以及用 VMware Workstation / VirtualBox 搭建实验环境后遇到性能问题的读者。读完之后至少能回答一个问题:这台 Rocky 10 到底是不是真的跑在 KVM 上。
1. 排障前的关键认知:先确认虚拟化类型
KVM 是 Linux 内核自带的虚拟化模块,QEMU 负责设备模拟。两者配合时,虚拟机的 CPU 指令可以直接交给硬件执行,性能接近物理机。如果 /dev/kvm 不存在,或者内核没有加载 KVM 模块,QEMU 会退回 TCG 纯软件模拟模式,虚拟机的每个 CPU 指令都要在用户态翻译执行,性能下降幅度非常明显。
根据实际使用环境,我把虚拟化类型分成三类:
| 虚拟化类型 | 运行方式 | 性能表现 | 常见场景 |
|---|---|---|---|
| KVM 硬件加速 | QEMU + KVM,CPU 指令直接下沉到硬件 | 接近物理机 | 服务器虚拟化、PVE、OpenStack、生产环境 |
| QEMU 纯软件模拟 | 只有 QEMU,没有 KVM 模块,TCG 翻译执行 | 明显偏慢 | 无硬件虚拟化扩展、容器内嵌 QEMU、测试环境 |
| 非 KVM 虚拟化 | VMware Workstation、VirtualBox、Hyper-V 等 | 取决于嵌套透传和驱动配置 | 个人桌面实验、跨平台开发 |
排障时最容易踩的坑是:宿主机装了 KVM,也创建了虚拟机,但虚拟机内看到的设备还是默认的 IDE 磁盘和 e1000 网卡,或者根本没有启用硬件虚拟化透传。这时候虚拟机虽然“创建成功”,但没有真正发挥 KVM 的半虚拟化能力,慢是必然结果。
另外要注意 guest OS 这个概念。在 KVM 语境里,guest OS 就是跑在虚拟机里的操作系统,比如这里的 Rocky Linux 10。确认虚拟化类型时,要分别从宿主机 host 和客户机 guest 两个角度查看,只信一方的输出都不够稳妥。
2. 适用场景与使用边界
这篇排障思路适合三类人:
第一类是刚把 Rocky Linux 10 装进 KVM / PVE / OpenStack 环境的运维新手,虚拟机创建成功但性能不理想,需要快速判断虚拟化层是否正常工作。第二类是在 VMware Workstation 或 VirtualBox 里做嵌套 KVM 实验的开发者,启动 Rocky 10 虚拟机的速度特别慢,需要确认是否开启了 CPU 虚拟化透传。第三类是负责虚拟化平台迁移的人,要把物理机或 VMware 虚拟机迁移到 KVM,迁移后 Rocky 10 出现明显卡顿,需要先排除虚拟化层配置问题。
它不解决什么问题?如果你的虚拟机 CPU 占用和磁盘延迟都正常,只是某个应用本身慢,那问题可能在应用层,比如数据库索引、Nginx 配置、Java 堆内存设置,而不是虚拟化层。如果宿主机 CPU 不支持虚拟化扩展,KVM 硬件加速无法使用,软件模拟会有性能瓶颈,此时更合适的做法是换硬件,或者改用其他虚拟化方案。如果涉及企业生产业务迁移,还要提前确认服务商对虚拟化平台的支持策略、授权边界和迁移窗口。
另外需要强调使用边界:无论是做性能排障、驱动安装还是网络配置,都应该在测试环境或已获得授权维护的服务器上操作。不要对生产环境的虚拟机和宿主机随意执行高风险命令,尤其不要在生产上直接修改虚拟机 XML 后忘记回退。涉及系统配置、内核参数调整时,先备份原配置,保留可回滚的快照,操作前确认业务维护窗口。
3. 环境准备与前置条件
在开始排障前,先把环境检查清单过一遍。这里不限定具体版本,只列通用条件。
| 检查项 | 说明 |
|---|---|
| 操作系统 | 宿主机建议使用 Rocky Linux 9/10 系列、Ubuntu Server 或 Debian 等 Linux 发行版 |
| 内核版本 | 需要包含 KVM 模块,主流 Linux 发行版默认已编译 |
| CPU 虚拟化 | Intel 需要 VT-x,AMD 需要 SVM,物理机 BIOS 里开启,或者嵌套虚拟化环境里要透传 |
| /dev/kvm | KVM 设备节点,启动 KVM 虚拟机的必要条件 |
| 管理工具 | libvirt、virt-manager、virsh、qemu-kvm,根据发行版安装 |
| 磁盘空间 | 虚拟机镜像、快照、日志预留足够空间 |
| 网络 | 桥接网络或 NAT 网络,保证 SSH 登录和测试连通性 |
| 快照能力 | 修改系统配置前建议先在宿主机打快照 |
对于 Rocky Linux 10 环境,你可以这样准备:
# 安装虚拟化管理工具,包名以实际发行版仓库为准 sudo dnf install -y qemu-kvm libvirt virt-install virt-manager # 启动 libvirtd 服务 sudo systemctl enable --now libvirtd # 检查 KVM 模块是否加载 lsmod | grep kvm # 常见输出为 kvm_intel 或 kvm_amd,确认后继续 # 检查 KVM 设备节点 ls -l /dev/kvm如果上面的输出里没有 kvm 模块,也没有 /dev/kvm,说明当前内核没有启用 KVM,或者 CPU 虚拟化扩展在 BIOS/固件层面没有打开。需要回到宿主机基础环境排查,这一步不过关,后面虚拟机性能很难正常。
4. 确认虚拟机是否真的跑在 KVM 上
这是整篇排障的核心。确认过程要分四个层面:宿主机、Guest 内部、虚拟设备型号、嵌套虚拟化透传。
4.1 宿主机层面检查 KVM 是否就绪
先登录宿主机,执行下面的命令。
# 查看 KVM 模块加载情况 lsmod | grep kvm # 查看 KVM 设备权限 ls -la /dev/kvm # 查看正在运行的虚拟机 sudo virsh list --all # 查看某个虚拟机的 VCPU 信息 sudo virsh vcpuinfo <虚拟机名称>如果virsh vcpuinfo正常返回 VCPU 编号、运行时间等状态,说明 libvirt 和 KVM 通信正常。如果提示找不到虚拟机或无法连接,先检查 libvirtd 是否运行,再用virsh list --all确认虚拟机名称是否写对。
从宿主机视角看,确认虚拟机 XML 配置中是否启用了正确的 CPU 模式和半虚拟化设备也很有必要。用virsh edit查看时,重点看三段:CPU 模式、磁盘控制器、网卡模型。
sudo virsh edit <虚拟机名称>在 XML 里,CPU 模式可以采用host-passthrough或host-model,磁盘设备推荐使用virtio-blk,网卡推荐使用virtio-net。如果看到的是ide磁盘和e1000网卡,说明设备模型比较保守,性能上会有损耗,建议在维护窗口内改成 virtio。
4.2 Guest 系统内确认虚拟化类型
登录 Rocky Linux 10 虚拟机内部,执行 systemd 自带工具,几乎不需要额外安装依赖。
# 查看系统检测到的虚拟化类型 systemd-detect-virt # 如果返回 kvm,说明跑在 KVM 上 # 如果返回 none,说明可能是物理机或容器环境 # 如果返回 vmware / oracle / microsoft 等,说明跑在其他虚拟化平台另外一个常用命令是lscpu,可以看 Hypervisor vendor 信息。
lscpu | grep -i hypervisor输出结果如果是Hypervisor vendor: KVM,基本可以确定 guest 正在 KVM 上运行。如果输出为空或没有 Hypervisor 行,则说明没有检测到 hypervisor,可能运行在物理机上,也可能是虚拟化层信息没有正确透传。
再看内核日志:
dmesg | grep -i kvm dmesg | grep -i hypervisor如果 dmesg 里有 KVM 相关的 CPU 特性、kvm-clock 等条目,说明 guest 已经感知到 KVM 时钟源和 CPU 特性,半虚拟化加速生效。如果完全没有 KVM 相关内容,很可能是退回到了纯软件模拟。
4.3 磁盘设备与网卡型号确认
很多 Rocky 10 虚拟机慢,不是 KVM 没生效,而是磁盘和网卡还在用模拟设备。KVM 的半虚拟化优势要靠 virtio 设备才能完全发挥。
Guest 内用下面命令查看磁盘和网卡。
# 查看块设备列表 lsblk -d -o NAME,TRAN,MODEL # 查看所有网卡 ip link show如果lsblk中 TRAN 显示virtio,说明磁盘设备是 virtio-blk 或 virtio-scsi,属于正常状态。如果显示sata或者ata,说明还是 SATA/IDE 模拟设备,性能会明显受限。
网卡方面,ip link show查看设备名,再配合ethtool -i查看驱动。
ethtool -i <网卡名称>驱动如果是virtio_net,说明网卡半虚拟化正常。如果看到的是e1000、e1000e、vmxnet3,说明当前不是纯 KVM virtio 网络模型,或者跑在 VMware 平台。
结合热词里的部署场景,如果用户是通过 VMware Workstation 安装 Rocky 10 后再做 KVM 实验,就需要特别注意:VMware 虚拟机的网卡驱动可能是 vmxnet3,磁盘可能是 SCSI,这并不表示跑在 KVM 上。要在 VMware 里做嵌套 KVM,必须先在 VMware Workstation 的虚拟机设置中开启“虚拟化引擎”相关的 CPU 虚拟化透传选项,否则 guest 内的 KVM 模块即使加载,也无法使用硬件加速。
4.4 确认嵌套虚拟化是否可用
如果你是在虚拟机里再创建虚拟机,比如在 VMware Workstation 或 VirtualBox 上跑 Rocky 10,然后在 Rocky 10 里跑 KVM 虚拟机,那就进入了嵌套虚拟化场景。此时要确认宿主虚拟机是否把 CPU 虚拟化扩展透传给了 guest。
登录 Rocky 10 虚拟机,查看 CPU 特性:
grep -Eo '(vmx|svm)' /proc/cpuinfo | sort -u输出包含vmx表示 Intel 虚拟化扩展可用,包含svm表示 AMD 虚拟化扩展可用。如果没有任何输出,说明 CPU 虚拟化扩展没有透传,Rocky 10 内部即使装了 KVM 也无法使用硬件加速。
同时检查 KVM 模块是否可以加载:
sudo modprobe kvm_intel # 或 sudo modprobe kvm_amd ls -l /dev/kvm如果能成功创建 /dev/kvm,说明嵌套虚拟化可用。如果 modprobe 报错,或者 /dev/kvm 没出现,说明上层虚拟机没有透传 VT-x/SVM。对于 VMware Workstation,需要在虚拟机设置的“处理器”选项卡里勾选“虚拟化 Intel VT-x/EPT 或 AMD-V/RVI”相关选项;对于 VirtualBox,需要在系统设置里启用“嵌套 VT-x/AMD-V”相关选项。不同版本菜单位置不一样,具体以你安装的版本为准,排障时优先找“虚拟化引擎”相关配置。
5. Rocky 10 虚拟机“慢”的常见原因定位
确认虚拟化类型后,接下来按优先级定位慢的原因。我列了六个高频场景。
5.1 KVM 模块未加载,退回到 QEMU 软件模拟
这是最严重的一种情况。创建虚拟机时如果 libvirt 发现 /dev/kvm 不存在,会默认用纯软件模式运行,不会直接报错。最容易发现的问题是虚拟机 CPU 占用极高、启动时间非常长。排查方式就是上面第 3 节和第 4.1 节的内容,确认宿主机 KVM 模块和设备节点是否正常。
如果宿主机只有一个 CPU 内核,没有硬件虚拟化扩展,建议不要继续用 KVM 方案,换用轻量级容器方案会更合适。
5.2 磁盘控制器配置不合理
Rocky 10 安装时如果默认选了 IDE/SATA 控制器,I/O 性能会明显下降。特别是数据库、编译任务、日志写入这类高 I/O 场景,SATA 模拟设备会成为瓶颈。整改方式是在停机状态下把磁盘控制器改为 virtio,并在 Guest 内安装 virtio 驱动。Rocky Linux 内核默认自带 virtio_blk 和 virtio_scsi 驱动,通常不需要额外安装。
5.3 网卡模型不匹配
虚拟机网络吞吐上不去,也可能是 e1000 模拟网卡的问题。e1000 兼容性好,但性能不如 virtio-net。如果业务对网络要求高,比如跑 Nginx、对象存储网关或数据库主从同步,建议改成 virtio-net,并确认桥接模式正确。
改网卡模型后,在 Guest 内重新获取 IP 即可。如果通过 SSH 管理虚拟机,注意改网卡时可能断连,最好在宿主机上通过virsh console或带外管理操作。
5.4 Guest Agent 未安装
KVM 环境下安装 qemu-guest-agent 可以提供更强的性能和状态反馈。它能让宿主机通过 VirtIO 串口获取 guest 的 IP、文件系统状态和负载信息,部分管理平台也要依赖它才能展示正确的 guest 指标。没有 agent 不影响核心运行,但会影响统一监控和优雅关机。
Rocky Linux 10 安装命令:
sudo dnf install -y qemu-guest-agent sudo systemctl enable --now qemu-guest-agent如果是在 VMware 平台,对应的组件是 VMware Tools 或 open-vm-tools;在 VirtualBox 里是 Guest Additions。不同平台别装混,避免设备冲突。
5.5 CPU 模式导致特性缺失
虚拟机 XML 中 CPU 模式如果设置为比较保守的模型,guest 内看到的 CPU 特性会减少,某些软件可能无法利用新的指令集。生产环境建议使用host-passthrough或host-model,前提是宿主机的 CPU 型号在所有迁移目标主机上兼容。如果有热迁移需求,就需要更谨慎地选择 CPU 模式,不能只追求最高性能而忽略迁移兼容性。
5.6 网络配置错误导致重试和慢连接
Rocky 10 作为 guest 时,如果系统的网络配置成 DHCP,且 DHCP 服务没有及时响应,开机阶段会等待很久。另外,热词里经常提到“rocky 10 配置网络静态ip”,也就是静态 IP 配置问题。如果网卡名称或连接配置不对,network-scripts 和 NetworkManager 同时管理会导致网络服务启动慢。
可以使用 NetworkManager 配置静态 IP:
# 查看网络连接名称 nmcli connection show # 修改指定连接的 IP 地址、网关和 DNS,参数按实际网络环境调整 sudo nmcli connection modify "Wired connection 1" ipv4.method manual ipv4.addresses 192.168.122.10/24 ipv4.gateway 192.168.122.1 ipv4.dns 192.168.122.1 # 重启连接生效 sudo nmcli connection down "Wired connection 1" sudo nmcli connection up "Wired connection 1"这类问题虽然不会让 CPU 变慢,但会让虚拟机开机、SSH 登录、应用启动过程显得很卡,容易被误判成性能问题。
6. 性能观察与效果验证
排障不能只看“感觉变快了”,要有可重复的验证方法。无论是要确认 KVM 是否生效,还是检查 virtio 设备是否起作用,都可以用下面的通用流程做前后对比。
6.1 基础状态验证流程
每次调整前,先记录当前状态:
# 记录虚拟化类型 systemd-detect-virt # 记录 CPU 信息 lscpu | grep -E 'Hypervisor|Model name|CPU\(s\)' # 记录磁盘设备类型 lsblk -d -o NAME,TRAN,MODEL # 记录网卡驱动 for iface in $(ls /sys/class/net/ | grep -v lo); do echo "$iface: $(ethtool -i $iface 2>/dev/null | grep driver)"; done然后把输出保存到文件,作为排障基线。改动配置后,再执行一遍相同命令,对比虚拟化类型和设备驱动是否有变化。
6.2 半虚拟化是否生效的关键信号
在 Guest 内可以检查时钟源:
cat /sys/devices/system/clocksource/clocksource0/current_clocksource如果输出是kvm-clock,说明 KVM PV 时钟已经生效。如果输出是tsc或hpet,说明虚拟化时钟支持没有完全启用,需要进一步看内核模块和启动参数。
另外可以查看内核是否加载了 virtio 相关模块:
lsmod | grep virtio正常环境下应该能看到 virtio、virtio_net、virtio_blk、virtio_pci 等模块。如果这些模块缺失,说明当前内核没有打开 VirtIO 支持,或者系统安装时精简了内核模块。
6.3 CPU、内存、磁盘、网络四维度验证
性能对比不能只看一个指标。
- CPU 维度:用高压力命令观察用户态和系统态 CPU 占比。纯软件模拟时,CPU 的系统态占用和整体负载会显著偏高。
- 内存维度:观察 guest 内存分配是否合理,不要出现宿主机物理内存不足导致 swap 频繁使用。
- 磁盘维度:用 dd 或 fio 做简单读写测试,重点对比修改 virtio 前后的顺序读、顺序写和随机写性能。测试时不要在生产业务磁盘上直接做破坏性写入。
- 网络维度:在 guest 与宿主机之间用 iperf3 测试 TCP 吞吐,对比 e1000 与 virtio-net 的差异。
需要说明的是,具体数值受宿主机磁盘类型、CPU 型号、内存频率、网络环境和工作负载影响,不能一概而论。这里给的是对比方法,不是绝对基准。只要记录修改前后两轮数据,就能看出调整是否有效。
7. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 虚拟机开机极慢,CPU 占用高 | KVM 模块未加载,QEMU 退回纯软件模拟 | 查看 /dev/kvm、lsmod | grep kvm | 开启 BIOS 虚拟化,加载 kvm 模块,重启 libvirtd |
| systemd-detect-virt 输出 none | guest 没检测到 hypervisor,虚拟化透传失败 | 在宿主机检查 CPU 信息和虚拟机配置 | 检查虚拟化平台配置,嵌套环境开启透传 |
| 磁盘性能明显偏低 | 磁盘控制器是 IDE/SATA | lsblk -d -o NAME,TRAN,MODEL | 停机修改磁盘控制器为 virtio,确认 virtio_blk 驱动 |
| 网络吞吐低且 CPU 高 | 网卡模型是 e1000 | ethtool -i 查看驱动 | 改为 virtio-net,配置桥接网络 |
| 开机卡在等待网络 | 静态 IP 或 DHCP 配置问题 | nmcli connection show、systemd-analyze blame | 用 NetworkManager 重配静态 IP 或调整 DHCP 超时 |
| 宿主机上无法创建新虚拟机 | /dev/kvm 权限不足或不存在 | ls -l /dev/kvm | 将运行用户加入 kvm 组,确认模块已加载 |
| 嵌套 KVM 环境 modprobe 失败 | 上层虚拟机没有透传 VT-x/SVM | grep -Eo '(vmx|svm)' /proc/cpuinfo | 在 VMware/VirtualBox 设置中开启虚拟化引擎透传 |
| VMware Tools 提示没有数字签名 | 驱动签名策略导致 vmtool 无法安装 | 查看系统日志、检查签名策略 | 使用 open-vm-tools,或调整测试环境的驱动签名策略 |
| VMware Workstation 无法连接虚拟机 | 虚拟机服务未启动或 vmx 路径错误 | 检查 VMware 服务状态和虚拟机日志 | 重启 VMware 服务,确认 vmx 文件路径 |
| 客户机操作系统已禁用 CPU | 虚拟化设置中 CPU 受限 | 查看 CPU 设置和 VMware 日志 | 调整处理器设置,进入虚拟机设置确认虚拟化引擎选项 |
表格里没有涵盖所有可能,但覆盖了 Rocky 10 虚拟机在 KVM、VMware、VirtualBox 环境中的高频问题。排障时按“先确认虚拟化类型,再查设备驱动,再测性能”的顺序走,不要跳步。
8. 最佳实践与整改建议
排障完成之后,可以用下面这些工程化方式减少后续问题。
8.1 保留一套最小可运行配置
把确定能正常启动且性能达标的虚拟机配置保存下来,包括 virtio 磁盘、virtio-net、host-passthrough CPU、qemu-guest-agent 等。下次创建新虚拟机时直接复用模板,避免每次重新踩坑。可以使用 virt-clone 或 virt-sysprep 制作模板镜像。
8.2 目录和快照管理
建议把磁盘镜像、ISO 镜像、快照和日志分别放到独立目录管理。修改虚拟机 XML 前先备份配置:
# 备份虚拟机定义 sudo virsh dumpxml <虚拟机名称> > /backup/<虚拟机名称>.xml # 查看磁盘镜像位置 sudo virsh domblklist <虚拟机名称>涉及系统内核参数、网卡模型、磁盘控制器调整时,先打快照。测试环境里快照可以节约大量回滚时间,生产环境要谨慎确认快照链长度和备份策略。
8.3 日志和监控
批量管理多个 KVM 虚拟机时,建议把日志统一收集。宿主机的 /var/log/libvirt/qemu/ 目录下会有每个虚拟机的日志,guest 内部可以用 journald 记录系统日志。如果虚拟机变慢,优先看宿主机负载、内存占用、磁盘 I/O wait 和网络重传统计,再进 guest 内看应用日志。
8.4 合规与授权提示
排障过程中会涉及系统配置、网络策略、镜像和数据集。如果你在虚拟机里处理的是用户数据、版权素材或业务敏感信息,需要确认有明确的授权和使用边界。不要在生产业务虚拟机里随意安装来源不明的驱动或 agent,也不要使用未经授权的镜像。涉及自动化批量操作时,先用一台测试虚拟机验证完整流程,再对目标机器执行。
9. 总结与下一步
这次排障的核心思路可以压缩成一句话:Rocky Linux 10 虚拟机很慢,先不要默认是系统调优问题,先确认它真的跑在 KVM 上。重点验证四件事:宿主机有没有可用的 /dev/kvm,guest 内部 systemd-detect-virt 是否返回 kvm,磁盘和网卡是否用了 virtio 设备,嵌套虚拟化环境是否透传了 VT-x/SVM。
最容易踩的坑是:VMware Workstation 或 VirtualBox 里创建 Rocky 10,然后发现内部无法使用 KVM 加速,因为上层虚拟机没有打开 CPU 虚拟化透传。如果没有硬件虚拟化支持,KVM 方案就不成立,这时候纠结内核参数没有意义。
我最建议你先做一件事:登录 Rocky 10 执行systemd-detect-virt,再执行lsblk -d -o NAME,TRAN,MODEL和ethtool -i检查驱动。这三个命令一分钟内能出结果,可以快速判断虚拟化层是否正常。如果输出显示 KVM + virtio,那说明平台没问题,慢的原因是应用或资源分配;如果输出显示 QEMU 纯软件模拟或 e1000/IDE 设备,那就是虚拟化层配置问题,按文章里的步骤整改。
后续可以继续扩展的方向包括:Rocky 10 虚拟机内存和 CPU 的静态绑定、大页内存配置、NUMA 拓扑优化、virtio-scsi 多队列、网卡多队列调优,以及把整套 KVM 排障脚本化、接入监控告警。先把虚拟化层确认清楚,后面这些优化才有意义。建议收藏备用,下次遇到虚拟机性能问题时可以一条条对照。