infiniband学习总结

一.什么是infiniband

InfiniBand架构是一种支持多并发连接的“转换线缆”技术,它是新一代服务器硬件平台的I/O标准。因为它具备高带宽、低延时、 高可扩展性的特色,它很是适用于服务器与服务器(好比复制,分布式工做等),服务器和存储设备(好比SAN和直接存储附件)以及服务器和网络之间(好比LAN, WANs和the Internet)的通讯 。编程

二.Infiniband产生的缘由

随着CPU性能的飞速发展,I/O系统的性能成为制约服务器性能的瓶颈。因而人们开始从新审视使用了十几年的PCI总线架构。虽然PCI总线结构把数据的传输从8位/16位一举提高到32位,甚至当前的64位,可是它的一些先天劣势限制了其继续发展的势头。PCI总线有以下缺陷:服务器

(1)因为采用了基于总线的共享传输模式,在PCI总线上不可能同时传送两组以上的数据,当一个PCI设备占用总线时,其余设备只能等待;网络

(2)随着总线频率从33MHz提升到66MHz,甚至133MHz(PCI-X),信号线之间的相互干扰变得愈来愈严重,在一块主板上布设多条总线的难度也就愈来愈大;架构

(3)因为PCI设备采用了内存映射I/O地址的方式创建与内存的联系,热添加PCI设备变成了一件很是困难的工做。目前的作法是在内存中为每个PCI设备划出一块50M到100M的区域,这段空间用户是不能使用的,所以若是一块主板上支持的热插拔PCI接口越多,用户损失的内存就越多;并发

(4)PCI的总线上虽然有buffer做为数据的缓冲区,可是它不具有纠错的功能,若是在传输的过程当中发生了数据丢失或损坏的状况,控制器只能触发一个NMI中断通知操做系统在PCI总线上发生了错误分布式

    所以,Intel、 Cisco、 Compaq、 EMC、 富士通等公司共同发起了infiniband架构,其目的是为了取代PCI成为系统互连的新技术标准,其核心就是将I/O系统从服务器主机中分离出来。函数

InfiniBand 采 用双队列程序提取技术,使应用程序直接将数据从适配器 送入到应用内存(称为远程直接存储器存取或RDMA), 反之依然。在TCP/IP协议中,来自网卡的数据先拷贝到 核心内存,而后再拷贝到应用存储空间,或从应用空间 将数据拷贝到核心内存,再经由网卡发送到Internet。这 种I/O操做方式,始终须要通过核心内存的转换,它不 仅增长了数据流传输路径的长度,并且大大下降了I/O 的访问速度,增长了CPU的负担。而SDP则是未来自网 卡的数据直接拷贝到用户的应用空间,从而避免了核心 内存参入。这种方式就称为零拷贝,它能够在进行大量 数据处理时,达到该协议所能达到的最大的吞吐量post

三.Infiniband的协议层次与网络结构

 

图1性能

Infiniband的协议采用分层结构,各个层次之间相互独立,下层为上层提供服务。其中,物理层定义了在线路上如何将比特信号组 成符号,而后再组成帧、 数据符号以及包之间的数据填 充等,详细说明了构建有效包的信令协议等;链路层定义了数据包的格式以及数据包操做的协议,如流控、 路由选择、 编码、解码等;网络层经过在数据包上添加一个40字节的全局的路由报头(Global Route Header,GRH)来进行路由的选择,对数据进行转发。在转发的过程当中,路由 器仅仅进行可变的CRC校验,这样就保证了端到端的数据传输的完整性;传输层再将数据包传送到某个指定 的队列偶(QueuePair,QP)中,并指示QP如何处理该数据 包以及当信息的数据净核部分大于通道的最大传输单 元MTU时,对数据进行分段和重组。ui

  

图2

Infiniband的网络拓扑结构如图2,其组成单元主要分为四类:

(1)HCA(Host Channel Adapter),它是链接内存控制器和TCA的桥梁;

(2)TCA(Target Channel Adapter),它将I/O设备(例如网卡、SCSI控制器)的数字信号打包发送给HCA;

(3)Infiniband link,它是链接HCA和TCA的光纤,InfiniBand架构容许硬件厂家以1条、4条、12条光纤3种方式连结TCA和HCA;

(4)交换机和路由器;

不管是HCA仍是TCA,其实质都是一个主机适配器,它是一个具有必定保护功能的可编程DMA(Direct Memory Access,直接内存存取 )引擎,

 

图3

   

如图3所示,每一个端口具备一个GUID(Globally Unique Identifier),GUID是全局惟一的,相似于以太网MAC地址。运行过程当中,子网管理代理(SMA)会给端口分配一个本地标识(LID),LID仅在子网内部有用。QP是infiniband的一个重要概念,它是指发送队列和接收队列的组合,用户调用API发送接收数据的时候,其实是将数据放入QP当中,而后以轮询的方式将QP中的请求一条条的处理,其模式相似于生产者-消费者模式。

 

图4

如图4所示,图中Work queue便是QP中的send Queue或者receive Queue,WQ中的请求被处理完成以后,就被放到Work Completion中。

四.如何使用IB verbs传送数据

Infiniband提供了VPI verbs API和RDMA_CM verbs API 这两个API集合,用户使用其中的库函数,就能很方便的在不一样的机器之间传输数据。Infiniband创建链接的流程以下图所示:

 

图5

其中buildcontext的流程以下:

 

图6

链接创建完成以后,就能够调用ibv_post_recv和ibv_post_send收发数据了,发送和接收请求都被放在QP中,后台须要调用ibv_poll_cq来逐条处理请求,因为infiniband链接中,一旦有一条数据发送或者接收失败,其后全部的数据发送或者接收都会失败,所以一旦检测到WC的状态不是成功,须要当即处理此错误(此时最好断开链接)。

五.常见错误

     ibv_poll_cq处理完队列中的数据后,WC会包含这次处理的所有信息,包括wr_id、操做状态、错误码等等,错误码包含的信息对于咱们解决错误很是有用,这里我就列举一下我在编写代码中遇到的错误。

(1)错误码为4(IBV_WC_LOC_PROT_ERR ),这种错误一般意味着用户对内存的操做权限不够,须要检测在ibv_post_recv和ibv_post_send时scatter/gather list 中传入的内存地址与长度是否正确,或者ibv_reg_mr操做是否成功。

(2)错误码为5,(IBV_WC_WR_FLUSH_ERR ),在flush的时候出现错误,一般是由于前一个操做出现了错误,接下来的一系列操做都会出现      

IBV_WC_WR_FLUSH_ERR的错误。

(3)错误码为13(IBV_WC_RNR_RETRY_EXC_ERR  ),这种错误通常是由于本地post数据过快。在infiniband传输数据过程当中,接收端首选须要注册内存并ibv_post_recv将此内存放入receive queue中而后发送端才能发送数据,若是接受端来不及完成这些操做发送端就发送数据,就会出现上述错误。

相关文章
相关标签/搜索