半虚拟化是什么
半虚拟化让 guest 主动配合虚拟化层:通过 hypercall 与共享环传递 I/O 请求,绕开陷入再模拟的高开销路径。代表实现是 Xen PV 与 virtio 驱动族。它的优势是 I/O 路径更短、上下文切换更少;限制是必须在 guest 内安装对应前端驱动,老系统与不支持的系统需要单独适配,否则收益消失甚至无法启动。
基本信息
| 核心思想 | guest 主动配合,hypercall 与共享环通信 |
|---|---|
| 代表实现 | Xen PV、virtio 系列驱动 |
| 优势 | I/O 路径短、上下文切换少、吞吐与 CPU 占用更优 |
| 限制 | 需要 guest 侧驱动支持,老系统与异构系统要单独适配 |
| 常见设备 | virtio-net、virtio-blk、virtio-scsi、virtio-balloon |
典型使用场景
- 云主机磁盘与网卡默认使用 virtio,获得接近物理机的 I/O 性能
- 自建 KVM 环境为虚机配置 virtio 磁盘与网卡
- 导入外部镜像前确认内部是否已装 virtio 驱动
- 排查虚机 I/O 慢:确认设备是否走了 virtio 与 vhost 加速
- 内存弹性场景使用 balloon 驱动回收空闲内存
检查是否在用 virtio 设备
检查是否在用 virtio 设备
lspci | grep -i virtio # 列出 virtio 设备
lsblk -o NAME,ROTA,SIZE,MOUNTPOINT # 查看磁盘与挂载情况
ethtool -i eth0 | grep driver # virtio_net 表示网卡走 virtio
lsmod | grep virtio # 确认相关驱动已加载
dmesg | grep -i virtio # 启动时的设备探测记录设备与异常表现
| 设备 | 作用 | 异常表现 |
|---|---|---|
| virtio-net | 半虚拟化网卡 | 未启用时退回模拟网卡,吞吐明显偏低 |
| virtio-blk | 半虚拟化块设备 | 缺驱动时系统盘无法识别 |
| virtio-scsi | 带 SCSI 语义的存储接入 | 切换总线后老系统看不到磁盘 |
| virtio-balloon | 内存气球,按需回收内存 | 未启用时宿主无法回收虚机空闲内存 |
| 驱动缺失 | 镜像内没装前端驱动 | 导入后启动失败或只能降级运行 |
现代云平台普遍用 virtio 提升磁盘与网络性能;导入镜像前先确认镜像内已有 virtio 驱动,否则可能起不来。
半虚拟化常与硬件辅助虚拟化配合:CPU 层面走硬件辅助全虚拟化,磁盘与网卡走 virtio 半虚拟化驱动,这种组合在性能与兼容性之间最平衡。