目录
6.2 最小带宽保证(Enhanced Transmission Selection增强传输选择, ETS)
PFC 和global pause flowcontrol 性能比较
作者:bandaoyu 链接:https://blog.csdn.net/bandaoyu/article/details/115633835
1.什么是QoS
QoS是一种机制,它给一个网络流赋予一个优先级,并且管理它的最低需求(guarantees),极限能力(limitations)和它相比其他网络流的优先级服务。这是通过一个2/3阶段的过程将用户层的优先级映射到一个硬件层流量类(hardware Traffic Class)上实现的。流量类(traffic class)被赋予QoS属性(缓存分配,流控制,排队,调度,随机早期检测,显式拥塞通知等等),并且不同的流按照这些对应的属性被服务。
2.为什么RoCE网络需要QoS
RDMA最初设计用在运行高性能计算应用的infiniband网络中。Infiniband网络在协议规定上是无损网络,不会产生丢包现象。高性能计算应用通常会针对网络性能优化,因此拥有更友好的网络流量。进而,高性能计算网络对于QoS配置的需求也就更低。在另一方面,数据中心网络面对的是任意变化的流量场景,不同的网络流需要协调服务等级以提高网络效率。这产生更高的QoS要求来解决不同的问题。
为什么需要无损网络:长期以来,HPC(高性能计算)的RDMA都是在Infiniband集群中使用,数据包丢失在此类群集中很少见,因此RDMA Infiniband传输层(在NIC上实现)的重传机制很简陋,既:go-back-N重传,但是现在RDMA的使用更广泛,在其他网络中,丢包的概率大于Infiniband集群,一旦丢包,使用RDMA的go-back-N重传机制效率非常低,会大大降低RDMA的传输效率,所以要想发挥出RDMA真正的性能,势必要为RDMA搭建一套不丢包的无损网络环境,而Qos是确保网络不丢包的手段之一。
go-back-N重传,见2.1 Infiniband RDMA and RoCE:https://blog.csdn.net/bandaoyu/article/details/115620365
3.为了实现每个流有不同的优先级,硬件层如何对流量分类
在IP/Ethernet数据包头部中,有两种方式来对网络包进行分类:
- 使用VLAN头部的PCP域 (二层)
- 使用IP头部的DSCP域 (三层)
新的 DSField 的结构( 差异化服务代码点 + 显示拥塞通知 ):(注意DSField=DSCP+ECN)
![在这里插入图片描述](https://img-blog.csdnimg.cn/img_convert/fd00979616521cdd2c0d5cd5b35275c6.png)
IPV4服务类型(TOS)被Differentiated Services Field(DSField)替换_努力不停努力的博客-CSDN博客_ipv4服务类型
IP优先级和DSCP优先级的区别
(IP优先级是RFC1349 在Tos字段上定义的优先级划分,后来不够用又将Tos字段重新定义优先级划分,就是DSCP优先级。所以IP优先级和DSCP优先级是在同一个字段(Tos)的两个不同的优先级定义)
4. 应用层如何对流量分类
为了满足 '不同应用需要不同等级的网络流' 服务,verbs接口和rdma_cm接口都向应用层提供了设置网络流优先级属性的API。(也就是提供接口修改报文的Tos字段)
类似于tcp/ip套接字中的setsockopt可以设置QoS参数。
5. 应用层对流量的分类是怎么映射到硬件层上的分类
通常是要经过一个两阶段或者三阶段的过程来完成,但这在不同的库接口(verbs和rdma_cm)以及不同版本的RoCE协议下也是不同的。
(创建链接时,RoCEv1 和RoCEv2的选择,见文章:http://t.csdn.cn/rmz6R)
首先,针对不同协议来看:
RoCEv1:
这个协议是将RDMA数据段封装到以太网数据段内,再加上以太网的头部,因此属于二层数据包,为了对它进行分类的话,只能使用VLAN头部中的PCP域来设置优先级值,因此还需要额外开启VLAN功能。当开启VLAN之后,在不同的库中映射过程如下:
- verbs:
- 应用在创建QP时,对QP属性中的SL(service level)字段进行设置优先级。
- 在硬件驱动中,会自动将SL转换成VLAN头部中的PCP域代表的值UP,转换方式:UP = SL & 7,该值只有8种可选值
- 网络流会根据UP值映射到对应的TC上
- rdma_cm:
- 应用通过rdma_set_option函数来设置ToS值,
该值只有4种有效值:0,8,24,16, - 然后在内核中,将ToS转换成sk_prio,
该值也只有4种有效值:0,2,4,6,映射方式固定 - 最后在硬件驱动中,将sk_prio转换成UP,映射方式可以用户自定义
- 网络流会根据UP值映射到对应的TC上。 (Linux操作系统中的流量控制器TC(Traffic Control)Linux下TC使用说明_gaopeiliang的专栏-CSDN博客_linux tc 命令)
- 应用通过rdma_set_option函数来设置ToS值,
实例:基于RoCE v1配置PFC:基于RoCE v1配置PFC_u013431916的博客-CSDN博客
在端主机侧,映射关系为:
ToS -> skb_priority -> Vlan-qos (也记为User Priority,即UP,其值为Vlan tag中PCP的值) -> tc。
在交换机侧,映射关系为:
PCP + DEI -> switch-priority -> ingress Port Group (PG)。其中PG包含对PFC阈值的配置。
本文使用tc 4以及switch-priority 4为例。
RoCEv2:
这个协议是将RDMA数据段先封装到UDP数据段内,加上UDP头部,再加上IP头部,最后在加上以太网头部,属于三层数据包,为了对它进行分类的话,既可以使用以太网VLAN中的PCP域,也可以使用IP头部的DSCP域。对于PCP域的映射过程和上面一致,下面仅解释DSCP域的映射过程:
- verbs:
- 应用在创建QP后转换状态时,对QP属性中GRH中的traffic_class字段进行设置优先级。(注意对该属性的修改,需要在特定的转换步骤执行,具体查看ibv_modify_qp的函数说明:ibv_modify_qp() - RDMAmojo RDMAmojo,页面搜索IBV_QP_AV)
- 在硬件驱动中,IP头部的ToS字段(8bit)会直接被赋值为traffic_class,而DSCP只是ToS字节中的高6位 (值0~63),因此traffic_class到DSCP值的一种简单转换是:traffic_class=DSCP值 <<2 (所以traffic_class=8的设置的DSCP值=8/4=2,如果想设置优先级4,则traffic_class应设置为4*4=16 )更多的转换是: