虚拟机底层协议不是单一协议,而是CPU虚拟化指令、内存映射(EPT/NPT)、I/O半虚拟化(virtio)、设备直通(VFIO/SR-IOV)等一组协议的集合;选型优化要按计算、网络、存储场景分别侧重直通、半虚拟化或全虚拟化。
虚拟机底层协议有哪些?先分清半虚拟化和全虚拟化区别
虚拟机底层协议按资源类型切成三块:CPU、内存、I/O,每块都有独立的加速机制,不能混为一谈。
- CPU虚拟化协议:Intel VT-x、AMD-V,解决敏感指令陷入和上下文切换问题。
- 内存虚拟化协议:Intel EPT、AMD NPT,用二级页表减少内存翻译开销。
- I/O虚拟化协议:virtio、vhost、VFIO、SR-IOV、vDPA,覆盖从全虚拟化到硬件直通的完整路径。
全虚拟化和半虚拟化的核心区别在于guest OS是否知道自己跑在虚拟机里。
全虚拟化靠纯软件模拟设备,guest OS装标准驱动即可,I/O请求每次都要从guest陷入host,再经过用户态QEMU模拟设备,路径长,开销大。
半虚拟化在guest OS里装前端驱动,比如virtio-net、virtio-blk,前端驱动直接和host后端通信,通过共享内存的virtqueue传递数据,减少大量上下文切换。
行业共识认为,I/O虚拟化是虚拟机性能损耗的主要来源之一,所以多数生产环境的优化重点都放在I/O协议选型上。
CPU与内存协议:VT-x、EPT到底解决什么问题
CPU虚拟化最早靠二进制翻译,性能差,后来有了VMX/SVM指令,guest敏感指令自动陷入VMM,CPU执行虚拟机指令几乎达到物理机速度。
内存虚拟化靠影子页表时,每次guest页表更新都要退出,开销较大,EPT/NPT把guest物理地址到host物理地址的映射交给硬件完成,内存访问路径缩短一截。
这两层协议基本由CPU厂商固化,用户能做的优化不多,主要就是确认BIOS里开启VT-x/AMD-V,并启用EPT/NPT。
virtio协议详解:为什么半虚拟化能减少上下文切换
virtio不是单一协议,而是一套前后端通信规范。
- 前端:guest里的virtio驱动。
- 后端:host里的QEMU设备、vhost内核线程或vhost-user进程。
- 通信介质:virtqueue,本质是一块共享内存,包含descriptor table、available ring、used ring。
guest发I/O请求时,把请求描述符写入available ring,通知后端,后端处理完,把结果写入used ring,再通知guest,整个过程只发生必要的陷入和通知,不涉及大量数据拷贝和模拟寄存器操作。
不同场景如何选型优化?从KVM虚拟机网络性能优化到磁盘io性能优化方法
网络密集型场景:vhost-net、vhost-user、SR-IOV怎么选
KVM虚拟机网络性能优化常见三条路线,对应三种后端。
- vhost-net:把数据面从QEMU用户态移到内核线程,减少用户态和内核态切换,性能中等,配置简单,虚拟机迁移不受影响。
- vhost-user:把数据面交给用户态进程,通常配合OVS-DPDK,避免内核网络栈和系统调用,PPS吞吐大幅提升,代价是独占CPU核,部署复杂度增加。
- SR-IOV:物理网卡直接虚拟出多个VF,每个VM独占一个VF,数据路径完全不经过host软件栈,性能最高,接近物理网卡,缺点是无法做灵活迁移和流量镜像。
选型逻辑:
- 普通Web应用、低流量后端:vhost-net够用。
- 高PPS、低延迟场景,比如网关、防火墙:优先vhost-user或SR-IOV。
- 需要热迁移和统一流量策略:不要用SR-IOV,选择vhost-net或vhost-user。
启用vhost-net的qemu参数:
-netdev tap,id=net0,vhost=on
启用vhost-user的qemu参数:
-chardev socket,id=char0,path=/var/run/openvswitch/vhost-user0
-netdev vhost-user,chardev=char0,id=net0
存储密集型场景:virtio-blk与virtio-scsi实操对比
虚拟机磁盘io性能优化方法绕不开两个协议:virtio-blk和virtio-scsi。
- virtio-blk:结构简单,适合单块数据盘或系统盘,队列深度受限,不支持多队列时性能扩展有限。
- virtio-scsi:支持更多SCSI命令、多队列、磁盘热插拔、TRIM,在云盘和高并发随机I/O下表现更稳。
实操挂载virtio-scsi设备:
qemu-system-x86_64
-device virtio-scsi-pci,id=scsi0
-drive file=disk.qcow2,if=none,id=drive0
-device scsi-hd,drive=drive0
优化磁盘I/O还要配合使用raw格式、预分配空间、IOThread多队列,qcow2虽节省空间,但快照和压缩会带来额外元数据开销,对延迟敏感场景,raw加预分配更稳。
虚拟机io协议选型对比:宿主机和虚拟机协议差异一张表
| 协议/技术 | 虚拟化类型 | 性能级别 | 兼容性要求 | 典型场景 |
|---|---|---|---|---|
| virtio-blk/net | 半虚拟化 | 中 | 需安装virtio驱动 | 通用Web、常规I/O |
| vhost-net | 半虚拟化 | 中高 | 内核支持vhost | KVM常见网络后端 |
| vhost-user | 半虚拟化 | 高 | 需DPDK/OVS | 高PPS包转发 |
| VFIO直通 | 硬件直通 | 高 | 独占PCI设备 | GPU、NVMe低延迟 |
| SR-IOV | 硬件直通 | 高 | 网卡支持SR-IOV | 多VM共享物理网卡 |
宿主机和虚拟机io协议对比的本质,是看数据路径上经过几层软件,全虚拟化经过QEMU模拟,半虚拟化经过virtqueue和vhost线程,直通则完全旁路host。
实操:查看与切换虚拟机底层协议的关键命令
查看CPU虚拟化支持:
grep -E 'vmx|svm' /proc/cpuinfo
查看虚拟机内virtio设备:
lspci | grep -i virtio
查看网卡驱动类型:
ethtool -i eth0
查看当前磁盘队列深度:
lsblk -d -o name,model,queue-depth
启用vhost加速时,检查host内核模块:
lsmod | grep vhost
切换协议通常发生在创建虚拟机时,用virt-install或qemu命令行指定model类型,比如网卡从e1000换成virtio-net:
-device virtio-net-pci,netdev=net0,mac=52:54:00:xx:xx:xx
磁盘从IDE换成virtio-scsi:
-device virtio-scsi-pci,id=scsi0
-drive file=disk.raw,if=none,id=drive0,format=raw
-device scsi-hd,drive=drive0
在华东、华南的多地域自建机房和托管环境里,网络密集型和存储密集型的协议选型差异尤其明显,同样的虚拟机配置,协议路径不同,延迟和吞吐可能相差数倍,成本上,SR-IOV需要支持该功能的网卡,价格通常比普通千兆网卡高出一截,vhost方案则依赖CPU核数做软加速,初期投入更低。
虚拟机底层协议选型从来不是参数越高越好,而是把合适的协议放在合适的I/O路径上,虚拟化优化最终拼的是路径长度和上下文切换次数。
Q&A:虚拟机底层协议常见问题
虚拟机底层协议有哪些?和驱动是什么关系?
虚拟机底层协议包括CPU的VT-x/AMD-V、内存的EPT/NPT、I/O的virtio、vhost、VFIO、SR-IOV等,驱动是协议在guest OS里的实现,比如virtio-net驱动、virtio-blk驱动,协议定义通信规则,驱动负责执行这些规则,没有virtio驱动,guest就无法使用半虚拟化加速。
虚拟机virtio协议详解里性能瓶颈主要在哪些环节?
virtio性能瓶颈主要在三处,一是virtqueue通知机制,频繁的event index更新会带来额外陷入,二是vhost用户态和内核态的数据拷贝,虽然virtio避免了模拟设备的数据拷贝,但host内核网络栈仍可能成为瓶颈,三是单队列virtio设备在多核VM里容易出现锁竞争,多队列virtio-net或virtio-scsi可以缓解。
KVM虚拟机网络性能优化中SR-IOV和vhost-user究竟怎么选?
高吞吐、低抖动、可以接受迁移灵活性下降,选SR-IOV,需要集中管理流量策略、保留热迁移能力、但要求高PPS,选vhost-user,两者都适合网络密集型虚拟机,如果只是普通Web或内部服务,vhost-net已经足够,不必引入额外复杂度,SR-IOV还要求物理网卡和主板BIOS都支持,部署前需要确认硬件规格。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/638023.html





