简单测试了一下virtio-user的性能。

测试拓扑

-------                                              |
| tap |            host0                                |  host1
-------                                              |
   |        ---------------      ------------        |       -------
   --------| testpmd(dpdk) |----| eth0(dpdk) |-------|-------| eth0 |
            ---------------      ------------        |       -------

通过iperf在host0的tap口和host1的eth0口进行收发报文。

环境搭建

我们只在host0上搭建virtio-user环境,host1依然采用原生的物理口

DPDK版本为17.05.2,执行命令如下:

testpmd -c 0x40004 -n 4 -d /lib64/librte_pmd_virtio.so --vdev=virtio_user0,path=/dev/vhost-net,queue_size=1024 -- -a --disable-hw-vlan --forward-mode=csum

这是会启动一个tap0口,给tap0口配置IP。

大包对比测试

原生物理口测试

为了找一个基准数据,我们在这两台服务器搭建virtio-user环境之前先用iperf进行流量测试,结果如下:

  • TCP性能为 9.42 Gbps
  • UDP性能为发 9.57 Gbps, 收 7.59 Gbps,有 20% 的丢包

virtio-user作为发送方

性能如下:

  • TCP性能为 9.42 Gbps
  • UDP性能为发 8.86 Gbps, 收 6.66 Gbps, 有 20% 的丢包

virtio-user作为接收方

性能如下:

  • TCP性能为 9.42 Gbps
  • UDP性能为发 6.33 Gbps,收 6.33 Gbps,有 0% 的丢包

小包对比测试

使用pktgen进行64Bytes的UDP报文发送,另一端通过sar -n DEV查看端口的kernel收包量,另外使用pktgen-dpdk查看一次端口的收包量,因为收包时过内核网络协议栈会严重降低收包量的

这里我们不再使用一个tap口,而是通过virtio-user创建出多个tap口进行性能测试,并且只测试从tap口发送流量到另一端的物理端口。

原生物理口测试

发包性能为 578w pps, 内核收包 78w pps,dpdk收包 578w pps

virtio-user生成2个tap口

发包性能为 233w pps,内核收包 147w pps, dpdk收包 233w pps,这里感觉应该是两个tap口,两个IP给目的IP发送流量,两条流处理所以是上面单个物理口的两倍包量

virtio-user生成4个tap口

发包性能为 571w pps,内核收包 222w pps, dpdk收包 571w pps

virtio-user生成8个tap口

发包性能为 678w pps,内核收包 356w pps, dpdk收包 678w pps

因为测试使用的是DPDK的例子testpmd,显示丢包都在tap口发送给testpmd的时候,testpmd转发并没有丢包,所以初步怀疑瓶颈是在tap处。

最后修改:2021 年 08 月 18 日
如果觉得我的文章对你有用,请随意赞赏