虚拟机不可能真正“去除”虚拟化层,但通过CPU直通、半虚拟化驱动和调度优化,能把多数场景的性能损耗压到接近物理机的个位数百分比。 如果你追求的是游戏帧率、数据库延迟或网络转发吞吐,关键不是“删掉虚拟化”,而是把CPU、内存、I/O三条路径上的模拟开销逐项砍掉。
虚拟机去虚拟化后性能对比真实机:差距到底在哪
先把概念说清楚:所谓“去虚拟化”,在工程上通常指让客户机尽量少感知虚拟化层,比如CPU模式用host-passthrough、设备走直通、驱动走virtio,它不是把Hypervisor卸载掉,物理机直装仍然是性能上限。
虚拟化开销主要来自三处
- CPU陷入与退出:客户机执行特权指令时被Hypervisor截获,频繁切换会拉高延迟。
- 内存地址转换:EPT/NPT虽然硬件加速了页表,但大内存、跨NUMA访问仍会带来额外开销。
- I/O模拟:全模拟网卡、IDE控制器、软声卡这类设备,会把CPU拖进不必要的忙等和中断处理。
行业共识认为,在通用服务器上,未优化的虚拟机I/O损耗往往比CPU损耗更明显,你感觉“虚拟机卡”,先查存储和网络,别一上来就怪CPU。
不同负载的体感差异
| 负载类型 | 主要瓶颈 | 优化优先级 |
|---|---|---|
| 办公、开发编译 | 单核性能、内存容量 | CPU host-passthrough、关闭内存气球 |
| 数据库、缓存服务 | 存储IOPS、NUMA延迟 | virtio-blk/scsi、CPU pinning、大页内存 |
| 游戏、3D渲染 | GPU直通、CPU单核 | PCIe直通、关闭侧通道缓解需权衡安全 |
| 软路由、防火墙 | 网络中断、多队列 | virtio-net多队列、vhost-net、SR-IOV |
判断要不要折腾的简单标准
- 虚拟机跑分只有物理机的较大比例,且任务对延迟敏感,值得做直通和调度优化。
- 只是偶尔开个Linux编译环境,优先加内存、换NVMe,比调XML参数见效快。
- 生产环境先做监控:看CPU就绪时间、内存气球回收、存储await、网络重传,再决定动哪一刀。
KVM虚拟机CPU直通配置教程:把硬件性能榨出来
KVM是折腾空间最大的平台,下面这套路径在主流Linux发行版上通用,操作前先备份虚拟机XML,改坏了还能回滚。
先确认硬件和内核支持
在宿主机执行:
egrep -c '(vmx|svm)' /proc/cpuinfo lsmod | grep kvm dmesg | grep -i -e DMAR -e IOMMU
第一条输出大于0,说明CPU虚拟化已开启;第二条能看到kvm_intel或kvm_amd;第三条有DMAR/IOMMU字样,才具备PCIe直通基础,BIOS里还要打开VT-x/AMD-V、VT-d/AMD-Vi、Above 4G Decoding,缺一项,后面直通就会卡在IOMMU分组上。
CPU模式改成host-passthrough
执行virsh edit 虚拟机名,把<cpu>段改成:
<cpu mode='host-passthrough' check='none' migratable='on'/> <topology sockets='1' cores='4' threads='2'/>
host-passthrough让客户机直接看到宿主CPU特性,减少特性屏蔽带来的指令模拟,拓扑要和宿主物理核心对得上,别给虚拟机塞一个宿主不存在的核心组合,需要迁移的场景慎用,migratable='on'能缓解一部分兼容问题。
内存大页和NUMA亲和
大页能减少TLB miss,宿主机GRUB里加:
default_hugepagesz=1G hugepagesz=1G hugepages=8
然后虚拟机XML里加:
<memoryBacking> <hugepages/> </memoryBacking>
NUMA方面,用lscpu | grep NUMA看节点分布,再用virsh numatune 虚拟机名 --mode=strict --nodeset=0绑定内存节点,vCPU用virsh vcpupin绑到同一NUMA节点的物理核上,跨节点访问的延迟能明显降下来。
I/O走virtio和vhost
磁盘别用IDE,改成virtio-blk或virtio-scsi,缓存模式按数据安全要求选none或writeback,网络用virtio-net,并开启多队列:
<interface type='network'> <model type='virtio'/> <driver name='vhost' queues='4'/> </interface>
客户机内用ethtool -l确认队列生效,多队列不是越多越好,队列数别超过vCPU数。
GPU与PCIe设备直通
先确认IOMMU分组:
for d in /sys/kernel/iommu_groups//devices/; do
n=${d#/iommu_groups/}; n=${n%%/}
printf 'IOMMU Group %s ' "$n"
lspci -nns ${d##/}
done
把目标设备绑定到vfio-pci,再在XML里加<hostdev>,直通后宿主机不能再用这张卡,笔记本双显卡用户要留好显示输出,GPU直通配合Looking Glass这类方案,能把游戏和渲染负载压到接近物理机水平,但配置门槛不低。
家用电脑跑虚拟机卡顿怎么解决:从BIOS到驱动的排查清单
家用场景的卡顿,多数不是虚拟化层太慢,而是BIOS没开全、动态内存乱分配、存储拖后腿。
BIOS和宿主设置
- 打开VT-x/AMD-V、VT-d/AMD-Vi、Above 4G Decoding、Resizable BAR。
- Windows宿主把电源计划设成高性能,别让CPU频率在后台被压下去。
- 宿主开启内存完整性/VBS会占用虚拟化能力,和部分虚拟机软件冲突;关不关要看安全需求,别为了跑分把生产机安全策略全关了。
VMware Workstation和VirtualBox的关键开关
VMware Workstation里,虚拟机设置中勾选“虚拟化Intel VT-x/EPT或AMD-V/RVI”,处理器核心数按物理核分配,别超过宿主逻辑核,内存设置里取消“动态分配所有内存”,减少气球回收抖动,3D加速按需开启,老显卡驱动反而可能拖慢。
VirtualBox里,系统页开启嵌套虚拟化,半虚拟化接口选KVM或Hyper-V,具体看客户机系统,存储控制器选NVMe或SATA,别用IDE,显卡控制器用VMSVGA,装好增强功能包。
客户机内部优化
- Linux客户机装
qemu-guest-agent,Windows客户机装virtio驱动和Guest Tools。 - 客户机电源计划同样设高性能,关闭无用的后台更新和索引服务。
- 动态内存适合测试环境,生产库和编译机建议固定内存,避免回收时卡顿。
存储和内存的硬瓶颈
虚拟机磁盘放在机械硬盘上,再怎么调XML也救不回来,优先把虚拟磁盘放到NVMe SSD,宿主内存留足余量,内存不够时,宿主会频繁换页,虚拟机体感就是全局卡死。
中小企业虚拟化服务器性能优化方案:少花钱也能跑出真实硬件感
中小企业不一定需要买新服务器,先把现有平台的软件层调优做满,再判断要不要上直通和SR-IOV。
先做容量和瓶颈评估
- 看CPU就绪时间,持续偏高说明物理核超分过头。
- 看内存气球和交换分区使用,气球频繁回收会拉高延迟。
- 看存储IOPS和await,虚拟机密度一高,机械盘阵列最先扛不住。
- 看网络重传和丢包,虚拟交换机配置不当会让内网吞吐掉档。
生产环境优先做的五件事
- CPU模式统一用host-passthrough,前提是集群内CPU型号一致。
- 关键虚拟机做vCPU pinning和NUMA绑定,数据库类负载收益明显。
- 磁盘和网卡全部virtio化,开启vhost-net和多队列。
- 大页内存给数据库和缓存服务,普通文件服务器不必强上。
- 关闭不必要的虚拟设备,比如软驱、USB控制器、旧式显卡。
什么场景值得上直通和SR-IOV
数据库、视频转码、软路由、GPU工作站这类对延迟和吞吐敏感的业务,PCIe直通和SR-IOV的收益比通用Web服务大得多,普通OA和文件共享,把virtio和CPU模式调好就够用。
虚拟机性能优化要花多少钱:先看零成本项
多数情况下,软件层调优是零成本,主要投入在时间和验证上,需要花钱的地方通常是NVMe盘、万兆网卡、内存扩容,以及外部服务按项目报价,价格差异很大,别只看“优化”两个字,先让对方给出瓶颈评估和验收指标。
Q&A:虚拟机去虚拟化与真实硬件性能常见问题
虚拟机去虚拟化后能完全等同于物理机吗?
不能完全等同,CPU直通和半虚拟化驱动能砍掉大部分模拟开销,但调度延迟、内存地址转换和安全缓解带来的损耗仍在,对延迟极其敏感的交易系统,物理机直装仍是更稳的选择。
开启CPU直通会不会影响宿主稳定性和安全?
会影响,直通设备从宿主解绑后,宿主不能再使用;IOMMU分组不干净时,直通可能失败甚至影响宿主,关闭侧通道缓解能提性能,但会削弱安全防护,生产环境要按合规要求权衡。
云服务器能做CPU直通吗?
多数公有云不提供物理CPU直通,常见的是裸金属实例、GPU直通实例或SR-IOV增强网络,具体要看厂商规格,普通云主机上做host-passthrough通常无效,因为底层CPU特性已被屏蔽。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/772842.html


