编程杂记
什么是P_Key
P_Key(Partition Key)用于提供InfiniBand网络的隔离机制,只有在一个分区内的节点可以互相通信。
P_Key是一个16位的值,有两部分
- msb位:membership bit,0表示limitied membership,1表示full membership
- 低15位是定义分区的key
只有具有同样key的QP才可以通信,而且至少一个QP是这个分区的full member。
P_Key在所有通信类型中都存在,不论RC,UD
建链
基于Socket API的建链
- 通过Socket连接交换信息,例如在RC Send中,需要交换GID、QPN信息
- 调用ibv_modify_qp函数改变QP状态,将SQ改为RTS状态,将RQ改为RTR状态。在更改状态时,把GID、QPN信息写入QPC(RC)
基于CM API的建链
介绍RC QP的CM建链流程:
- 首先Client端要发起一个REQ(Request)消息,表示一个连接请求,消息的报文中携带有连接参数,比如本端要连接的QP的QPN、起始PSN、重传次数上限等等。
- Server端在Client端发起连接请求前就一直处于监听状态,当它监听到连接请求后,CM层会对连接参数进行校验和记录。校验通过后,Server端会发送REP(Reply)消息,表示接受之前的连接请求,并且在消息报文中携带自己的连接参数(QPN、起始PSN等)。
- Client端收到REP消息后,将对其中的内容进行校验和记录,然后发送一个RTU(Ready To Use)消息,表示同意你的参数,可以利用双方约定好的QP进行数据交互了。
RoCE的LID和GID
由于LID是InifiniBand协议栈链路层的属性,其在RoCE网络中无效,因此RoCE网卡中,LID为零。
RoCE网卡中有一张GID表,存放这张网卡的GID信息。在下图中,mlx5_1网卡中有四个GID。
应用程序可以根据GID得到MAC地址和IP地址,以在以太网中进行通信。在GID表中,Index 0和1的GID由MAC地址转换而来,Index 2和3的GID由IP地址转换而来。
在两端RoCE网卡通信时,使用的GID索引必须相同,即要么同时是0或1,要么同时是2或3。
SGL
RDMA编程中,SGL(Scatter/Gather List)是最基本的数据组织形式。 SGL 是一个数组,该数组中的元素被称之为 SGE(Scatter/Gather Element),每一个 SGE 就是一个 Data Segment (数据段)。RDMA 支持 Scatter/Gather 操作,具体来讲就是 RDMA 可以支持一个连续的 Buffer 空间,进行 Scatter 分散到目的主机的多个不连续的 Buffer 空间。Gather 指的就是多个不连续的 Buffer 空间可以 Gather 到目的主机的一段连续的 Buffer 空间。
从这张图中可以看到,多个分散存储的SGE被RDMA网卡组成成一个连续的数据段发送出去。在实际编程中,可以把多个SGE看成一个SGE被分散到多个存储位置。