源码版本:lustre-release 2.15.55缓存
LNet是Lustre的网络模块,代码目录分为了lnet和lnd服务器
分析代码的主要目的是为了研究其如何实现RDMA大规模组网(5万+客户端)。RDMA大规模组网的瓶颈在于服务器的内存,如BeeGFS须要为每一个链接分配1M的发送缓存(物理内存)和1M的接收缓存,并映射到dma,这样一算支持1万客户端就须要占用超过20G的内存。网络
先写结论
LNet经过两阶段收发数据的方式避免了为每一个链接预申请内存,以发送数据为例函数
虽然两阶段发送增长了通信成本,但使得内存不会成为大规模组网的瓶颈。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或mr可用时,会建立新的pool。每一个pool都有一个deadline,当归还tx时,若是该pool空闲且已经到deadline,则会回收该pool。内存
建立链接在发送数据的流程中触发,其过程与常规rdma建立流程无异,须要注意的是iblnd中建立流程经过rdma的事件回调触发下一阶段,可能有些费解。建立链接时会预先申请18个page,并映射到dma,做为RQE(receive queue entry)。18是根据链接的队列深度和协议版本肯定的。每一个链接固定占用的内存资源不多。资源
由于tx预映射了一个page,因此当发送的数据小于4K时,则能够当即发送。当发送的数据大于4K时,则须要走两阶段发送。当接收端收到第一阶段的消息后,会申请内存准备接收数据。这些内存是上层服务在注册时申请的,能够复用于多个链接。第二阶段时,一旦接收端收到所有数据后,就会经过事件回调的方式通知上层。发送端也是如此,一旦所有发送成功后,会经过事件回调的方式通知上层。
家里居然下不了源码,只能简单写写了。