简单测试了一下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处。