应用介绍
这篇文章描述了CPU和NIC之间通过PCI Express结构在幕后发生的一系列协调事件,这些事件通过InfiniBand互连传输消息并发出完成信号。
通过InfiniBand发送消息的主要方法是通过Verbs API。libibverbs是这个API的标准实现,由linux RDMA社区维护。Verbs有两种功能:慢路径功能和快路径功能。慢路径功能(如ibv_open_device、ibv_alloc_pd等)是与资源(如上下文、保护域和内存区域)的创建和配置相关的功能。它们之所以被称为“慢”,是因为它们涉及内核,因此会产生上下文切换的昂贵开销。快速路径功能(如ibv_post_send、ibv_poll_cq等)处理操作的启动和完成。它们被称为“快”,因为它们绕过内核,因此比慢路径函数快得多。通信的关键路径主要由快速路径功能和偶尔的慢路径功能组成,如ibv_reg_mr,以动态注册内存区域(取决于通信中间件)。本文主要讨论程序员执行ibv_post_send后发生的机制。
1
快速PCIe背景
网络接口卡(NIC)通常通过PCI Express(PCIe)插槽连接到服务器。PCIe I/O子系统的主导体是根复合体(Roo Complex, RC)。RC将处理器和内存连接到PCIe结构。PCIe结构可以由设备的层次结构组成。连接到PCIe结构的外围设备称为PCIe端点。PCIe协议由三层组成:事务层、数据链路层和物理层。第一层,最上层,描述发生的事务的类型。对于本文,两种类型的传输层数据包(TLP)是相关的:Memory Write(MWr)和Memory Read(MRd)。与独立的MWr TLP不同,MRd TLP与来自目标PCIe端点的“带数据完成”( Completion with Data, CplD)事务耦合在一起,该事务包含启动器请求的数据。数据链路层使用数据链路层分组(DLLP)确认(ACK/NACK)和基于Credits的流控制机制来确保所有事务的成功执行。发起方可以发出一个事务,只要它有足够的Credits额度。当它从它的邻居那里接收到更新流控制(UpdateFC)DLLPs时,它的Credits就会被补充。这种流控制机制允许PCIe协议具有多个未完成事务。
2
涉及的基本机制
首先,我将描述如何使用完全卸载的方法发送消息,也就是说,CPU只通知NIC有要传输的消息;NIC将做其他一切来传输数据。在这种方法中,CPU更适合于计算活动。然而,这种方法可能对小消息的通信性能有害(这将很快变得明显)。为了提高这种情况下的通信性能,InfiniBand提供了一些操作特性,将在下一节中介绍这些特性。
从CPU程序员的角度来看,存在一个传输队列(Verbs中的发送队列是队列对(Queue Pair,QP))和完成队列(Verbs中是CQ的long)。用户将他们的消息描述符(MD;Work Queue Element/Entry(WQE;wookie)以Verbs形式发布到传输队列,然后在CQ上轮询以确认所发布消息的完成。用户也可以请求得到关于完成的中断的通知。然而,轮询方法是面向延迟的,因为关键路径中没有上下文切换到内核。消息在网络上的实际传输通过处理器芯片和网卡之间的协调来实现,使用内存映射I/O(MMIO)和直接内存访问(DMA)读写。下图中描述这些步骤。
步骤0:用户首先将MD排队到TxQ中。然后,网络驱动程序准备设备特定的MD,该MD包含NIC的报头和指向有效负载的指针。
步骤1:使用8字节的原子写入内存映射位置,CPU(网络驱动程序)通知NIC消息已准备好发送。这叫做按门铃。RC使用MWr PCIe事务执行门铃。
步骤2:门铃响后,网卡通过DMA读取MD。MRd PCIe事务执行DMA读取。
步骤3:NIC将使用另一个DMA读取(另一个MRd TLP)从注册的内存区域获取有效负载。请注意,在NIC可以执行DMA读取之前,必须将虚拟地址转换为物理地址。
步骤4:一旦网卡接收到有效载荷,它就会通过网络传输读取的数据。成功传输后,NIC从目标NIC接收确认(ACK)。
步骤5:接收到ACK后,NIC将DMA写入(使用MWr TLP)一个完成队列条目(CQE;动词中称为cookie;Mellanox InfiniBand中为64字节)到与TxQ关联的CQ。然后CPU将轮询此完成情况以取得进展。
总之,每个post的关键数据路径需要一个MMIO写入、两个DMA读取和一个DMA写入。DMA读取转换为昂贵的往返PCIe延迟。例如,ThunderX2机器的往返PCIe延迟约为125纳秒。
3
操作特性
内联/inlining、Postlist、unsigned completion和Programmed I/O是IB的操作特性,有助于减少这种开销。考虑到QP的深度为n,将在下面描述它们。
Postlist:IB允许应用程序通过一个调用ibv_post_send来发布WQE的链接列表,而不是每次只发布一个WQE。它可以将门铃响的次数从n减少到1。
内联:这里,CPU(网络驱动程序)将数据复制到WQE中。因此,通过对WQE的第一次DMA读取,NIC也获得了有效载荷,从而消除了针对有效载荷的第二次DMA读取。
unsigned Completions:IB允许应用程序关闭WQE的完成,而不是为每个WQE发送一个完成信号,前提是每n个WQE中至少有一个被发出信号。关闭Completion可以减少NIC对CQE的DMA写入。此外,应用程序轮询更少的CQE,从而减少了取得进展的开销。
BlueFlame:BlueFlame是Mellanox用于编程I/O的术语,它编写WQE和Doorbell,切断WQE本身的DMA读取。请注意,BlueFlame只在没有Postlist的情况下使用。使用Postlist,网卡将DMA读取链接列表中的WQEs。
为了减少PCIe往返延迟的开销,开发人员通常将内联和BlueFlame一起用于小消息。它消除了两个PCIe往返延迟。虽然内联和BlueFlame的使用取决于消息大小,但是Postlist和unsigned completion的使用主要依赖于用户的设计选择和应用程序语义
©版权声明:本文内容由互联网用户自发贡献,版权归原创作者所有,本站不拥有所有权,也不承担相关法律责任。如果您发现本站中有涉嫌抄袭的内容,欢迎发送邮件至: [email protected] 进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
转载请注明出处: apollocode » InfiniBand如何工作?
文件列表(部分)
名称 | 大小 | 修改日期 |
---|
发表评论 取消回复