LNet代码分析

源码版本:lustre-release 2.15.55缓存

介绍

LNet是Lustre的网络模块,代码目录分为了lnet和lnd服务器

  • lnet提供了统一的接口
  • lnd封装了底层驱动,有socklnd(TCP/IP),iblnd(RDMA)

分析代码的主要目的是为了研究其如何实现RDMA大规模组网(5万+客户端)。RDMA大规模组网的瓶颈在于服务器的内存,如BeeGFS须要为每一个链接分配1M的发送缓存(物理内存)和1M的接收缓存,并映射到dma,这样一算支持1万客户端就须要占用超过20G的内存。网络

先写结论
LNet经过两阶段收发数据的方式避免了为每一个链接预申请内存,以发送数据为例函数

  • 第一阶段:发送端将待发送的数据映射到dma,并经过预映射的内存经过RDMA告知接收端待发送的数据信息(长度、类型等),接收端申请内存并映射到dma,并告知发送端映射后的信息(address、key)
  • 第二阶段:发送端将数据经过RDMA发送给接收端

虽然两阶段发送增长了通信成本,但使得内存不会成为大规模组网的瓶颈。code

初始化

iblnd初始化函数kiblnd_startup(),主要的是建立pool set。pool set分为fmr pool set和tx pool set。至少会建立cpt个pool set,每一个pool set初始包含一个pool,一个pool最多包含256个fmr/tx,每一个mr可映射256个page,每一个tx可保存256个page地址,每一个tx会预映射一个page到dma,为rdma通信所用。接口

cpt含义是cpu partition,值与cpu核数以及numa的节点个数有关。队列

传输数据时,须要事件

  • 从tx pool set获取一个tx,填写消息信息(长度、类型等),以预映射的page与接收端通信
  • 从fmr pool set从获取一个mr,将待发送数据的内存映射到这块mr中

当没有tx或mr可用时,会建立新的pool。每一个pool都有一个deadline,当归还tx时,若是该pool空闲且已经到deadline,则会回收该pool。内存

建立链接

建立链接在发送数据的流程中触发,其过程与常规rdma建立流程无异,须要注意的是iblnd中建立流程经过rdma的事件回调触发下一阶段,可能有些费解。建立链接时会预先申请18个page,并映射到dma,做为RQE(receive queue entry)。18是根据链接的队列深度和协议版本肯定的。每一个链接固定占用的内存资源不多。资源

收发数据

由于tx预映射了一个page,因此当发送的数据小于4K时,则能够当即发送。当发送的数据大于4K时,则须要走两阶段发送。当接收端收到第一阶段的消息后,会申请内存准备接收数据。这些内存是上层服务在注册时申请的,能够复用于多个链接。第二阶段时,一旦接收端收到所有数据后,就会经过事件回调的方式通知上层。发送端也是如此,一旦所有发送成功后,会经过事件回调的方式通知上层。

家里居然下不了源码,只能简单写写了。

相关文章
相关标签/搜索