Virtio-PMD的路径选择与用法
根据virtio 三个feature(Rx mergeable,In-order,Packed virtqueue)的组合逻辑,Virtio-PMD共有9条路径。首先介绍virtio常用的三个feature:
Rx mergeable:通过协商此feature,设备可以将独立的descriptor合并,以接收更大的数据包。
In-order:某些设备具有始终按顺序使用descriptor的能力,这些设备可以提供VIRTIO_F_IN_ORDER feature。如果协商了此feature,驱动程序将按顺序使用descriptor:从descriptor table中的offset 0开始顺序使用descriptor。同时,该feature允许设备批量操作used ring以及驱动程序批量操作available ring,由此提高缓存命中率。
Packed virtqueue:Packed virtqueue与Split virtqueue 的结构不同,Split virtqueue由available ring, used ring 和 descriptor table构成,而Packed virtqueue由descriptor ring,driver event suppression 和device event suppression构成。Packed virtqueue结构更紧凑,可提高缓存命中率,同时对硬件实现更友好。
Virtio-PMD 9条路径的选择逻辑:
如果Packed virtqueue没有协商成功,可以根据以下逻辑选择Split virtqueue的5条路径:
1.Split virtqueue mergeable 路径:如果前后端协商了Rx mergeable feature,但未协商In-order feature,将选择此路径。
2.Split virtqueue non-mergeable 路径:如果前后端未协商Rx mergeable和In-order feature,同时前端有Rx offloads请求,将选择此路径。
3.Split virtqueue in-order mergeable 路径:如果前后端协商了In-order以及Rx mergeable feature,将选择此路径。
4.Split virtqueue in-order non-mergeable 路径:如果前后端协商了In-order feature,但未协商Rx mergeable feature,将选择此路径。
5.Split virtqueue vectorized RX 路径:如果前后端未协商Rx mergeable和In-order feature且前端没有Rx offload请求,将选择此收包路径。
如果Packed virtqueue协商成功,可以根据以下逻辑选择Packed virtqueue的4条路径:
1.Packed virtqueue mergeable 路径:如果前后端协商了Rx mergeable feature,但未协商In-order feature,将选择此路径。
2.Packed virtqueue non-mergeable 路径:如果前后端未协商Rx mergeable和In-order feature,将选择此路径。
3.Packed virtqueue in-order mergeable 路径:如果前后端协商了In-order与Rx mergeable feature,将选择此路径。
4.Packed virtqueue in-order non-mergeable 路径:如果前后端未协商Rx mergeable,但协商了In-order feature,将选择此路径。
Virtio-PMD每个路径的收发函数
根据配置参数和前后端feature协商情况, Virtio-PMD会自动选择不同的路径,每个路径对应的收发包函数如下表所示:
Virtio-PMD各路径在dpdk不同版本的支持情况
随着dpdk版本的更新,Virtio-PMD路径的数目也在变化,Virtio-PMD路径在不同dpdk 版本的支持情况如下表所示:
在DPDK 18.08中,添加了新的Rx / TX函数“virtio_recv_pkts_inorder''和“virtio_xmit_pkts_inorder'',用于支持In-order feature。
在DPDK 19.02中,添加了新的Rx / TX函数“virtio_recv_pkts_packed''"virtio_recv_mergeable_pkts_packed"和"virtio_xmit_pkts_packed'',用于支持Packed virtqueue feature。
QEMU 支持状态
Qemu目前只支持Virtio-PMD中的三个路径:Split virtqueue mergebale path,Split virtqueue no-mergeable path,Split virtqueue vectorized RX path。
如何调试
如果在升级驱动程序或更改参数配置后遇到性能下降等问题,以下方法可以帮助您找到当前所使用的Virtio-PMD路径,从而更快地分析原因。
第一步,运行测试用例;
第二步,运行“ perf top”并检查virtio rx / tx函数名称;
第三步,参考上表确定当前所使用的Virtio-PMD路径。
转载须知
推荐阅读