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
验证方法
按以下步骤执行并观察结果:
- 启动e1000虚拟机:
./virtio_net_test.sh e1000,在宿主机执行./host_test.sh e1000,记录吞吐量与延迟。 - 关闭虚拟机,改用virtio-net启动:
./virtio_net_test.sh virtio-net,重复测试。 - 对比两次结果:virtio-net的吞吐量应显著高于e1000(通常差距在2倍以上),延迟应更低。
- 通过
ethtool -i eth0输出确认驱动分别为e1000和virtio_net。
判定标准
- 驱动检测:virtio-net模式下
ethtool输出driver字段为virtio_net,e1000模式下为e1000。 - 性能对比:virtio-net的iperf3吞吐量高于e1000,且ping平均延迟低于e1000。
- 测试有效性:两次测试使用相同内核、内存和网络路径,仅网卡模型不同。
预期输出示例
以下为基于代码逻辑的确定性输出(非实测结果):
# e1000模式 - ethtool输出
driver: e1000
# virtio-net模式 - ethtool输出
driver: virtio_net
实际性能数值因内核版本、CPU和内存配置而异,需通过上述测试流程获取真实数据后对比。