【RDMA】RoCE网络QoS|应用层设置PFC等级|Tos|Priority|TC

目录

1.什么是QoS

2.为什么RoCE网络需要QoS

3.为了实现每个流有不同的优先级,硬件层如何对流量分类

4. 应用层如何对流量分类

5. 应用层对流量的分类是怎么映射到硬件层上的分类

6.映射完成之后硬件是怎么针对优先级对网络流进行调度的 

6.1 严格优先级

6.2 最小带宽保证(Enhanced Transmission Selection增强传输选择, ETS)

6.3 速率限制

Incast和PFC

PFC 和global pause flowcontrol 性能比较

7.额外补充知识

文档


作者: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

【RDMA】RoCE网络QoS|应用层设置PFC等级|Tos|Priority|TC_第1张图片

3.为了实现每个流有不同的优先级,硬件层如何对流量分类

在IP/Ethernet数据包头部中,有两种方式来对网络包进行分类:

  • 使用VLAN头部的PCP域 (二层)
  • 使用IP头部的DSCP域     (三层)

【RDMA】RoCE网络QoS|应用层设置PFC等级|Tos|Priority|TC_第2张图片

【RDMA】RoCE网络QoS|应用层设置PFC等级|Tos|Priority|TC_第3张图片

新的 DSField 的结构( 差异化服务代码点 + 显示拥塞通知 ):(注意DSField=DSCP+ECN

【RDMA】RoCE网络QoS|应用层设置PFC等级|Tos|Priority|TC_第4张图片 IPV4服务类型(TOS)被Differentiated Services Field(DSField)替换_努力不停努力的博客-CSDN博客_ipv4服务类型

IPV4服务类型(TOS)被Differentiated Services Field(DSField)替换_努力不停努力的博客-CSDN博客_ipv4服务类型

IP优先级和DSCP优先级的区别

(IP优先级是RFC1349 在Tos字段上定义的优先级划分,后来不够用又将Tos字段重新定义优先级划分,就是DSCP优先级。所以IP优先级和DSCP优先级是在同一个字段(Tos)的两个不同的优先级定义)

【RDMA】RoCE网络QoS|应用层设置PFC等级|Tos|Priority|TC_第5张图片

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 命令)

 实例:基于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为例。

(流量控制器TC(Traffic Control)是Linux操作系统中用于Linux内核的流量控制,所以主机端的流量先映射到tc)

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 )更多的转换是:

--tos 字节, DSCP占高6bit, 

所以想给DSCP赋值4,二进制为000100,后2bit为任意值,所以DSCP=4的tos= 000100xx,

所以DSCP=4的tos 可以是10000、10001、10010、10011,即16、17、18、19

想给DSCP赋值16,高6bit为二进制为010000,加后2bit,则为 010000xx,即tos可以是1000000、1000001、1000010、1000011,即64、65、66、67

想给DSCP赋值8,dscp是Tos的高6bit,dscp=8对应的Tos是100000、100001、100010、100011,即32,33,34,35.在程序中,创建QP时,设置attr.ah_attr.grh.traffic_class = 32

(测试发现,不论traffic_class设置多少,都只能修改报文Tos域的高6bit,后2bitECN设置有关)

由于映射关系可以修改,所以最准确的映射关系应该用设备商提供的指令查询,如mellonx的

mlnx_qos -i eth0

……
 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);

  • 最终根据DSCP值到TC的映射表来将网络流映射到对应的TC上((流量控制器TC(Traffic Control)是Linux操作系统中用于Linux内核的流量控制,所以主机端的流量先映射到tc)

例如,查询mellonx网卡驱动 DSCP和Priority和TC的映射关系

        DSCP-->Priority-->TC

【RDMA】RoCE网络QoS|应用层设置PFC等级|Tos|Priority|TC_第6张图片

代码实例参考:http://t.csdn.cn/X6rqZ 的《增加 uc和rc的选择,增加Tos的设置》章节

rdma_cm:

  • 应用通过rdma_set_optin函数来设置ToS值
  • 在硬件驱动中,根据设置的ToS到DSCP值的映射表,将ToS转换成DSCP值
  • 最终根据DSCP值到TC的映射表来将网络流映射到对应的TC上

【RDMA】RoCE网络QoS|应用层设置PFC等级|Tos|Priority|TC_第7张图片

(Head First RDMA - https://zhuanlan.zhihu.com/p/462813353)

功能启用

(1) 首先确保网卡的驱动版本要和固件匹配
驱动版本可通过rpm -qa | grep ofed命令查看
固件版本可通过mlxfwmanager或者ibv_devinfo查看
可通过该链接查找驱动建议的固件版本

(2) dscp打标
网卡一般会提供8个traffic-class(对应8个队列),dscp值与其对应的传输队列可通过如下命令查看

【RDMA】RoCE网络QoS|应用层设置PFC等级|Tos|Priority|TC_第8张图片

如图所示,假设RDMA采用第4个传输队列,则对应的packet可将dscp值设置成0x19(十进制25,对应的tos为100)
可以只针对用rdma-cm的rdma程序发出的数据包打标(cma_roce_tos –d -t )
也可以针对所有RoCE流量打标(echo 100 > /sys/class/infiniband//tc/1/traffic_class)

(3) 针对CNP报文进行打标
CNP报文的产生原因如DCQCN章节中所描述,一般会将该报文打标到高优先级队列处理上
echo 32 > /sys/class/net/eth0/ecn/roce_np/cnp_dscp

(4) 启用PFC流控
比如这里针对第四个队列启用
mlnx_qos -i mlx5_0 --trust=dscp -- pfc=0,0,0,1,0,0,0,0

(5) 开启ECN拥堵控制
echo 1 > /sys/class/net/eth0/ecn/roce_np/enable/
echo 1 > /sys/class/net/eth0/ecn/roce_rp/enable/

(6) 测试网卡带宽
server机器上执行
ib_write_bw -d mlx5_0 -R -p 2000 --report_gbits -D 60 -F --tos 100 --report_gbits
client机器上执行
ib_write_bw -d mlx5_0 -R -p 2000 --report_gbits -D 60 -F --tos 100 --report_gbits

七、参考资料

RoCE: RDMA over Converged Ethernet for High-Efficiency Network Performance
Congestion Control for Large-Scale RDMA Deployments
HowTo Set Egress ToS/DSCP on RDMA-CM QPs
RoCE Configuration for Linux Drivers in DSCP-Based QoS Mode
Design Guidelines for High Performance RDMA Systems
RDMA over Commodity Ethernet at Scale

 

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不同。

Incast和PFC

Incast是Many-to-one的通信模式,在高性能数据中心中,这种通信模式常常发生,尤其是那些以Scale-Out方式实现的分布式存储和计算应用,包括Hadoop,MapReduce,HDFS等。

【RDMA】RoCE网络QoS|应用层设置PFC等级|Tos|Priority|TC_第9张图片

图1-3 Incast流量转发示意图

如上图所示,当一个Parent Server向一组节点(服务器集群或存储集群)发起一个请求时,集群中的节点都会同时收到该请求, 并且几乎同时做出响应,很多节点同时向一台机器(Parent Server)发送TCP数据流,从而产生了一个Micro Burst,使得交换机上连接Parent Server的出端口缓存不足,造成拥塞。

所以需要PFC ?PFC如何实现流控

PFC 和global pause flowcontrol 性能比较

《RoCE: Promising Technology forEthernet as a High PerformanceNetworking Fabric》

https://www.osti.gov/servlets/purl/1573446


service level (SL)和Tos的区别

SL,L2层,影响PCP:

QP属性中的SL(service level)字段在硬件驱动中,会自动将SL转换成VLAN头部中的PCP域代表的值UP,转换方式:UP = SL & 7,该值只有8种可选值,网络流会根据UP值映射到对应的TC上。

Tos,L3层,影响DSCP:

在内核中,将ToS转换成sk_prio,在硬件驱动中,将sk_prio转换成UP,映射方式可以用户自定义

网络流会根据UP值映射到对应的TC上。  

7.额外补充知识

管理sk_prio到UP映射的工具是:tc_wrap.py

管理UP到TC映射的工具是:mlnx_qos 

管理不同TC调度算法的工具是:mlnx_qos

在启用不同的分类方式时需要对交换机和网卡设置trust mode值:pcp, dscp 

原文:[RoCE]网络QoS总结 - blackwall - 博客园

文档

《RDMA技术白皮书-6W100》RDMA技术白皮书-6W100-新华三集团-H3C

@UESTC

WINDOWS 配置

HowTo Configure SMB Direct (RoCE) over PFC on Windows 2012 Server

Mellanox Interconnect Community


查看映射关系
mlnx_qos -i eth2   (mellonx)

设置用L3做流控
mlnx_qos -i eth2 --trust=dscp  (mellonx)

修改dscp到priority 映射
dscp 30 映射到修改dscp到priority 6
# mlnx_qos -i eth2 --dscp2prio set,30,6    (mellonx)

使能PFC
# mlnx_qos -i --pfc 0,0,0,1,0,0,0,0   

修改tc和prio的映射(默认除了tc0对应prio1,tc对应prio0,其他的都是对应的,如tc2-prio2,tc3-prio3,tc4-prio4……)
mlnx_qos -i ib3b-0 -p 0,1,2,3,4,5,6,7

端口各优先级的收发计数
#测量该接口发送和接收的 Xon 和 Xoff(传输开启和关闭)帧的数量:
# watch -n 1 "ethtool -S eth1 | grep prio"


(intel
 请注意,Rx 计数器全为 0。当适配器通过交换机连接时,rx_priority_* 计数器可能为 0,表明适配器尚未从交换机收到任何暂停帧。根据网络中的压力水平,如果交换机有足够的缓冲来跟上主机需求,这是可以接受的。但是,对于高压力流量(例如更大规模的 HPC 应用程序),交换机通常会向主机发送暂停帧。通常,预计会同时看到 tx 和 rx_priority 计数器。
请注意,某些 Tx 计数器具有相同的值。在 800 系列 QoS 实施中,如果为traffic class中的任何priority启用 PFC,则该traffic class中的所有priority都会获得暂停帧。这意味着同一 TC 中所有priority的计数器都会一致递增,而不管导致 PFC 触发的特定单个priority如何。如果所有priority都映射到同一个 TC,它们都会一致增加。)

查看GID

show_gids          (mellonx;intel自己也写同样的脚本,脚本内容见末尾)
show_gids mlx5_5   (mellonx)查看设备可用端口, gid_index, rmda版本

查看端口丢弃

show_drop        (mellonx;intel自己也写同样的脚本,脚本内容见末尾)

弃包统计
ethtool -S enp175s0f0 | grep drop

watch -n 1 “ethtool -S enp175s0f0 | grep drop”   #1 s 刷新一次

各个优先级收发包统计

watch -n 1 "ethtool -S ib3b-0 | grep prio"


查看device
ibdev2netdev     (mellonx;intel自己也写同样的脚本,脚本内容见末尾)

ibdev2netdev –v  (mellonx)


验证 InfiniBand 链接是否已启动

hca_self_test.ofed   (mellonx)


Mellanox OFED 安装的信息

/etc/infiniband/info

看自动加载的模块列表
/etc/infiniband/openib.conf


检查Mellanox网卡是否安装和版本
[root@rdma61 ~]#  lspci | grep Mellanox


查看系统里所有的网卡和工作状态:
[root@rdma63 tcpdump]# ip a

[root@rdma63 tcpdump]# ibv_devices
    device                 node GUID
    ------              ----------------
    mlx5_1              98039b03009a4296
    mlx5_0              98039b03009a2b3a

[root@rdma63 tcpdump]# ibv_devinfo 

[root@rdma63 tcpdump]# ibv_devinfo mlx5_0

重新启动RDMA驱动

/etc/init.d/openibd restart

如果驱动不正常,虽然service network restart 可以启动Ethernet端口,但实际rdma驱动并未成功加载。
执行/etc/init.d/openibd restart 可以看到很多的错误。(还有记得把ibacm启动, service ibacm start)

The ibacm service is responsible for resolving names and addresses to InfiniBand path information and caching such data. 
It should execute with administrative privileges. 
The ibacm implements a client interface over TCP sockets, which is abstracted by the librdmacm library.


mellonx信息搜集

/usr/sbin/sysinfo-snapshot.py

//****************************************************交换机****************************************

S6820《H3C S6820 系列以太网交换机 二层技术-以太网交换配置指导》P11:PFC 优先级高于FC,设置了PFC 则忽略FC

2.配置H3C交换机

a)    配置优先级信任模式为DSCP:

例如:
[H3C]sys
[H3C]interface HundredGigE1/0/6
[H3C-HundredGigE1/0/6] 6

*配置信任模式为DSCP,交换机才会使用 报文自带的DSCP做映射。
设置信任模式为DSCP,则进入交换机的报文优先级映射会涉及到3个表:
进-->出 映射,
dscp-dot1p    #入端口报文为dscp会被交换机映射到lp队列
dscp-dp       #入端口报文为dscp会被交换机映射到dp队列
dscp-dscp     #入端口报文的dscp会被交换机改为dscp转发
(优先级可分为两类:报文携带优先级和设备调度优先级。
设备调度优先级是指报文在设备内转发时所使用的优先级,只对当前设备自身有效。
设备调度优先 级包括以下几种: 
• 本地优先级(LP):设备为报文分配的一种具有本地意义的优先级,每个本地优先级对应一 个队列,本地优先级值越大的报文,进入的队列优先级越高,从而能够获得优先的调度。
• 丢弃优先级(DP):在进行报文丢弃时参考的参数,丢弃优先级值越大的报文越被优先丢弃。)

display qos map-table dscp-dot1p

b)    配置PFC功能的开启模式
例如:
[H3C]sys
[H3C]interface HundredGigE1/0/6
[H3C-HundredGigE1/0/6] priority-flow-control enable


6.显示接口的PFC信息
display priority-flow-control interface 显示全部
display priority-flow-control interface [ interface-type [ interface-number ] ] 显示某个

关闭PFC:undo priority-flow-control


7,使能PFC后还需指定PFC作用的不弃包的等级priority-flow-control no-drop dot1p dot1p-list
如:
priority-flow-control no-drop dot1p 0
priority-flow-control no-drop dot1p 0,1,3

(dot1p和dscp的映射见display qos map-table  dscp-dot1p )
http://www.h3c.com/cn/d_201906/1206016_30005_0.htm

显示端口是否开启FC:----不是PFC,设置了PFC就忽略FC
display interface [接口]
如: display interface  HundredGigE1/0/2
缩写:dis int HundredGigE1/0/4

(1、端口入方向报文计数错误字段解释 
input errors:各种输入错误的总数。 
runts:表示接收到的超小帧个数。超小帧即接收到的报文小于 64 字节,且包括有效的 CRC 字段,报文格式正确。 
giants:是超过端口设置的 Maximum Frame Length 的报文个数。 CRC:表示接收到的 CRC 校验错误报文个数。 
frame:端口接收时出错的报文。 

2、端口出方向报文计数错误字段解释
 output errors:各种输出错误的总数。 
 aborts:表示发送失败的报文总数。 
 deferred:表示延迟报文的总数。报文延迟是指因延迟过长的周期而导致发送失败的报文,而这些报文由于发送媒质繁忙而等待了超过 2 倍的最大报文发送时间。 
 collisions:表示冲突帧总数,即在发送过程中发生冲突的报文。 l
 ate collisions:表示延迟冲突帧,即发送过程中发生延迟冲突超过 512bit 时间的帧。
 )


H3C 二层命令参考:http://www.h3c.com/cn/d_202104/1397802_30005_0.htm


****************************
显示和维护(H3C交换机)
****************************
1.显示指定优先级映射表配置情况 
display qos map-table  dot1p-dp | dot1p-exp | dot1p-lp | dscp-dot1p | dscp-dp | dscp-dscp | exp-dot1p | exp-dp ] 
如:display qos map-table dscp-dscp

2.    显示接口优先级信任模式信息(sys视图)
 display qos trust interface [ interface-type interface-number ]
如:
display qos trust interface HundredGigE1/0/1

3.    显示端口简单信息
display interface brief
4.    显示端口在该间隔时间内统计的报文信息
display interface
5.    显示Qos trust设置
display qos trust int
6.    显示接口的PFC信息
display priority-flow-control interface 显示全部
display priority-flow-control interface [ interface-type [ interface-number ] ] 显示某个

显示收发和暂停统计

-显示全部端口
-display interface
-显示某个端口
-display interface HundredGigE1/0/2

查看拥塞drop包(弃包/丢包)
display packet-drop 
display packet-drop interface HundredGigE1/0/4
《接口管理命令参考》http://www.h3c.com/cn/d_201906/1206016_30005_0.htm
//===============================================================================测试================================================================


Tos=============
--tos=  Set to RDMA-CM QPs. available only with -R flag. values 0-256 (default off)

ibdump -d mlx5_0 -i 1  -w        sniffer.acp     #抓包
ib_send_bw -d mlx5_0     --rdma_cm               #服务端
ib_send_bw 192.169.31.54 --rdma_cm  --tos=12 –R  #客户端1100


==========================
Intel show_gids
==========================
#!/bin/bash
function show_gid()
{
        for device in ` ls /sys/class/infiniband/` #注意此处这是两个反引号,表示运行系统命令
        {
          echo "****************"
          echo "Device:"${device}
          for port in ` ls /sys/class/infiniband/${device}/ports/`
            {
                  echo "IB port:"${port}
                   for gid in `ls /sys/class/infiniband/${device}/ports/${port}/gids`
                   {

               GID=`cat /sys/class/infiniband/${device}/ports/${port}/gids/${gid}` #在此处处理文件即可 
               
               if [[ $GID == *0000:0000:0000:0000:0000:0000:0000:0000* ]]
               then
               : #do nothing
               #echo "包含"
               else
               #echo "不包含"
                    echo "GID"${gid}":"$GID
               fi
        
              }
           }
        }
}


show_gid
==========================
Intel show_drop 
==========================
#!/bin/bash
function show_drop()
{
        for device in `ls /sys/class/infiniband/`
        {
          echo ""
          echo -e  "\e[1;32m${device}\e[0m" 
          cd  /sys/class/infiniband/${device}/hw_counters
         
          for f in *Discards
          {
             echo -n "$f: "
             cat "$f"
          }
        }
}
 
show_drop

*intel官方提供的脚本:
# cd /sys/class/infiniband/irdma-enp175s0f0/hw_counters  
# for f in *Discards; do echo -n "$f: "; cat "$f"; done  


==========================
Inetl ibdev2netdev
==========================
#!/bin/bash
echo "--------------------------------------"
echo "script locate:/usr/bin/ibvdev2netdev"
echo "Author:liangchaoxi"
echo "***************************************"
ibv_devices|awk '{system("echo "$1"\"-->\"`ls /sys/class/infiniband/"$1"/device/net`")}' |& grep -Ev '/device/net|device|-------->'
echo "***************************************"
ip route
echo "--------------------------------------"

Mellonx

显示GID
show_gids

显示OFED显示
ofed_info

显示网卡、驱动版本等信息
hca_self_test.ofed

[root@rdma61 ~]# hca_self_test.ofed
---- Performing Adapter Device Self Test ----
Number of CAs Detected ................. 2
PCI Device Check ....................... PASS
Kernel Arch ............................ x86_64
Host Driver Version .................... OFED-internal-4.5-1.0.1: 4.14.0-49.12.x86_64
Host Driver RPM Check .................. PASS
Firmware on CA #0 NIC .................. v16.24.1000
Firmware on CA #1 NIC .................. v16.23.1020
Host Driver Initialization ............. PASS
Number of CA Ports Active .............. 2
Port State of Port #1 on CA #0 (NIC)..... UP 4X QDR (Ethernet)
Port State of Port #1 on CA #1 (NIC)..... UP 4X QDR (Ethernet)
Error Counter Check on CA #0 (NIC)...... PASS
Error Counter Check on CA #1 (NIC)...... PASS
Kernel Syslog Check .................... FAIL
    REASON: Kernel syslog reported: Driver messages 
      [681196.776180] java invoked oom-killer: gfp_mask=0x14201ca(GFP_HIGHUSER_MOVABLE|__GFP_COLD), nodemask=(null),  order=0, oom_score_adj=0
      [681443.262537] devmgrdaemon invoked oom-killer: gfp_mask=0x14000c0(GFP_KERNEL), nodemask=(null),  order=0, oom_score_adj=0
      [684264.725346] objecter_timer invoked oom-killer: gfp_mask=0x14201ca(GFP_HIGHUSER_MOVABLE|__GFP_COLD), nodemask=(null),  order=0, oom_score_adj=0
      [782281.333718] themis invoked oom-killer: gfp_mask=0x14201ca(GFP_HIGHUSER_MOVABLE|__GFP_COLD), nodemask=(null),  order=0, oom_score_adj=0
      [782285.206503] devmgrdaemon invoked oom-killer: gfp_mask=0x14201ca(GFP_HIGHUSER_MOVABLE|__GFP_COLD), nodemask=(null),  order=0, oom_score_adj=0
Node GUID on CA #0 (NIC) ............... 98:03:9b:03:00:9a:31:ba
Node GUID on CA #1 (NIC) ............... 98:03:9b:03:00:9a:4c:1a
------------------ DONE ---------------------


检查Mellanox网卡是否安装和版本
[root@rdma61 ~]#  lspci | grep Mellanox
0000:18:00.0 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5]
0000:3b:00.0 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5]

命令查看网口映射关系。

#ibdev2netdev 

[root@rdma64 ibdump-master]# ibdev2netdev
mlx5_0 port 1 ==> eth18-0 (Up)
mlx5_1 port 1 ==> ib3b-0 (Up)

ibv_devices  列出device

[root@rdma63 tcpdump]# ibv_devices
    device                 node GUID
    ------              ----------------
    mlx5_1              98039b03009a4296
    mlx5_0              98039b03009a2b3a


打印出device信息
[root@rdma63 tcpdump]# ibv_devinfo 

[root@rdma63 tcpdump]# ibv_devinfo mlx5_0
hca_id: mlx5_0
        transport:                      InfiniBand (0)
        fw_ver:                         16.29.1016
        node_guid:                      9803:9b03:009a:2b3a
        sys_image_guid:                 9803:9b03:009a:2b3a
        vendor_id:                      0x02c9
        vendor_part_id:                 4119
        hw_ver:                         0x0
        board_id:                       MT_0000000010
        phys_port_cnt:                  1
        Device ports:
                port:   1
                        state:                  PORT_ACTIVE (4)
                        max_mtu:                4096 (5)
                        active_mtu:             1024 (3)
                        sm_lid:                 0
                        port_lid:               0
                        port_lmc:               0x00
                        link_layer:             Ethernet


ibstatus更换网卡工作模式


有些网卡,当你安装好驱动后,通过 ibstatus 命令,会出现下面的情况:

可以看到,该网卡现在处于 Ethernet 的工作模式,如果想要切换成infiniband模式,参考如下链接:

https://community.mellanox.com/s/article/howto-change-port-type-in-mellanox-connectx-3-adapter

查看当前工作模式:

sudo /sbin/connectx_port_config -s

输入以下命令切换工作模式:

sudo /sbin/connectx_port_config

如果提示如图,说明不支持infiniband模式,否则,就切换成功了,再次使用一下命令可以验证:


原文链接:https://blog.csdn.net/bandaoyu/article/details/115906185


1、常规 IB 监视命令

ibv_asyncwatch 监视 InfiniBand 异步事件
ibv_devices or ibv_devinfo 列举 InfiniBand 设备或设备信息
ibv_rc_pingpong、ibv_srq_pingpong 或 ibv_ud_pingpong 使用 RC 连接、SRQ 或 UD 连接测试节点之间的连通性
mckey 测试 RDMA CM 多播设置和简单数据传输
rping 测试 RDMA CM 连接并尝试 RDMA ping
ucmatose 测试 RDMA CM 连接并尝试简单 ping
udaddy 测试 RDMA CM 数据报设置并尝试简单 ping
 

2、常规 IB 性能测试命令

rdma_client 或rdma_server 或rdma_xclient或 rdma_xserver 测试 RDMA 写处理确定流带宽或等待时间
ib_read_bw 或 ib_read_lat 测试 RDMA 读处理确定带宽或等待时间
ib_send_bw 或 ib_send_lat 测试 RDMA 发送处理确定带宽或等待时间
ib_write_bw 或 ib_write_bw_postlist 测试 RDMA 写处理,确定一次显示一个 I/O 请求的带宽或显示一系列 I/O 请求的发布列表带宽
ib_write_lat 测试 RDMA 写处理确定等待时间
ib_clock_test 测试系统时钟准确性
qperf 测量插槽与 RDMA 性能
RDS 监视与测试工具
rds-info 显示 RDS 内核模块信息
rds-ping 确定基于 RDS 的远程节点是否可访问
rds-stress 在基于 RDS 插槽的进程间发送消息
 

3、光纤网络诊断工具

iblinkinfo.pl 或 iblinkinfo 显示光纤网络中所有链路的链路信息
sminfo 查询 IB SMInfo 属性
ibstat 或 ibsysstat 查询 InfiniBand 设备状态或 IB 地址上的系统状态
perfquery or saquery 查询 IB 端口计数器或 sIB 子网管理属性
ibdiagnet 执行整个光纤网络诊断检查
ibcheckerrors 或 ibcheckerrs 验证 IB 端口(或节点)或 IB 子网并报告错误
ibaddr 查询 InfiniBand 的一个地址或多个地址
ibnetdiscover 搜索远程 InfiniBand 拓扑
ibping 验证 IB 节点之间的连通性
ibportstate 查询 IB 端口的物理端口状态和链接速度
ibroute 显示 InfiniBand 交换机转发表
ibtracert 跟踪 IB 路径
smpquery 或 smpdump 查询或转储 IB 子网管理属性
ibchecknet, ibchecknode, 或 ibcheckport 验证 IB 子网、节点或端口并报告错误
ibcheckportstate, ibcheckportwidth, ibcheckstate, or ibcheckwidth 验证已链接但不活动的 IB 端口、面向 1x (2.0 Gbps) 链路带宽的端口、IB 子网中已链接但不活动的端口或 IB 子网中的 lx 链路
ibclearcounters or ibclearerrors 对 IB 子网中的端口计数器或错误计数器进行清零
ibdatacounters or ibdatacounts 查询 IB 子网中的数据计数器或 IB 端口数据计数器
ibdiscover.pl 注释并比较 IB 拓扑
ibcheckerrors 或 ibcheckerrs 验证 IB 端口(或节点)或 IB 子网并报告错误
ibchecknet, ibchecknode, 或 ibcheckport 验证 IB 子网、节点或端口并报告错误
ibhosts 显示拓扑中的 IB 主机节点
ibnodes 显示拓扑中的 IB 节点
ibprintca.pl 显示来自 ibnetdiscover 输出的特定 CA 或 CA 列表
ibprintrt.pl 显示来自 ibnetdiscover 输出的特定路由器或路由器列表
ibprintswitch.pl 显示来自 ibnetdiscover 输出的特定交换机或交换机列表
ibrouters 显示拓扑中的 IB 路由器节点
ibstatus 查询 IB 设备的基本状态
ibswitches 显示拓扑中的 IB 交换机节点
ibswportwatch.pl
ibqueryerrors.pl 轮询特定交换机或端口上的计数器并报告更改信息速率
 

4、查询并报告非零 IB 端口计数器

ibprintswitch.pl 显示来自 ibnetdiscover 输出的特定交换机或交换机列表
set_nodedesc.sh 设置或显示针对 IB 主机控制器适配器 (HCA) 的节点描述字符串
dump2psl.pl 转储基于 opensm 输出文件的 PSL 文件,该输出文件用于信用循环检查
dump2slvl.pl 转储基于 opensm 输出文件的 SLVL 文件,该输出文件用于信用循环检查
ibis 针对 IB 管理带内服务的扩展 TCL shell


5、其常用指令
https://docs.oracle.com/cd/E19632-01/835-0783-03/bbggiggb.html#scrolltoc

更多命令:

https://docs.oracle.com/cd/E56344_01/html/E54075/makehtml-id-7.html
 

你可能感兴趣的:(RDMA,网络,服务器,运维)