4. 使用virtio-net驱动提升网络性能

任务说明

本案例在QEMU虚拟机中为网卡启用virtio-net驱动,并与默认的e1000网卡模型进行网络性能对比。完成目标:通过环回测试验证virtio-net在吞吐量和延迟上的优势,并确认驱动加载状态。

实现方案

使用QEMU的-netdev和-device参数分别创建e1000与virtio-net两种网卡配置。虚拟机内通过ethtool确认驱动类型,使用iperf3进行TCP吞吐量测试,使用ping统计往返延迟。为消除物理网络干扰,测试在宿主机与虚拟机之间的用户态网络栈(slirp)上完成,保证两次测试的网络路径一致。

代码实现

以下脚本创建两个相同配置的虚拟机启动命令,仅网卡模型不同。测试时分别启动,记录输出。


# 启动脚本:virtio_net_test.sh
#!/bin/bash
# 依赖:qemu-system-x86_64, iperf3(虚拟机内), ethtool(虚拟机内)
# 用法:./virtio_net_test.sh [e1000|virtio-net]

NET_MODEL=$1
KERNEL="vmlinuz-$(uname -r)"
INITRD="initrd.img-$(uname -r)"
SHARED_DIR="./shared"

if [ "$NET_MODEL" = "e1000" ]; then
    NETDEV="-netdev user,id=net0 -device e1000,netdev=net0"
elif [ "$NET_MODEL" = "virtio-net" ]; then
    NETDEV="-netdev user,id=net0 -device virtio-net-pci,netdev=net0"
else
    echo "Usage: $0 [e1000|virtio-net]"
    exit 1
fi

exec qemu-system-x86_64 \
    -kernel "$KERNEL" \
    -initrd "$INITRD" \
    -append "root=/dev/ram0 console=ttyS0" \
    -m 512M \
    -nographic \
    -virtfs local,path="$SHARED_DIR",mount_tag=host0,security_model=none,id=host0 \
    $NETDEV

虚拟机内测试脚本guest_test.sh,通过9p共享目录传入:


#!/bin/bash
# 在虚拟机内执行:检测驱动、启动iperf3服务端、等待客户端连接
echo "=== 网卡驱动信息 ==="
ethtool -i eth0 | grep driver

echo "=== 启动iperf3服务端 ==="
iperf3 -s -p 5201 &
sleep 1

# 等待宿主机iperf3客户端连接(由宿主机外部触发)
wait

宿主机执行测试并收集结果:


#!/bin/bash
# host_test.sh - 在宿主机运行,分别测试两种网卡
# 前置:已启动虚拟机并运行guest_test.sh

MODEL=$1
echo "=== 测试网卡模型: $MODEL ==="

# 从虚拟机获取驱动信息(通过串口日志或共享文件)
# 此处假设已通过串口捕获到驱动名称,存入driver.txt
DRIVER=$(cat driver.txt)
echo "虚拟机内驱动: $DRIVER"

# TCP吞吐量测试(3次取平均)
for i in 1 2 3; do
    iperf3 -c 127.0.0.1 -p 5201 -t 5 -f M | grep "sum" | tail -1
done

# 延迟测试(发送20个包)
ping -c 20 127.0.0.1 | tail -1

验证方法

按以下步骤执行并观察结果:

  1. 启动e1000虚拟机:./virtio_net_test.sh e1000,在宿主机执行./host_test.sh e1000,记录吞吐量与延迟。
  2. 关闭虚拟机,改用virtio-net启动:./virtio_net_test.sh virtio-net,重复测试。
  3. 对比两次结果:virtio-net的吞吐量应显著高于e1000(通常差距在2倍以上),延迟应更低。
  4. 通过ethtool -i eth0输出确认驱动分别为e1000和virtio_net。

判定标准

  • 驱动检测:virtio-net模式下ethtool输出driver字段为virtio_net,e1000模式下为e1000。
  • 性能对比:virtio-net的iperf3吞吐量高于e1000,且ping平均延迟低于e1000。
  • 测试有效性:两次测试使用相同内核、内存和网络路径,仅网卡模型不同。
virtio-net vs e1000 性能对比测试拓扑 宿主机 (Host) QEMU 进程 -netdev user,id=net0 e1000 设备 -device e1000 virtio-net-pci -device virtio-net-pci slirp 用户态网络栈 127.0.0.1:5201 (iperf3) 虚拟机 (Guest) Linux 内核 virtio_net / e1000 驱动 iperf3 服务端 端口 5201 ethtool 驱动检测 PCI 总线 iperf3 TCP 数据流 (吞吐量测试) e1000 路径 virtio-net 路径 测试数据流

预期输出示例

以下为基于代码逻辑的确定性输出(非实测结果):


# e1000模式 - ethtool输出
driver: e1000

# virtio-net模式 - ethtool输出
driver: virtio_net

实际性能数值因内核版本、CPU和内存配置而异,需通过上述测试流程获取真实数据后对比。