静态LNet配置

来自Lustre文件系统
跳转至: 导航搜索

在Lustre2.7.0之前的版本中,网络设备驱动程序的配置是通过向lnet 内核模块提供选项来专门管理的。首次加载内核模块时,Lustre从模块选项 (modprobe ) 的配置文件中读取选项。随着Lustre 2.7.0的发布,管理员可以还使用LNet动态配置 功能替代静态配置,动态配置功能由一个名为lnetctl 的程序控制。

有关Lustre LNet的一般介绍,请参阅文章Lustre网络(LNET)概述

这一节介绍LNet的静态配置。

概述

当内核需要加载lnet模块时,Lustre可以通过直接向lnet模块提供参数来配置 LNet接口。为此,需要在普通的modprobe配置选项目录(通常为/etc/modprobe.d)中创建一个文件,并为lnet模块添加一个条目。习惯做法会将Lustre模块的配置选项记录在一个名为/etc/modprobe.d/lustre.conf的文件中(但设备的调节参数会分开存储到设备的特定文件中, 如/etc/modprobe.d/ko2iblnd.conf — 想要了解这方面的示例,请参见优化o2iblnd性能一节,其中介绍了当检测到英特尔®Omni-Path接口时会自动应用的优化配置)。

用来定义LNet 配置的模块选项有两种:networksip2netsnetworks参数最容易理解,并且使用非常简单的语法,而ip2nets以更高的复杂性为代价,为管理员提供了最大的灵活性。强烈建议使用networks语法,除非有使用ip2nets语法更容易满足的特定的要求。

lnet模块中应该仅定义一个networksip2nets参数。这两个参数是互斥的;只能选择一个或另一个,不能两个都选。如果模块配置中同时引用了这两个选项,则在内核环形缓冲区(dmesg)和系统控制台中将报告以下警告信息:

[46290.641911] LNetError: 101-0: Please specify EITHER 'networks' or 'ip2nets' but not both at once
[46290.645288] LNetError: 3483:0:(config.c:199:lnet_parse_networks()) networks string is undefined

以上输出的错误信息中,第二条是ip2netsnetworks选项冲突的另一个问题。关键的错误是第一条输出信息。删除networksorip2nets选项中的其中一个可以解决冲突。

如果通过一个或多个内核模块配置文件中的连续条目定义了多个networks或者 ip2nets声明,模块加载器将读取的最后一个条目来使用。当使用此方法定义LNet参数时,请确保modprobe目录(RHEL和CentOS 中是/etc/modprobe.d目录)中定义的LNet配置文件不超过一个。

当内核模块被加载时,内核模块选项是只读的,并通过模块加载器传递给内核。因此,如果配置选项有所更改,必须要停止、从内核中卸载并重新加载lnet 模块,否则更改不会生效。

LNet 使用 networks 的语法

最简单的配置有以下语法:

options lnet networks="<lnd><#>(<dev>)[,…]"

例如,要为以太网设备eth1添加TCP/IP (socklnd) LNet NID:

options lnet networks="tcp0(eth1)"

请注意,配置中没有提到IP地址,只有设备名称。这种语法简单易读。

下一个示例显示如何创建了一个RDMA Verbs(o2iblnd)的LNet接口:

options lnet networks="o2ib0(ib0)"

如果主机需要多个网络接口用于承载LNet流量,可以向networks变量中添加额外的接口:

options lnet networks="tcp0(eth1),o2ib0(ib0),o2ib1(ib1)"

上面的例子配置了三个网络接口:eth1上配置了一个socklndNID,ib0ib1上分别配置一个o2iblndNID。

如果需要创建一个配置,其中一个物理接口属于两个LNet,请以逗号为分隔符来指定不同网络,每个网络的括号中有相同的物理接口。例如:

options lnet networks="tcp0(eth1),tcp1(eth1)"

这不是一种常见的配置,因为它会受到实际应用的限制(两个网络应该位于同一子网并连接到同一物理接口,因此在这种情况下创建两个网络并没有好处)。

LNet 使用 ip2nets 的语法

ip2nets的配置语法使用正则表达式从单个全局定义中动态地创建主机的LNet配置。管理员会根据目标主机网络接口上的IPv4地址来创建模式匹配规则,第一个匹配的规则决定了将要应用的配置。通过这种方式,单个配置文件可以跨异构网络环境和多个网络应用于多个客户端和服务器上。

但是这种灵活性是以牺牲简单性和可读性为代价的。ip2nets规则可能很复杂,因此很难解释清楚一个规则对给定的主机集群可能造成何种影响。如果规则中引入了语法错误,例如模式匹配表达式的范围不正确,且该错误在被捕捉之前就已经分发到集群上,则可能对整个主机集群的配置产生广泛的负面影响。因此,测试ip2nets配置的过程更加复杂。

一般语法如下:

options lnet ip2nets="<lnd>[<#>][(<dev>)][, <lnd>[<#>][(<dev>)]] <pattern>[; …]"

每个规则之间使用分号分隔,当lnet启动时,按从左到右的顺序依次对规则进行匹配检验。对每个LNet而言,第一个与之匹配的规则将应用于该LNet的配置上。直到创建好所有的LNet或最后一条规则被检验完成。这意味着单个规则可以为单个服务器定义多个NID,每个NID可用于不同网络接口上的不同LNet。

关于如何使用ip2nets,最简单的方法是举一个例子来说明。下面的例子描述了不同类型的网络结构上两种不同LNet的配置:

options lnet ip2nets="tcp0(eth1) 10.10.100.*; o2ib0(ib0) 192.168.200.*"

如果主机的IP地址与模式10.10.100.*匹配,则会为这台主机在tcp0类型的LNet上配置一个NID;如果IP地址与模式192.168.200.*匹配,则会为其配置一个o2ib0类型的LNet。如果有一台主机与这两种模式都匹配,则将为该主机配置两种LNet。

这种模式匹配的语法包括格式为[x-y]的数值范围,例如[2-20]。还可以使用一个除数进一步细化其范围,例如 [2-20/2]用于匹配范围内的所有偶数,[1-19/2]用于匹配范围内的所有奇数。

在下一个示例中,一部分主机使用eth0连接到LNettcp0上,而另一部分主机使用eth1。当系统之间存在硬件差异,需要使用不同的网卡连接到同一子网时,这种配置最有可能出现:

options lnet ip2nets="tcp0(eth0) 10.10.100.[1-50]; tcp0(eth1) 10.10.100.[100-200]"

如果省略了接口定义,则默认使用与IP地址匹配的主机接口。因此,上面的例子可以重写为:

options lnet ip2nets="tcp0 10.10.100.*"

如果在配置中找不到匹配项,网络将报告错误:

[257641.245272] LNetError: 11a-a: ip2nets does not match any local IP interfaces
[257641.247813] LNetError: 8881:0:(config.c:199:lnet_parse_networks()) networks string is undefined

也许会与预期的情况不一样,如果ip2nets没有找到匹配的模式,LNet 内核模块不会回到networks选项或加载默认配置。如果找不到与ip2nets选项声明中的模式相匹配的模式,可能会默认不对目标系统应用任一网络配置。

下面是一个更复杂的演示:

options lnet ip2nets="tcp0(eth1) 10.70.207.[11,12]; \
    tcp0(eth2) 10.70.207.[21-24]; \
    tcp0 10.70.*.*"

上面的例子中,其中有两台主机将在eth1设备上创建一个LNet NID,有四台主机使用 eth2,其它10.70/16网段中的主机将在操作系统提供的第一个接口上为tcp0网络创建一个LNet NID,前提是该接口在10.70/16子网中有一个IPv4地址。

这里进一步解释一下最后一项。配置项“tcp0 10.70.*.*”的语法含糊不清,容易被读者误解。与看上去的意思不同,这并不意味着“将与模式10.70.*.*匹配的接口配置为LNet的tcp0”。事实上,它的意思包含更多信息。它表示“如果主机操作系统检测到的第一个接口也与模式10.70.*.*匹配,则将其配置为LNettcp0”。如果条件为假,则不会为其配置LNet NID。

如果需要,还可以在ip2nets语法中混合使用LNDs :

options lnet ip2nets="o2ib0(ib0) 192.168.207.[11,12]; \
    o2ib0(ib2) 192.168.207.[21-24]; \
    tcp0 10.70.*.*"

该语法中也支持注释,但是必须注意注释相对于分隔规则中分号的位置。注释标记会告诉解析器应该忽略注释标记和字符串中的下一个分号之间的所有内容,如果没有分号,则一直忽略直到整个字符串的结尾,以先满足的条件为准。如果在分号之后开始注释,可能会导致解析器将配置的重要内容视为注释而忽略掉了。

例如,以下语法是正确的:

options lnet ip2nets="tcp0(eth1) 10.70.207.[11-12] # MGS/MDS; \
    tcp0(eth2) 10.70.207.[21-24] # OSS; \
    tcp0 10.70.*.* # Everything else"

在下一个示例中,第二行将全部被忽略,因为注释标记( # )位于分号之后,导致下一行配置文本被视为注释文本,而不是配置语法:

options lnet ip2nets="tcp0(eth1) 10.70.207.[11-12] ; # MGS/MDS \
tcp0(eth2) 10.70.207.[21-24] # OSS; \
tcp0 10.70.*.* # Everything else"

示例中高亮显示的所有文本将被看作是注释。