源码版本: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发送给接收端

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

初始化

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时,则需要走两阶段发送。当接收端收到第一阶段的消息后,会申请内存准备接收数据。这些内存是上层服务在注册时申请的,可以复用于多个连接。第二阶段时,一旦接收端收到全部数据后,就会通过事件回调的方式通知上层。发送端也是如此,一旦全部发送成功后,会通过事件回调的方式通知上层。

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

LNet代码分析的更多相关文章

  1. Android代码分析工具lint学习

    1 lint简介 1.1 概述 lint是随Android SDK自带的一个静态代码分析工具.它用来对Android工程的源文件进行检查,找出在正确性.安全.性能.可使用性.可访问性及国际化等方面可能 ...

  2. pmd静态代码分析

    在正式进入测试之前,进行一定的静态代码分析及code review对代码质量及系统提高是有帮助的,以上为数据证明 Pmd 它是一个基于静态规则集的Java源码分析器,它可以识别出潜在的如下问题:– 可 ...

  3. [Asp.net 5] DependencyInjection项目代码分析-目录

    微软DI文章系列如下所示: [Asp.net 5] DependencyInjection项目代码分析 [Asp.net 5] DependencyInjection项目代码分析2-Autofac [ ...

  4. [Asp.net 5] DependencyInjection项目代码分析4-微软的实现(5)(IEnumerable<>补充)

    Asp.net 5的依赖注入注入系列可以参考链接: [Asp.net 5] DependencyInjection项目代码分析-目录 我们在之前讲微软的实现时,对于OpenIEnumerableSer ...

  5. 完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)

    构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化 ...

  6. STM32启动代码分析 IAR 比较好

    stm32启动代码分析 (2012-06-12 09:43:31) 转载▼     最近开始使用ST的stm32w108芯片(也是一款zigbee芯片).开始看他的启动代码看的晕晕呼呼呼的. 还好在c ...

  7. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  8. SonarQube-5.6.3 代码分析平台搭建使用

    python代码分析 官网主页: http://docs.sonarqube.org/display/PLUG/Python+Plugin Windows下安装使用: 快速使用: 1.下载jdk ht ...

  9. angular代码分析之异常日志设计

    angular代码分析之异常日志设计 错误异常是面向对象开发中的记录提示程序执行问题的一种重要机制,在程序执行发生问题的条件下,异常会在中断程序执行,同时会沿着代码的执行路径一步一步的向上抛出异常,最 ...

随机推荐

  1. 【UVA】11992 - Fast Matrix Operations(段树模板)

    主体段树,要注意,因为有set和add操作,当慵懒的标志下推.递归优先set,后复发add,每次运行set行动add马克清0 WA了好几次是由于计算那一段的时候出问题了,可笑的是我对着模板找了一个多小 ...

  2. word 软换行与硬换行

    word 下的软回车,就是按住 Shift+Enter 之后产生的一种效果,通常在文字后面会有一个向下的箭头: 硬回车就是只敲击回车(enter)产生的一种效果了,通常就会在文字后面产生一个向左弯区的 ...

  3. WPF中StringFormat的用法

    原文:WPF中StringFormat的用法 WPF中StringFormat的用法可以参照C#中string.Format的用法 1. C#中用法: 格式化货币(跟系统的环境有关,中文系统默认格式化 ...

  4. PL/SQL 异常处理程序

     异常处理程序 一个好的程序应该能够妥善处理各种错误情况,并尽可能从错误中恢复.ORACLE 提供异常(EXCEPTION)和异常处理(EXCEPTION HANDLER)错误处理 ①有三种类型的 ...

  5. Jmeter 专题

    Jmeter是一个非常好用的压力测试工具.  Jmeter用来做轻量级的压力测试,非常合适,只需要十几分钟,就能把压力测试需要的脚本写好. 为什么要建立线程组?原因很简单,因为我们要模拟多个线程(用户 ...

  6. js 注册事件

    <!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  7. Windows 10开发基础——网络编程

    主要内容: HttpClient类 Socket通信 WCF通信 HttpClient类      在UWP中可以用来进行网络通信的HttpClient类有两个,System.Net.Http.Htt ...

  8. Kinect 开发驱动配置

    有几种配置方案 1.openNI+SensorKinect+PCL 的开发环境(pcl 标配) http://blog.csdn.net/chenxin_130/article/details/669 ...

  9. UWP开发学习笔记1

    导航到页面: this.Frame.Navigate(typeof(SecondPage)); 导航进入当前页面时会调用OnNavigatedTo方法:导航从当前页面离开时会调用OnNavigatin ...

  10. shell条件测试结构

    条件测试结构 if/then结构用来判断命令列表的退出状态码是否为0(因为在UNIX惯例, 0表示"成功"), 如果成功的话, 那么就执行接下来的一个或多个命令. 有一个专有命令[ ...