转载自NVIDIA DOCA 中国开发者社区
作者:胡凌翔 环境配置:
宿主机linux内核5.4
虚拟机linux内核5.15
MLNX_OFED:5.6-1.0.3.1
前言
这篇文章主要描述了在bf2和cx6的基础上,研究流量控制卸载时所遇到的一些问题,并且目前也没有得到很好的解决。
T C
Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制。不过这些方案有一个共同的缺点,即依赖一把设备全局的 Qdisc spinlock 来进行同步。所以现在考虑在已有的基础上进行硬件的卸载。下图是我引用的一张字节跳动做的总结图,总结了现有的一些流控方案。
图 1 总结[1]
OVS
Bf2支持了硬件卸载ovs(eswitch),并且ovs也是支持使用tc命令的,所以想通过在已经卸载ovs的基础上,在ovs端口进行流控,看能不能直接卸载到硬件中去呢。通过实验,通过tc的这一套走下来,并不会报错但是存在一个问题:如果想要卸载成功,必须处于 ovs 没有o ffload **的情况下。 **因为本质上来说,tc流控终究还是使用内核中的函数的,最终的队列还是在内核中而不是卸载到了硬件上。
在C X6 的情况
目前已经有了在cx6上卸载了htb的成果[3],本质上是利用了cx6硬件中的多队列,通过设置不同的优先等级和限流来实现htb的卸载,并且在已有硬件的基础上,是可以直接通过tc调用【offload】参数直接卸载。
图 2 mlnx_ofed features[2]
图 3 5.15内核中htb的命令参数
不过遗憾的是,这条命令我在bf的宿主机、dpu OS以及cx6服务器上都进行过尝试,都没有生效(物理机内核版本不够高,使用了5.15的虚拟机也不能生效)。可能是使用的方法存在一些问题。
MLNX _OFED
之前的研究基于了硬件多队列开发,其实Mellanox提供的驱动也能实现类似的功能。根据官网资料,驱动对CX6和bf2都是支持的,我先后尝试了CX6和Bf2,查看了一些tc的内容<mlnx_qos -i netdevice >。不过在bf2中得到了一下的结果:
图 4 bf2
Cx6中的结果如下:
图 5 cx6
从图中来看,bf2的信息有所缺失,并且在后来我改变tc队列优先级的实验中,cx6可以正常的通过配置不同tc的优先级和限速,而bf2没法从tc0以外的队列进行流量控制。
其他
以上只停留于硬件配置上的一些调研,doca中库以及dpdk都可以继续调研。不过dpdk是基于arm核的,所以要想得到性能的提升,doca应该是更好的选择。
参考资料
- mp.weixin.qq.com/s/64iz3X40Z…
- docs.nvidia.com/networking/…
- Kuperman Y, Mikityanskiy M, Efraim R. Hierarchical QoS Hardware Offload (HTB)[J].
NVIDIA DOCA现已开放免费注册,立刻扫码加入!