目录
1.什么是QoS
2.为什么RoCE网络需要QoS
3.为了实现每个流有不同的优先级,硬件层如何对流量分类
4. 应用层如何对流量分类
5. 应用层对流量的分类是怎么映射到硬件层上的分类
6.映射完成之后硬件是怎么针对优先级对网络流进行调度的
6.1 严格优先级
6.2 最小带宽保证(Enhanced Transmission Selection增强传输选择, ETS)
6.3 速率限制
7.额外补充知识
文档
1.什么是QoS
QoS是一种机制,它给一个网络流赋予一个优先级,并且管理它的最低需求(guarantees),极限能力(limitations)和它相比其他网络流的优先级服务。这是通过一个2/3阶段的过程将用户层的优先级映射到一个硬件层流量类(hardware Traffic Class)上实现的。流量类被赋予QoS属性(缓存分配,流控制,排队,调度,随机早期检测,显式拥塞通知等等),并且不同的流按照这些对应的属性被服务。
2.为什么RoCE网络需要QoS
RDMA最初设计用在运行高性能计算应用的infiniband网络中。Infiniband网络在协议规定上是无损网络,不会产生丢包现象。高性能计算应用通常会针对网络性能优化,因此拥有更友好的网络流量。进而,高性能计算网络对于QoS配置的需求也就更低。在另一方面,数据中心网络面对的是任意变化的流量场景,不同的网络流需要协调服务等级以提高网络效率。这产生更高的QoS要求来解决不同的问题。
3.为了实现每个流有不同的优先级,硬件层如何对流量分类
在IP/Ethernet数据包头部中,有两种方式来对网络包进行分类:
- 使用VLAN头部的PCP域
- 使用IP头部的DSCP域
4. 应用层如何对流量分类
为了满足不同应用需要不同等级的网络流服务,verbs接口和rdma_cm接口都向应用层提供了设置网络流优先级的QoS属性API。
类似于tcp/ip套接字中的setsockopt可以设置QoS参数。
5. 应用层对流量的分类是怎么映射到硬件层上的分类
通常是要经过一个两阶段或者三阶段的过程来完成,但这在不同的库接口(verbs和rdma_cm)以及不同版本的RoCE协议下也是不同的。
首先,针对不同协议来看:
- 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)https://blog.csdn.net/gaopeiliang/article/details/37826741)
- verbs:
实例:基于RoCE v1配置PFC:https://blog.csdn.net/u013431916/article/details/82385641
在端主机侧,映射关系为:
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的函数说明:https://www.rdmamojo.com/2013/01/12/ibv_modify_qp/,页面搜索IBV_QP_AV)
- 在硬件驱动中,IP头部的ToS字段(8bit)会直接被赋值为traffic_class,而DSCP只是ToS字段中的高6位 (值0~63),因此traffic_class到DSCP值的转换是:traffic_class=DSCP值 * 4 (所以traffic_class=8的设置的DSCP值=8/4=2,如果想设置优先级4,则traffic_class应设置为4*4=16 ?)
- 最终根据DSCP值到TC的映射表来将网络流映射到对应的TC上
- verbs:
……
struct ibv_qp_attr attr;
……
attr.ah_attr.grh.traffic_class = 0;
attr_mask |= IBV_QP_AV; //别忘了attr_mask告诉ibv_modify_qp ah_attr域要修改(https://www.rdmamojo.com/2013/01/12/ibv_modify_qp/)
……
rc = ibv_modify_qp (qp, &attr, attr_mask);
- rdma_cm:
- 应用通过rdma_set_optin函数来设置ToS值
- 在硬件驱动中,根据设置的ToS到DSCP值的映射表,将ToS转换成DSCP值
- 最终根据DSCP值到TC的映射表来将网络流映射到对应的TC上
6.映射完成之后硬件是怎么针对优先级对网络流进行调度的
根据应用对网络流设置的优先级,最终将网络流映射到不同的TC上,而这些TC可以人为配置调度策略,网卡根据不同的调度策略来从不同的TC中向链路上发送数据。
一个流量类(TC)可以被赋予不同的服务质量属性,分别有:
- 严格优先级(Strict Priority)
- 最小带宽保证(Enhanced Transmission Selection, ETS)
- 速率限制(Rate Limit)
6.1 严格优先级
具有严格优先级的TC比其他非严格优先级的流具有更高的优先级,在同是严格优先级的TC中,数字越大优先级越高。网卡总是先服务高优先级TC,仅当最高优先级的TC没有数据传输时才会去服务下一个最高优先级TC。使用严格优先级TC可以改善对于低延迟低带宽的网络流,但是不适合传输巨型数据,因为会使得系统中其他的传输者饥饿。
6.2 最小带宽保证(Enhanced Transmission Selection增强传输选择, ETS)
ETS利用提供给一个特定的流量类负载小于它的最小分配的带宽时剩余的时间周期,将这个可用的剩余时间差提供给其它流量类。
服务完严格优先级的TCs之后,链路上剩余的带宽会根据各自最小带宽保证比例分配给其它的TC。
6.3 速率限制
速率限制对一个TC定义了一个最大带宽值,这与ETS不同。
7.额外补充知识
管理sk_prio到UP映射的工具是:tc_wrap.py
管理UP到TC映射的工具是:mlnx_qos
管理不同TC调度算法的工具是:mlnx_qos
在启用不同的分类方式时需要对交换机和网卡设置trust mode值:pcp, dscp
原文:https://www.cnblogs.com/burningTheStar/p/8563347.html
文档
《RDMA技术白皮书-6W100》http://www.h3c.com/cn/Service/Document_Software/Document_Center/Home/Switches/00-Public/Trending/White_Paper/RDMA_Tech_White_Paper-6W100/