LNET是Lustre Networking的缩写,是Lustre的网络子系统,负责提供消息传递API。LNET源自于Sandia Portals,但又与之存在着差异。
3.1 结构
LNET由两部分组成:
- LNET层。它以通信API的方式,向被称为LNET客户端的高层提供一个与网络类型无关的服务。在LNET层,以LNet作为前缀的函数名是为高层提供的外部API,而以lnet作为前缀的函数则是内部函数,只能被LNET层或下层的LND层调用。
- LND(Lustre Network Driver)层。它实现从一般化的LNET层到特定网络驱动之间的接口。那些LNET层可以调用的函数都以lnet作为前缀。
这里需要的注意的是,LNET既被用来表示整个网络子系统,又被用来指代LND之上的一个软件层。我们不应该混淆它们的含义。
LNET可以以内核模块的方式运行,也可以用户库的方式运行。因而,其中的LND层可以是内核模块,也可以是用户层程序。
图 LND支持的网络类型
| 名字 |
描述 |
|
| socklnd |
TCP/IP sockets |
|
| {cib,open}iblnd |
Topspin IB |
|
| iiblnd |
Silverstorm IB |
|
| viblnd |
Voltaire IB |
|
| o2iblnd |
OFA IB |
|
| ptllnd |
Cray Portals |
|
| ralnd |
Cray RapidArray |
|
| qswlnd |
Quadrics Elan |
|
| gmlnd |
Myricom GM (no RDMA) |
|
| mxlnd |
Myricom MX |
|
另外,LND还支持TCP/IP sockets、OFA IB、Cray Portals等几种用户层网络。在下面的内容中,如果没有特殊说明,都指的是内核层实现。
LNET的结构图如下图所示:

图 LNET的结构
3.2 网络驱动层
Lustre支持一系列的网络类型。对每种网络类型的支持,都是以内核模块的形式提供的。在这些内核模块的初始化函数中,都会调用lnet_register_lnd,注册一个类型为lnd_t的全局变量。这个类型为lnd_t的对象,就描述了这个驱动的全部信息。
表 lnd_t对象提供的方法
| 字段 |
描述 |
|
| lnd_startup |
LNET打开这类网络接口时调用 |
|
| lnd_shutdown |
LNET关闭这类网络接口时调用 |
|
| lnd_ctl |
处理来自用户空间的ioctl命令。LNET通过一个特殊的设备文件,支持许多ioctl,其中一些ioctl命令由LNET直接处理(例如,增加路由),另外一些必须传递到LND处理 |
|
| lnd_send |
发送正在送出的消息 |
|
| lnd_recv |
接收正在来到的消息 |
|
| lnd_eager_recv |
消息的处理由于缺乏资源(转发缓冲或额度)而被推迟,调用此函数以期释放一些资源。 |
|

LNET是Lustre网络子系统,提供消息传递API,由LNET层和LND层构成。LND实现从通用LNET层到特定网络驱动的接口,支持TCP/IP sockets、OFA IB等多种网络。LNET结构中,LNet对象维护系统状态,通过LNetMEAttach和LNetMDAttach创建和关联匹配项和内存描述符。LNET启动时,通过LNetNIInit初始化网络接口。发送消息主要通过LNetPut,接收则涉及lnet_parse()和lnet_ni_recv()等函数。LNET支持基于RDMA的消息传输,减少内存拷贝。路由器实现静态路由,消息接收完毕后转发。
最低0.47元/天 解锁文章
6195

被折叠的 条评论
为什么被折叠?



