服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-10-25 简米科技 4,811 字 12 分钟阅读

Linux虚拟机如何实现去虚拟化?性能提升关键步骤是什么?

导读Linux虚拟机去虚拟化的核心思路,就是让客户机绕过虚拟化层直接访问物理硬件,从而将性能损耗降到最低;关键步骤则集中在PCIe设备透传、vCPU绑定与NUMA拓扑优化、大页内存配置以及virtio驱动替换这四个维度,判断虚拟化损耗有多大:先诊断再动手很多朋友一上来就急着调参数,结果折腾半天发现瓶颈根本不在CPU……

Linux虚拟机去虚拟化的核心思路,就是让客户机绕过虚拟化层直接访问物理硬件,从而将性能损耗降到最低;关键步骤则集中在PCIe设备透传、vCPU绑定与NUMA拓扑优化、大页内存配置以及virtio驱动替换这四个维度。

判断虚拟化损耗有多大:先诊断再动手

很多朋友一上来就急着调参数,结果折腾半天发现瓶颈根本不在CPU,去虚拟化之前,你得先搞清楚性能到底丢在哪里。

先用工具摸清底细,在宿主机上跑一遍virt-top和perf,对比虚拟机内外的基准测试数据,行业共识认为,KVM默认配置下,CPU密集型任务的性能损耗大约在5%到10%之间,网络吞吐损耗可能达到20%以上,磁盘IOPS损耗则取决于存储后端和驱动类型。

如果发现CPU使用率居高不下但业务吞吐上不去,多半是vCPU调度和缓存争抢的问题,如果网络延迟忽高忽低,大概率是virtio-net队列和中断处理没对齐,如果磁盘写入像蜗牛,得检查是不是还在用IDE模拟磁盘而不是virtio-blk。

诊断命令参考:

  • 查看vCPU调度情况:virsh vcpuinfo <虚拟机名称>
  • 查看NUMA拓扑:numastat -p <宿主机PID>
  • 查看中断分布:cat /proc/interrupts | grep virtio

KVM虚拟机透传配置步骤:PCIe设备直通怎么做

去虚拟化最彻底的方式之一,就是把物理设备直接交给虚拟机独占,这就是PCIe passthrough,也叫设备直通。

硬件前提与BIOS设置

先确认CPU支持VT-d(Intel)或AMD-Vi(AMD),在BIOS里开启相关虚拟化选项,一般叫“VT-d”或“IOMMU”,然后在宿主机内核启动参数里加上intel_iommu=on iommu=pt,修改/etc/default/grub后执行update-grub并重启。

分离设备与虚拟机挂载

以直通一块网卡为例,操作路径如下:

  1. 找到设备ID:lspci -nn | grep Ethernet,记下类似8086:1533的厂商和设备号
  2. 从宿主机解绑驱动:virsh nodedev-detach pci_0000_04_00_0
  3. 编辑虚拟机配置:virsh edit <虚拟机名称>,在<devices>段添加:
<hostdev mode='subsystem' type='pci' managed='yes'>
  <source>
    <address domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
  </source>
</hostdev>
  1. 启动虚拟机验证:virsh start <虚拟机名称>,进入系统后用lspci确认设备可见

注意:直通显卡时,建议同时配置<driver name='vfio'/>,并确保虚拟机有足够的内存锁定限制,编辑/etc/security/limits.conf,添加@vfio hard memlock unlimited和@vfio soft memlock unlimited。

直通后的性能表现

直通后,虚拟机的网络转发能力可以接近物理机水平,延迟降低明显,GPU直通更是能让图形渲染和CUDA计算任务几乎无损耗运行,不过直通也有代价设备被某个虚拟机独占后,其他虚拟机就无法使用了。

Linux虚拟机CPU性能优化:vCPU绑定与NUMA拓扑

设备透传解决的是特定硬件的独占问题,但大多数场景下,你更需要的是一套通用的CPU和内存调优方案。

vCPU绑定:让调度器别乱跑

默认情况下,QEMU进程的vCPU线程会被宿主机调度器分配到任意物理核心上,这会导致CPU缓存频繁失效,跨NUMA访问内存更是性能杀手。

绑定操作:

  1. 查看宿主机CPU拓扑:lscpu -e,确认哪些物理核心属于同一个NUMA节点
  2. 编辑虚拟机配置,在<vcpu>标签中设置cpuset属性:
<vcpu placement='static' cpuset='0-3,8-11'>4</vcpu>
  1. 进一步绑定vCPU线程到特定物理核心,在<cputune>段中配置:
<cputune>
  <vcpupin vcpu='0' cpuset='0'/>
  <vcpupin vcpu='1' cpuset='1'/>
  <vcpupin vcpu='2' cpuset='8'/>
  <vcpupin vcpu='3' cpuset='9'/>
</cputune>

NUMA亲和性:让内存离CPU更近

现代服务器都是多路CPU架构,跨NUMA节点访问内存的延迟比本地访问高出30%到50%,去虚拟化的重要一步,就是让虚拟机的内存分配尽量落在vCPU所在的NUMA节点上。

配置方法:

<numatune>
  <memory mode='strict' nodeset='0'/>
  <memnode cellid='0' mode='strict' nodeset='0'/>
</numatune>

在虚拟机内部也要开启NUMA感知,以MySQL为例,启用innodb_numa_interleave=ON可以让内存分配更均匀,避免单个节点内存耗尽触发swap。

大页内存:TLB缺失是隐形杀手

虚拟机内部访问内存时,默认4KB页大小会导致TLB命中率偏低,开启HugePages后,页面大小变为2MB或1GB,TLB覆盖范围扩大数百倍。

宿主机配置:

echo 2048 > /proc/sys/vm/nr_hugepages

虚拟机配置:

<memoryBacking>
  <hugepages>
    <page size='2048' unit='KiB'/>
  </hugepages>
  <locked/>
</memoryBacking>

注意,虚拟机内存总量不能超过宿主机可用大页内存总和。<locked/>表示锁定内存,防止被交换到磁盘,这对数据库类应用尤其重要。

存储与网络去虚拟化:virtio与多队列优化

CPU和内存搞定后,存储和网络往往是新的瓶颈点,很多虚拟化性能问题,根源在于使用了模拟设备而不是半虚拟化设备。

磁盘:从IDE到virtio-blk

如果你在虚拟机里看到/dev/sda对应的控制器是Intel 82371AB PIIX IDE,那性能一定好不了,IDE模拟是纯软件模拟,每次IO都要经过完整的设备模拟路径。

正确做法:

  • 改用virtio-blk或virtio-scsi控制器
  • 缓存策略选择none或directsync,避免双重缓存
  • 对于高IOPS场景,使用io_uring或native异步IO模式

磁盘配置对比:

驱动类型 适用场景 相对性能
IDE模拟 老系统兼容 基线
virtio-blk 通用块设备 提升2-3倍
virtio-scsi 需要高级SCSI特性 接近物理磁盘
NVMe模拟 低延迟高并发 进一步提升

网络:virtio-net多队列

默认的单队列virtio-net在万兆网卡面前就是瓶颈,开启多队列后,每个vCPU对应一个队列,中断处理可以并行。

配置步骤:

<interface type='bridge'>
  <source bridge='br0'/>
  <model type='virtio'/>
  <driver name='vhost' queues='4'>
    <host mrg_rxbuf='on'/>
    <guest csum='on' tso4='on' ecn='on'/>
  </driver>
</interface>

虚拟机内部执行ethtool -L eth0 combined 4,让队列数与vCPU数匹配,同时把网卡中断绑定到不同CPU上,避免所有中断挤在一个核心上。

综合性能提升路径

按优先级排序的操作清单:

  • 替换半虚拟化驱动:virtio-blk、virtio-net、virtio-scsi
  • 配置vCPU绑定和NUMA亲和性
  • 开启大页内存并锁定
  • 对高性能设备使用PCIe直通
  • 调整虚拟机内参数:内核mitigations=off、CPU调频模式设为performance

去虚拟化后的验证与常见问题

优化完成后,必须重新跑一遍基准测试,用数据说话,对比优化前后的sysbench、fio和iperf3结果,确认每一项改动带来的收益。

常见坑位提醒:

  • 开启大页后,虚拟机内存分配失败,检查nr_hugepages是否足够
  • 绑定CPU后出现抖动,确认是否绑定了SMT兄弟线程,导致两个vCPU共享同一个物理核
  • 直通网卡后虚拟机无法启动,检查IOMMU组是否完整,部分平台需要把设备及其上游PCIe端口一起直通

Linux虚拟机的去虚拟化,本质上是减少软件模拟层,增加硬件直通路径,先诊断再优化,优先改驱动,再调CPU和内存,最后考虑设备直通,每一步改动都用基准测试验证,才能确保性能提升真实有效。

Q&A:Linux虚拟机去虚拟化常见问题

问:KVM虚拟化性能损耗主要来自哪些方面?

损耗主要来自三处:vCPU调度带来的上下文切换和缓存失效、设备模拟路径上的数据拷贝与中断处理开销、以及内存管理中的TLB缺失和NUMA跨节点访问,通过vCPU绑定、virtio驱动和大页内存配置,可以消除大部分损耗。

问:PCIe直通和virtio驱动怎么选?

如果设备需要独占且性能要求极高,比如GPU计算、高性能网卡,选PCIe直通,如果设备需要共享给多个虚拟机,或者要求灵活性,选virtio,直通性能最好但灵活性差,virtio性能接近物理设备且支持热迁移。

问:去虚拟化后虚拟机还能做快照和热迁移吗?

使用virtio驱动和普通磁盘镜像时,快照和热迁移不受影响,但开启大页锁定内存后,热迁移会变慢,因为需要传输更大的内存页,PCIe直通设备不支持热迁移,快照只能记录设备状态,无法保证设备内部数据一致性。

分享本文
本文为 简米科技官网 原创,已由运维技术专家审核。转载请注明来源:原文链接
售前咨询 服务热线 售后 邮箱