QEMU net‐bench result - Antareske/tgoskits GitHub Wiki
net-bench 测试报告 — x86_64 vhost (smp=1, KVM)
日期: 2026-07-18
Starry commit: 2529b4d6a
测试环境
| 项目 | 值 |
|---|---|
| Host 系统 | Linux Astalia 6.18.33.2-microsoft-standard-WSL2 x86_64 |
| Host CPU 核心数 | 32 |
| QEMU | 8.2.2 (Debian 1:8.2.2+ds-0ubuntu1.17) |
| Host iperf3 | 3.16 |
| Guest iperf3 | 3.19.1 |
| KVM | /dev/kvm 可用 |
| vhost-net | /dev/vhost-net 可用 |
测试配置
| 参数 | 值 |
|---|---|
| 场景 | vhost(TAP + vhost-net) |
| 架构 | x86_64 |
| 加速 | KVM (-accel kvm -cpu host) |
| SMP | 1 |
| 内存 | 2G |
| 网络设备 | virtio-net-pci (plain, 无 mq/vectors/offload) |
| 网络拓扑 | tap,id=net0,ifname=tap0,vhost=on,bridge br0 192.168.100.1/24 |
| UEFI | 启用 |
| Starry Guest 内核 | StarryOS(PIE, x86_64-unknown-linux-musl) |
| Linux Guest 内核 | 7.0.0-28-generic (Ubuntu) |
| Linux Guest rootfs | Alpine initramfs(与 Starry 同源 rootfs 提取) |
| 每次测试迭代 | warmup=1 + measured=5(iperf3 -t 5) |
| 跨启动重复 | 5 次(累计 25 个测量点) |
测试负载
| 测试 | iperf3 参数 | 说明 |
|---|---|---|
| tcp1 | (默认,1 流) | TCP 单流上行吞吐 |
| tcp4 | -P 4 |
TCP 4 流上行吞吐 |
| tcp1r | -R |
TCP 单流下行吞吐 |
| udp1g | -u -b 1G |
UDP 大包吞吐(目标 1Gbps) |
| udp64 | -u -l 64 -b 100M |
UDP 64B 小包 PPS(目标 100Mbps) |
结果对比
吞吐与 PPS
| 测试 | Starry | Linux Baseline | Starry/Linux |
|---|---|---|---|
| TCP 1-stream (uplink) | 154.53 ± 1.90 Mbit/s | 75.26 ± 1.53 Gbit/s | 0.2% |
| TCP 4-stream (uplink) | 21.68 ± 0.64 Mbit/s | 46.28 ± 1.65 Gbit/s | 0.05% |
| TCP 1-stream (reverse/downlink) | 298.10 ± 19.48 Mbit/s | 70.03 ± 1.45 Gbit/s | 0.4% |
| UDP 1G (large packets) | 197.21 ± 3.12 Mbit/s | 998.98 ± 2.37 Mbit/s | 19.7% |
| UDP 64B (small-packet) | 7.55 ± 0.05 Mbit/s | 99.92 ± 0.25 Mbit/s | 7.6% |
PPS 与丢包
| 测试 | 指标 | Starry | Linux Baseline |
|---|---|---|---|
| UDP 1G | PPS | 16,885 ± 267 pkt/s | 86,249 ± 196 pkt/s |
| UDP 1G | 丢包率 | 0.00% | 0.01% |
| UDP 64B | PPS | 29,485 ± 201 pkt/s | 195,166 ± 498 pkt/s |
| UDP 64B | 丢包率 | 50.00% | 0.00% |
协议开销(L2 vs 应用层)
| 方向 | Starry | Linux Baseline |
|---|---|---|
| TX overhead | 6.4% | 0.2% |
| RX overhead | 5.1% | 0.3% |
L2 总吞吐(/proc/net/dev 计数器)
| Starry | Linux Baseline | |
|---|---|---|
| TX | 5.91 GB / 6,071,713 pkts | 1,790.39 GB / 68,461,404 pkts |
| RX | 4.56 GB / 4,304,709 pkts | 1,021.89 GB / 39,803,119 pkts |
关键发现
如果结果准确,那么 QEMU 中 Starry 的网络性能表现与 Linux 相差巨大。
-
Starry TCP 性能严重偏低:TCP 上行仅为 Linux 的 0.2%,差距达 3 个数量级。4 流 TCP 反而劣于单流(21.7 vs 154.5 Mbit/s),与 Linux 的表现趋势一致但恶化得更严重。
-
Starry UDP 64B 丢包率 50%:小包测试中 Starry 丢包率稳定在 50%,说明其在 100Mbps 目标速率下只能送出约一半的包,PPS 能力(~29k)仅为 Linux(~195k)的 15%。
-
UDP 大包相对差距最小(19.7%):大包 UDP 场景下 Starry 能达到 Linux 近 1/5 的吞吐,丢包率为 0%,是五个场景中表现最好的。
-
TCP 下行优于上行:Starry TCP 下行(298 Mbit/s)约为上行(154.5 Mbit/s)的 2 倍,Linux 下两者相近(~75 vs ~70 Gbit/s),说明 Starry 在当前拓扑中发送路径是瓶颈。
-
Starry 协议开销偏高:TX 开销 6.4%(Linux 仅 0.2%),可能反映帧封装或统计口径的差异。
Starry vs Linux 架构
Starry Linux
┌─────────────┐ ┌─────────────┐
smoltcp/socket │ ax_net + │ │ Linux TCP/IP │ ← 完全不同
│ smoltcp │ │ 协议栈 │
├─────────────┤ ├─────────────┤
netdev 抽象 │ rd_net + │ │ netdev + │ ← 完全不同
│ RdNetDriver│ │ NAPI │
├─────────────┤ ├─────────────┤
virtio 驱动 │ VirtIoNet- │ │ virtio_net.ko│ ← 完全不同
│ Device │ │ │
├─────────────┤ ├─────────────┤
virtio 协议库 │ virtio_ │ │ (内核内置) │ ← 不同实现
│ drivers crate│ │ │
╞═════════════╡ ╞═════════════╡
QEMU 虚拟硬件 │ virtio-net-pci + vhost-net + KVM │ ← 相同
└─────────────────────────────────────┘