源码版本: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. 【Java】【Flume】Flume-NG阅读源代码AvroSink

    org.apache.flume.sink.AvroSink是用来通过网络来数据传输的.能够将event发送到RPCserver(比方AvroSource),使用AvroSink和AvroSource ...

  2. sql server中使用链接服务器访问oracle数据库

    一.  安装配置oracle客户端 要访问orcale数据,必须在访问的客户端机器上安装oracle客户端. Orcale有两种形式的客户端: l         完整的客户端 包括访问服务器端数据库 ...

  3. react项目实践——(3)babel

    1. babel Babel是一个广泛使用的转码器,可以将ES6代码转为ES5代码,从而在现有环境执行. (1)安装 npm install --save-dev babel-core babel-e ...

  4. libuv windows 下编译及使用出现的问题(异步IO)

    1. 下载源码:http://dist.libuv.org/dist/ 我下载的是 v1.8.0 版本,打开可看见四个文件,如下: 说明:.tar.gz 版本的是可以在Linux和Windows下编译 ...

  5. Nginx之Eclipse开发环境配置

    C开发的IDE很多,为什么使用Eclipse?原因: 1. 历史原因:使用eclipse时间长,比较熟悉. 2. 功能原因:使用eclipse查看源码,可以在各个函数与头文件间直接跳转.这是所谓号称& ...

  6. MVC 调试路由

    1.添加引用RouteDebug.dll 2 修改Global.asax,切记调试过后要删掉 using System;using System.Collections.Generic;using S ...

  7. TCP 的那些事儿(上,下)

    http://coolshell.cn/articles/11564.html http://coolshell.cn/articles/11609.html

  8. Visual Studio更改编码格式为“UTF-8”

    原文:Visual Studio更改编码格式为"UTF-8" 用VS2015新建了个Python文件,在VS2015打开时中文显示正常, 用Visual Studio Code文本 ...

  9. 对OO的封装了有了新的理解——希望是普通函数来写总体流程来统管类似的业务,但却又涉及具体操作的函数,仍然可以达到目的

    就是不厌其烦,把那个具体操作函数封装成虚函数,只需要返回它的结果就行.而总体流程根据这个结果继续进行处理,这样就能总体流程和虚函数两不误了.

  10. SQL Server 可更新订阅中有行筛选的同步复制移除项目而不重新初始化所有订阅!

    原文:SQL Server 可更新订阅中有行筛选的同步复制移除项目而不重新初始化所有订阅! 在可更新订阅的同步复制中,有行筛选的项目表,移除的时候会提示重新初始化所有的快照并且应用此快照,这将导致所有 ...