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 |
消息的处理由于缺乏资源(转发缓冲或额度)而被推迟,调用此函数以期释放一些资源。 |
|
lnd_notify |