LNet路由器配置指南

来自Lustre文件系统
Lixi讨论 | 贡献2019年4月28日 (日) 21:01的版本 添加/删除/显示网络
跳转至: 导航搜索

本文档主要描述了LNet路由器的配置和调参过程。它还涵盖了关于如何使用LNet路由器设置从Infiniband网络到英特尔OPA节点连接的详细说明。

LNet

LNet支持不同的网络类型,如以太网、InfiniBand、英特尔Omni-Path和其他专有网络技术,如Cray's Gemini。网络消息通过LNet路由功能在不同的网络之间转发。LNet路由功能提供了一种有效的协议,能够桥接不同类型的网络。

LNet是Linux内核的一部分,当底层网络支持时,它能达到全RDMA吞吐量,实现零拷贝通信。Lustre可以通过单个远程过程调用(RPC)启动多OST的读写操作,这使得客户端能够以接近RDMA峰值带宽的速率访问数据。Lustre 2.10.X中实现了多轨(Multi-Rail,MR)功能,它允许节点上的多个相同类型的接口在同一个LNet (例如tcp0、o2ib0等)下分组一起使用。这些接口可用于并发传输网络流量。MR还能够利用不同网络上配置的多个接口。例如,OPA和MLX接口可以分组在各自的LNet下,结合MR特性,可以同时转发处理LNet上的流量。

LNet配置示例

LNet路由器是一种专用的Lustre客户端,该客户端上未挂载Lustre文件系统,只运行了LNet。单个LNet路由器可以为不同的文件系统提供服务。

LNet路由器配置指南.png

在以上示例中:

  • 服务器位于LAN1上,一个基于Mellanox的InfiniBand网络–10.10.0.0/24
  • 客户端位于LAN2上,一个英特尔OPA网络–10.20.0.0/24
  • 路由器中的10.10.0.20、10.10.0.21端口连接LAN1,10.20.0.29、10.20.0.30 端口连接LAN2

通过在lustre.conf/etc/modprobe.d/lustre.conf)中添加模块参数,或者动态地使用lnetctl命令工具,可以完成节点上的网络配置。此外,当前配置信息可以导出到一个YAML格式的文件中,之后在任何需要的时候,都可以通过导入该YAML文件来设置网络配置。

通过在lustre.conf中添加模块参数进行网络配置

Servers:
options lnet networks="o2ib1(ib0)" routes="o2ib2 10.10.0.20@o2ib1"
 
Routers:
options lnet networks="o2ib1(ib0),o2ib2(ib1)" "forwarding=enabled"
 
Clients:
options lnet networks="o2ib2(ib0)" routes="o2ib1 10.20.0.29@o2ib2" 

注:必须重启LNet来使新配置生效。所以必须清空之前的配置,再重新配置LNet网络。在卸载LNet模块之前,请确保Lustre网络和Lustre文件系统已停止。

// To unload and load LNet module
modprobe -r lnet
modprobe lnet
  
// To unconfigure and reconfigure LNet
lnetctl lnet unconfigure
lnetctl lnet configure 

使用lnetctl命令动态配置网络

Servers:
lnetctl net add --net o2ib1 --if ib0
lnetctl route add --net o2ib2 --gateway 10.10.0.20@o2ib1
lnetctl peer add --nid 10.10.0.20@o2ib1
 
Routers:
lnetctl net add --net o2ib1 --if ib0
lnetctl net add --net o2ib2 --if ib1
lnetctl peer add --nid 10.10.0.1@o2ib1
lnetctl peer add --nid 10.20.0.1@o2ib2
lnetctl set routing 1
   
Clients:
lnetctl net add --net o2ib2 --if ib0
lnetctl route add --net o2ib1 --gateway 10.20.0.29@o2ib2
lnetctl peer add --nid 10.20.0.29@o2ib2 

使用YAML文件格式导入/导出配置

// To export the current configuration to a YAML file
lnetctl export FILE.yaml
lnetctl export > FILE.yaml
  
  
// To import the configuration from a YAML file
lnetctl import FILE.yaml
lnetctl import < FILE.yaml 

/etc目录中包含了一个默认的lnet.conf文件,文件中有一个YAML格式的示例配置。YAML文件中另一个配置示例如下:

net:
    - net type: o2ib1
      local NI(s):
        - nid: 10.10.0.1@o2ib1
          status: up
          interfaces:
              0: ib0
          tunables:
              peer_timeout: 180
              peer_credits: 8
              peer_buffer_credits: 0
              credits: 256
          lnd tunables:
              peercredits_hiw: 64
              map_on_demand: 32
              concurrent_sends: 256
              fmr_pool_size: 2048
              fmr_flush_trigger: 512
              fmr_cache: 1
          tcp bonding: 0
          dev cpt: -1
          CPT: "[0]"
route:
    - net: o2ib2
      gateway: 10.10.0.20@o2ib1
      hop: 1
      priority: 0
      state: up
peer:
    - primary nid: 10.10.0.20@o2ib1
      Multi-Rail: False
      peer ni:
        - nid: 10.10.0.20@o2ib1
          state: up
          max_ni_tx_credits: 8
          available_tx_credits: 8
          min_tx_credits: 7
          tx_q_num_of_buf: 0
          available_rtr_credits: 8
          min_rtr_credits: 8
          refcount: 4
global:
    numa_range: 0
    max_intf: 200
    discovery: 1 

LNet提供了一种监控每条路由信息的机制。LNet以规则的、可配置的时间间隔(live_router_check_interval) ping路由信息中标识的每个网关,以确保它们的状态是正常的。如果经过某一路由的信息发送失败,或者路由检查器确定网关已经关闭,则该路由将被标记为关闭且不再使用。随后,仍会以规则的、可配置的时间间隔(dead_router_check_interval)继续ping该网关,以确定它是否恢复正常。

多轨LNet配置示例

如果路由器启用了MR连接,我们可以将路由器作为多个接口的对等节点添加到客户端和服务器上,当有流量发送到路由器上时,MR算法将确保路由器的发送和接收两个接口都有效。然而,单个接口故障仍然会导致整个路由器停机。通过上面图1中的网络拓扑示例,可以按照如下示例配置LNet MR:

Servers:
lnetctl net add --net o2ib1 --if ib0,ib1
lnetctl route add --net o2ib2 --gateway 10.10.0.20@o2ib1
lnetctl peer add --nid 10.10.0.20@o2ib1,10.10.0.21@o2ib1
 
Routers:
lnetctl net add --net o2ib1 --if ib0,ib1
lnetctl net add --net o2ib2 --if ib2,ib3
lnetctl peer add --nid 10.10.0.1@o2ib1,10.10.0.2@o2ib1
lnetctl peer add --nid 10.20.0.1@o2ib2,10.20.0.2@o2ib2
lnetctl set routing 1
   
Clients:
lnetctl net add --net o2ib2 --if ib0,ib1
lnetctl route add --net o2ib1 --gateway 10.20.0.29@o2ib2
lnetctl peer add --nid 10.20.0.29@o2ib2,10.20.0.30@o2ib2

细粒度路由

在Lustre配置中,路由参数标志了所对应LNet路由器。该参数在转发流量时会告诉节点正在使用哪条路由路径。它给出了以分号分隔的路由器定义列表。

routes=dest_lnet [hop] [priority] router_NID@src_lnet; \ dest_lnet [hop] [priority] router_NID@src_lnet 

另一种语法是以冒号分隔的路由器定义列表:

routes=dest_lnet: [hop] [priority] router_NID@src_lnet \ [hop] [priority] router_NID@src_lnet 

当网络中有两台或两台以上的LNet路由器时,可以通过配置优先级参数给每台路由器赋予加权优先级。以下是可能使用该参数的一些原因:

  • 其中一台路由器比另一台更有能力。
  • 一台路由器是主路由器,另一台是备用路由器。
  • 一台路由器用于一部分客户端,另一台用于另一部分客户端。

每台路由器都将流量转发到不同的地理位置。优先级参数是可选的,如果路由器间不存在优先级关系,则无需指定。

hop参数指定到达目的地的跳数。当路由需要转发流量时,会使用跳数最少的一条路由。如果到同一目的网络的多条路由都具有相同的跳数,流量将会循环方式分布在这些路径上。为了使某一节点上的消息到达目的LNet网络(dest_lnet),下一跳应该是源LNet(scr_lnet)上带有NID(router_NID)的LNet路由器。

假如一个系统的架构足够好,其上的流量有可能映射到每台客户端和服务器上。这种路由也被称为细粒度路由。

高级路由参数

在Lustre配置中,不同类型的LNet通过路由器连接,还可以设置几个内核模块参数来监控和提高路由性能。这些参数在/etc/modprobe.d/lustre.conf文件中设置。与路由相关的参数有:

  • auto_down-启用/禁用( 对应1 / 0 )路由器状态的自动标记,可设为up或down。默认值为1。如果要禁用路由器标记,请设置:
options lnet auto_down=0 
  • avoid_asym_router_failure -指定如果路由器的一个接口由于某种原因关闭,整个路由器都会被标记为关闭。这一点很重要,因为如果节点没有意识到一侧的接口关闭,它们仍然会假设路由器是健康的,继续将数据推送到另一侧,而实际情况并非如此。按如下设置打开它:
options lnet avoid_asym_router_failure=1 
  • live_router_check_interval -指定路由检查器ping活动路由器的时间间隔(秒)。默认值为60。如果要将该值设置为50,请使用:
options lnet live_router_check_interval=50  
  • dead_router_check_interval -指定路由器检查器将检查失效路由器的时间间隔(秒)。默认值为60。如果要将该值设置为50 :
options lnet dead_router_check_interval=50 
  • router_ping_timeout -指定路由器检查器检查活动或失效路由器的超时时间。路由器检查器分别在每个dead_router_check_interval 或者 live_router_check_interval 向每个失效路由器或活动路由器发送一条ping消息。默认值为50。要将该值设置为60 :
options lnet router_ping_timeout=60 
  • check_routers_before_use-指定使用前检查路由器。默认设置为off。如果该参数设置为on,dead_router_check_interval参数必须为正整数。
options lnet check_routers_before_use=1 

router_checker从每台路由器获取以下信息:

  • 路由器被禁用的时间点
  • 路由器被禁用的时长

如果router_checkerrouter_ping_timeout设置的时长内没有收到路由器的回复消息,则它认为路由器已经停机了。如果标记为“up”的路由器响应ping,timeout将被重置。如果通过某一路由器成功发送了100个数据包,则该路由器的发送数据包(sent-packets)计数器的值将为100。在/proc/sys/lnet/stats中可以找到LNet路由器的统计数据。

如果没有指定时间间隔,则统计数据仅被采样和打印出一次。否则,将以指定的时间间隔(秒)对统计数据进行采样和打印。这些统计数据可以使用lnetctl工具显示,如下所示:

# lnetctl stats show
statistics:
    msgs_alloc: 0
    msgs_max: 2
    errors: 0
    send_count: 887
    recv_count: 887
    route_count: 0
    drop_count: 0
    send_length: 656
    recv_length: 70048
    route_length: 0
    drop_length: 0  

ping响应中还提供被ping节点的NIDs状态。这样,发送ping命令的节点可以知道是否继续使用该节点作为下一跳。如果路由器的一个NIDs状态为关闭,并且设置了avoid_asym_router_failure,则该路由器不会再被使用。

LNet的动态配置

可以使用lnetctl工具动态配置LNet。lnetctl工具可用于初始化LNet,而无需启动任何网络接口。这为用户在加载完LNet后添加接口提供了灵活性。一般来说,lnetctl格式如下: lnetctl cmd subcmd [options]

工具提供了以下配置项:

  • 配置LNet/取消配置
  • 添加/删除/显示网络
  • 添加/删除/显示对等节点
  • 添加/删除/显示路由路径
  • 启用/禁用路由
  • 配置路由器缓冲池

配置LNet/取消配置

使用modprobe (modprobe lnet)加载lnet模块后,可以使用lnetctl工具配置LNet,而无需启动模块参数中指定的网络。它还可以通过提供 --all选项来配置模块参数中指定的网络接口。

// To configure LNet
lnetctl lnet configure [--all]
  
// To unconfigure LNet
lnectl lnet unconfigure 

添加/删除/显示网络

现在,LNet已准备好配置要添加的网络。要在ib0和ib1接口上添加一个o2ib1 LNet网络:

lnetctl net add --net o2ib1 --if ib0,ib1

使用show子命令,可以查看配置:

lnetctl net show -v
net:
    - net type: lo
      local NI(s):
        - nid: 0@lo
          status: up
          statistics:
              send_count: 0
              recv_count: 0
              drop_count: 0
          tunables:
              peer_timeout: 0
              peer_credits: 0
              peer_buffer_credits: 0
              credits: 0
          lnd tunables:
          tcp bonding: 0
          dev cpt: 0
          CPT: "[0]"
    - net type: o2ib1
      local NI(s):
        - nid: 192.168.5.151@o2ib1
          status: up
          interfaces:
              0: ib0
          statistics:
              send_count: 0
              recv_count: 0
              drop_count: 0
          tunables:
              peer_timeout: 180
              peer_credits: 8
              peer_buffer_credits: 0
              credits: 256
          lnd tunables:
              peercredits_hiw: 64
              map_on_demand: 32
              concurrent_sends: 256
              fmr_pool_size: 2048
              fmr_flush_trigger: 512
              fmr_cache: 1
          tcp bonding: 0
          dev cpt: -1
          CPT: "[0]"
        - nid: 192.168.5.152@o2ib1
          status: up
          interfaces:
              0: ib1
          statistics:
              send_count: 0
              recv_count: 0
              drop_count: 0
          tunables:
              peer_timeout: 180
              peer_credits: 8
              peer_buffer_credits: 0
              credits: 256
          lnd tunables:
              peercredits_hiw: 64
              map_on_demand: 32
              concurrent_sends: 256
              fmr_pool_size: 2048
              fmr_flush_trigger: 512
              fmr_cache: 1           
          tcp bonding: 0
          dev cpt: -1
          CPT: "[0]"  

要删除一个网络:

lnetctl net del --net o2ib1 --if ib0  

结果配置如下:

lnetctl net show -v
net:
    - net type: lo
      local NI(s):
        - nid: 0@lo
          status: up
          statistics:
              send_count: 0
              recv_count: 0
              drop_count: 0
          tunables:
              peer_timeout: 0
              peer_credits: 0
              peer_buffer_credits: 0
              credits: 0
          lnd tunables:
          tcp bonding: 0
          dev cpt: 0
          CPT: "[0]"
    - net type: o2ib1
      local NI(s):
        - nid: 192.168.5.151@o2ib1
          status: up
          interfaces:
              0: ib0
          statistics:
              send_count: 0
              recv_count: 0
              drop_count: 0
          tunables:
              peer_timeout: 180
              peer_credits: 8
              peer_buffer_credits: 0
              credits: 256
          lnd tunables:
              peercredits_hiw: 64
              map_on_demand: 32
              concurrent_sends: 256
              fmr_pool_size: 2048
              fmr_flush_trigger: 512
              fmr_cache: 1
          tcp bonding: 0
          dev cpt: -1
          CPT: "[0]"  

添加/删除/显示对等节点

使用lnetctl命令添加远程对等节点:

lnetctl peer add --prim_nid 192.168.5.161@o2ib1 --nid 192.168.5.162@o2ib1 

验证添加的对等节点的配置:

lnetctl peer show -v
peer:
    - primary nid: 192.168.5.161@o2ib1
      Multi-Rail: True
      peer ni:
        - nid: 192.168.5.161@o2ib1
          state: NA
          max_ni_tx_credits: 8
          available_tx_credits: 8
          min_tx_credits: 7
          tx_q_num_of_buf: 0
          available_rtr_credits: 8
          min_rtr_credits: 8
          refcount: 1
          statistics:
              send_count: 2
              recv_count: 2
              drop_count: 0
        - nid: 192.168.5.162@o2ib1
          state: NA
          max_ni_tx_credits: 8
          available_tx_credits: 8
          min_tx_credits: 7
          tx_q_num_of_buf: 0
          available_rtr_credits: 8
          min_rtr_credits: 8
          refcount: 1
          statistics:
              send_count: 1
              recv_count: 1
              drop_count: 0

要删除对等节点:

lnetctl peer del --prim_nid 192.168.5.161@o2ib1 --nid 192.168.5.162@o2ib1 


添加/删除/显示路由路径

添加一个路由路径:

lnetctl route add --net o2ib2 --gateway 192.168.5.153@o2ib1 --hop 2 --prio 1 

验证添加的路经信息:

lnetctl route show --verbose
route:
 - net: o2ib2
   gateway: 192.168.5.153@o2ib1
   hop: 2
   priority: 1
   state: down  

必须在/etc/sysconfig/lnet.conf下创建一个YAML文件,才能使此配置持久化。然后,我们可以实时导入/导出配置文件:

lnetctl export > /etc/sysconfig/lnet.conf  

/etc/init.d/中的lnet脚本与DLC兼容,应在系统启动时使该配置生效:

systemctl enable lnet  

启用/禁用路由

要在节点上启用/禁用路由,请执行以下操作:

// To enable routing
lnetctl set routing 1
  
// To disable routing
lnetctl set routing 0  

要检查路由信息:

lnetctl routing show  

配置路由器缓冲区

路由器缓冲区用于缓冲路由到其他节点的消息。这些缓冲区由所有的中央处理器分区共享,所以它们的值应该考虑系统中的中央处理器数量再决定。每个CPT的缓冲区最小值为:

#define LNET_NRB_TINY_MIN     512
#define LNET_NRB_SMALL_MIN    4096
#define LNET_NRB_LARGE_MIN    256  

如果路由器缓冲区的值大于0,则应该设置相应数量的缓冲区。如果值等于0,则路由器缓冲区数量重置为系统默认值。要使用lnetctl配置路由器缓冲池:

//值必须大于或等于0
lnetctl set tiny_buffers 4096
lnetctl set small_buffers 8192
lnetctl set large_buffers 2048 
 

MR节点的ARP流量问题

由于Linux路由的特征,如果在同一节点上有两个网络接口,那么在ARP中,某一指定IP返回的硬件地址可能不一定正好是被解析的接口的地址。这会给o2iblnd造成问题,因为它使用IPoIB解析地址,并获得错误的Infiniband地址。

为了解决这个问题,需要设置路由条目和规则,告诉linux内核使用正确的硬件地址进行响应。下面是一个在具有2个以太网、2个MLX和2个OPA接口的节点上设置的示例。

  • OPA 接口:
    • ib0: 192.168.1.1
    • ib1: 192.168.2.1
  • MLX 接口:
    • ib2: 172.16.1.1
    • ib3: 172.16.2.1
#Setting ARP so it doesn't broadcast
sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf.ib0.arp_ignore=1
sysctl -w net.ipv4.conf.ib0.arp_filter=0
sysctl -w net.ipv4.conf.ib0.arp_announce=2
sysctl -w net.ipv4.conf.ib0.rp_filter=0
  
sysctl -w net.ipv4.conf.ib1.arp_ignore=1
sysctl -w net.ipv4.conf.ib1.arp_filter=0
sysctl -w net.ipv4.conf.ib1.arp_announce=2
sysctl -w net.ipv4.conf.ib1.rp_filter=0
  
sysctl -w net.ipv4.conf.ib2.arp_ignore=1
sysctl -w net.ipv4.conf.ib2.arp_filter=0
sysctl -w net.ipv4.conf.ib2.arp_announce=2
sysctl -w net.ipv4.conf.ib2.rp_filter=0
  
sysctl -w net.ipv4.conf.ib3.arp_ignore=1
sysctl -w net.ipv4.conf.ib3.arp_filter=0
sysctl -w net.ipv4.conf.ib3.arp_announce=2
sysctl -w net.ipv4.conf.ib3.rp_filter=0
  
ip neigh flush dev ib0
ip neigh flush dev ib1
ip neigh flush dev ib2
ip neigh flush dev ib3
   
echo 200 ib0 >> /etc/iproute2/rt_tables
echo 201 ib1 >> /etc/iproute2/rt_tables
echo 202 ib2 >> /etc/iproute2/rt_tables
echo 203 ib3 >> /etc/iproute2/rt_tables

ip route add 192.168.0.0/16 dev ib0 proto kernel scope link src 192.168.1.1 table ib0
ip route add 192.168.0.0/16 dev ib1 proto kernel scope link src 192.168.2.1 table ib1
ip rule add from 192.168.1.1 table ib0
ip rule add from 192.168.2.1 table ib1
   
ip route add 172.16.0.0/16 dev ib2 proto kernel scope link src 172.16.1.1 table ib2
ip route add 172.16.0.0/16 dev ib3 proto kernel scope link src 172.16.2.1 table ib3
ip rule add from 172.16.1.1 table ib2
ip rule add from 172.16.2.1 table ib3
ip route flush cache 

LNet调参

LNet调参是通过向Lustre网络驱动程序传递参数进行的。RDMA的Lustre网络驱动程序是ko2iblnd的内核模块。该驱动程序可用于英特尔OPA和InfiniBandde网卡。

在Lustre 2.10.X中,可以使用/usr/sbin/ko2iblnd-probe检测网卡,并为支持的网卡设置可调参数。可以通过脚本对英特尔OPA和英特尔True Scale卡进行自动检测和配置,以实现Lustre的最佳性能。还可以修改脚本来检测其他网卡并设置最佳参数。以下是Lustre对等节点的配置文件(/etc/modprobe.d/ko2ilnd.conf)中的参数设置示例。

alias ko2iblnd-opa ko2iblnd
options ko2iblnd-opa peer_credits=128 peer_credits_hiw=64 credits=1024 concurrent_sends=256 ntx=2048 map_on_demand=32 fmr_pool_size=2048 fmr_flush_trigger=512 fmr_cache=1  

/etc/modprobe.d/ko2blnd.conf文件中的参数是全局的,且对于不同网络结构,能够配置的参数也是相同的。因此,建议使用lnetctl工具为每个结构指定正确的参数,并将配置信息存储到/etc/sysconfig/lnet.conf中,以保证在系统重启时配置保持不变。前面讲的网络中的所有对等节点(计算节点、网络路由器、服务器)都需要配置相同的可调参数,以便LNet可以独立于所使用的硬件技术(英特尔OPA或InfiniBand)而工作。因此,如果要路由到包含较旧Lustre节点的网络结构中,必须更新这些参数,以应用与ko2iblnd模块相同的选项。

LNet使用peer_creditsnetwork_interface_credits通过网络发送块大小固定为1MB的数据。peer_credits参数管理可以同时发送到单个对等节点的并行数量,并使用/proc/sys/lnet/peers接口进行监控。还可以使用特定Lustre网络驱动程序的模块参数来增加peer_credits的数量:

//The default value is 8
ko2iblnd-opa peer_credits=128  

增加peer_credits的数量并不一定能获得良好的性能,因为在大型的配置中,增加数量会导致网络过载并增加OFED堆栈的内存利用率。可调参数network interface credits(credits)能够限制并行发送到单个网络的数量,并通过proc/sys/lnet/nis接口进行监控。可以通过特定Lustre网络驱动程序(LND)的模块参数来增加network interface credits的数量:

// The default value is 64 and is shared across all the CPU partitions (CPTs).
ko2iblnd-opa credits=1024  

快速内存注册(FMR)是一种降低内存分配开销的技术。在FMR中,内存注册分为两个阶段:

  1. 分配注册所需的资源
  2. 使用从第一个步骤中获取的资源进行注册

资源分配和回收可以在批处理模式下管理,因此,FMR可以实现更快的内存注册。要在LNet中启用FMR,map_on_demand的值应该大于零。

// The default value is 0
ko2iblnd-opa map_on_demand=32 

早期,仅仅是基于mlx4驱动程序的英特尔OPA和Mellanox FDR卡能够支持快速内存注册,而基于mlx5驱动程序的Mellanox FDR/EDR卡则不支持。Lustre 2.10.X版本增加了MLX5 (v2.7.16 )对快速内存注册的支持。

Table 1: 对于英特尔OPA的Lustre参数设置建议
可调参数 建议设置的值 默认值
peer_credits 128 8
peer_credits_hiw 64 0
credits 1024 64
concurrent_sends 256 0
ntx 2048 512
map_on_demand 32 0
fmr_pool_size 2048 512
fmr_flush_trigger 512 384
fmr_cache 1 1

从上表中:

  • peer_credits_hiw设置高基准以开始检索对等节点的数量。
  • concurrent_sends是并发到单个对等节点的硬件数量。
  • ntx是分配给每个池的消息描述符的数量。
  • fmr_pool_size是每个CPT上的FMR池的大小。
  • fmr_flush_trigger是触发池进行刷新操作的脏FMRs的数量。
  • fmr_cache应设置为非零的值,以启用FMR缓存。

配置连接英特尔OPA和InfiniBand节点的LNet路由器

LNet路由器可以部署在一个具有足够多网卡和LNet软件堆栈的符合工业标准的服务器上。为生产环境设计一个完整的解决方案不是一件容易的事情,但是英特尔提供了一个工具(LNet自检)来预先测试和验证配置和性能。目标是设计一个具有足够带宽的LNet路由器,以满足后端存储的吞吐量要求。连接到一台LNet路由器的计算节点数量通常不需要改变解决方案的设计。一台LNet路由器的可用带宽受到连接到该路由的最慢网络技术的限制。通常,由于使用LNet路由器,测试中观察到的带宽比最慢网卡中标明的硬件带宽下降10-15%。

在任何情况下,都建议使用网络接口制造商提供的工具和(或)Lustre提供的LNet自检工具来验证实施的解决方案,后者仅在Lustre系统中可用。如果credits的数量(peer_credits and credits)设置得不合适,LNet路由器可能会拥塞。对于与路由器的通信,不仅需要调整peer_credits and credits,还需要全局路由器缓冲区和对等路由器缓冲区的credits。

内存方面的考虑

当需要为另一个对等节点转发数据包时,LNet路由器会使用额外的credit计数:

  • Peer Router Credit: 该credit管理从单个对等节点接收到的并发数量,并防止单个对等节点使用了所有路由器的缓冲资源。默认情况下,该值应为0。如果该值为0,则LNet路由器使用peer_credits参数。
  • Router Buffer Credit: 此credit允许消息排队,并选择非数据类型的有效负载RPC和数据类型的RPC,以避免拥塞。事实上,一个LNet路由器的缓冲区数量是有限的:
tiny_router_buffers  – size of buffer for messages of <1 page size
small_router_buffers – size of buffer for messages of 1 page in size
large_router_buffers – size of buffer for messages >1 page in size (1MiB)

可以使用/proc/sys/lnet/buffers文件监控这些LNet内核模块参数,并且每个CPT都提供这些参数:

Pages Count Credits Min
0 512 512 503
0 512 512 504
0 512 512 503
0 512 512 497
1 4096 4096 4055
1 4096 4096 4048
1 4096 4096 4056
1 4096 4096 4070
256 256 256 248
256 256 256 247
256 256 256 240
256 256 256 242

在上表中,

  • Pages-表示每个缓冲区的页数。这是一个常数。
  • Count -表示已分配的缓冲区的数量。这是一个常数。
  • Credits-表示缓冲区中credit的数量。这是当前可用缓冲区credits数量的实时值。如果该值为负,则表示排队消息的数量。
  • Min-这是系统中达到过的最低的credits 。这是历史数据。

LNet路由器堆栈的内存利用率是由Peer Router Credit和Router Buffer Credit两个参数引起的。内存大小为32GB或更大的LNet路由器有足够的内存来支持这些参数非常大的配置。无论如何,可以使用/proc/sys/lnet/lnet_memused度量文件来测量LNet堆栈的内存消耗。

软件安装

Lustre安装

通过以下链接,可以在Lustre客户端和LNet路由器上安装Lustre客户端RPMs,并在Lustre服务器上安装Lustre服务器RPMs https://downloads.hpdd.intel.com/public/lustre/latest-release/

英特尔OPA软件安装

  • 英特尔Omni-Path节点上的英特尔Omni-Path IFS -- 从以下链接下载IFS包,并将其解压缩

https://downloadcenter.intel.com/download/26885/Intel-Omni-Path-Fabric-Software-Including-Intel-Omni-Path-Host-Fabric-Interface-Driver

rpm -ivh kernel-devel-3.10.0-514.6.1.el7.x86_64.rpm
 
yum -y install \
    kernel-devel kernel-debuginfo-common kernel-debuginfo-common-x86_64 \
    redhat-lsb redhat-lsb-core
 
yum -y install \
    libibcommon libibverbs libibmad libibumad infinipath-psm \
    libibmad-devel libibumad-devel infiniband-diags libuuid-devel \
    atlas sysfsutils rpm-build redhat-rpm-config tcsh \
    gcc-gfortran libstdc++-devel libhfi1 expect qperf perftest papi
 
tar xzvf IntelOPA-IFS.DISTRO.VERSION
cd IntelOPA-IFS.DISTRO.VERSION &&
./INSTALL -i opa_stack -i opa_stack_dev -i intel_hfi -i delta_ipoib \
          -i fastfabric -i mvapich2_gcc_hfi -i mvapich2_intel_hfi \
          -i openmpi_gcc_hfi -i openmpi_intel_hfi -i opafm -D opafm 
  • 路由器上的英特尔Omni-Path基础版本 -从同一(上面的)链接下载英特尔Omni-Path基础安装包。
cd IntelOPA-Basic.DISTRO.VERSION
./INSTALL -i opa_stack -i opa_stack_dev -i intel_hfi -i delta_ipoib \
          -i fastfabric -i mvapich2_gcc_hfi -i mvapich2_intel_hfi \
          -i openmpi_gcc_hfi -i openmpi_intel_hfi -i opafm -D opafm 

完成英特尔Omni-Path基础版的构建后,您应该在lsmod输出端看到加载了以下英特尔Omni-Path HFI1模块:

# lsmod |grep hfi
hfi1 558596 5
ib_mad 61179 4
hfi1,ib_cm,ib_sa,ib_umad
compat 13237 7
hfi1,rdma_cm,ib_cm,ib_sa,ib_mad,ib_umad,ib_ipoib
ib_core 88311 11
hfi1,rdma_cm,ib_cm,ib_sa,iw_cm,ib_mad  

Mellanox软件安装

从http://www.mellanox.com/page/software_overview_ib下载tgz格式的MOFED软件包,然后运行以下步骤:

 
# tar -xvf MLNX_OFED_LINUX-DISTRO.VERSION
# cd MLNX_OFED_LINUX-DISTRO.VERSION/
# run ./mlnxofedinstall --add-kernel-support --skip-repo  (注意:在安装MLNX_OFED之前,请查看各种安装选项)
  
// Rebuild lustre:
    ./configure --with-linux=/usr/src/kernels/3.10.0-514.10.2.el7_lustre.x86_64/ --with-o2ib=/usr/src/ofa_kernel/default
    make rpms 

配置示例

LNet路由器配置指南2.png 接下来介绍详细指令集,用于根据上图所示网络拓扑结构,配置Lustre客户端、Lustre服务器和LNet路由器。在执行以下步骤之前,请确保在Lustre客户端和Lustre路由器上已经安装了Lustre客户端软件,在Lustre服务器上安装了Lustre服务软件,安装软件的地址为 https://downloads.hpdd.intel.com/public/lustre/latest-release/


配置Lustre客户端

根据上图中的拓扑配置Lustre客户端,应运行以下命令:

 
#modprobe lnet
#lnetctl lnet configure
#lnetctl net add --net o2ib1 --if ib1
#lnetctl route add --net o2ib --gateway 192.168.5.152@o2ib1
#lnetctl net show --verbose
net:
    - net type: lo
      local NI(s):
        - nid: 0@lo
          status: up
          statistics:
              send_count: 0
              recv_count: 0
              drop_count: 0
          tunables:
              peer_timeout: 0
              peer_credits: 0
              peer_buffer_credits: 0
              credits: 0
          lnd tunables:
              peercredits_hiw: 64
              map_on_demand: 32
              concurrent_sends: 256
              fmr_pool_size: 2048
              fmr_flush_trigger: 512
              fmr_cache: 1
          tcp bonding: 0
          dev cpt: 0
          CPT: "[0,0,0,0]"
    - net type: o2ib1
      local NI(s):
        - nid: 192.168.5.151@o2ib1
          status: up
          interfaces:
              0: ib1
          statistics:
              send_count: 0
              recv_count: 0
              drop_count: 0
          tunables:
              peer_timeout: 180
              peer_credits: 8
              peer_buffer_credits: 0
              credits: 256
          lnd tunables:
              peercredits_hiw: 64
              map_on_demand: 32
              concurrent_sends: 256
              fmr_pool_size: 2048
              fmr_flush_trigger: 512
              fmr_cache: 1
          tcp bonding: 0
          dev cpt: 0
          CPT: "[0,0,0,0]"
 
#lnetctl route show --verbose
route:
    - net: o2ib
    gateway: 192.168.5.152@o2ib1
    hop: 1
    priority: 0
    state: up 

要使上述配置永久化,请运行以下命令:

#lnetctl export > /etc/sysconfig/lnet.conf
#echo ‘‘o2ib: { gateway: 192.168.5.152@o2ib1 }’’ > /etc/sysconfig/lnet_routes.conf
#systemctl enable lnet 

配置LNet路由器

请确保/etc/modprobe.d/koblnd.conf文件已用下列设置更新。在脚本 /usr/sbin/ko2iblnd-probe中,仅当它使用了选项ko2iblnd-opa时是用来检测OPA卡,否则默认检测MLX卡。

alias ko2iblnd-opa ko2iblnd
options ko2iblnd-opa peer_credits=128 peer_credits_hiw=64 credits=1024 concurrent_sends=256 ntx=2048 map_on_demand=32
fmr_pool_size=2048 fmr_flush_trigger=512 fmr_cache=1 conns_per_peer=4
install ko2iblnd /usr/sbin/ko2iblnd-probe 

根据上图中的拓扑配置LNet路由器,应运行以下命令:

#modprobe lnet
#lnetctl lnet configure
#lnetctl net add --net o2ib1 --if ib1
#lnetctl net add --net o2ib --if ib0
#lnetctl set routing 1
  
#lnetctl net show --verbose
net:
    - net: lo
    local NI(s):
        - nid: 0@lo
          status: up
          statistics:
              send_count: 0
              recv_count: 0
              drop_count: 0
          tunables:
              peer_timeout: 0
              peer_credits: 0
              peer_buffer_credits: 0
              credits: 0
          lnd tunables:
              peercredits_hiw: 64
              map_on_demand: 32
              concurrent_sends: 256
              fmr_pool_size: 2048
              fmr_flush_trigger: 512
              fmr_cache: 1
              conns_per_peer: 4
          tcp bonding: 0
          dev cpt: 0
          CPT: "[0,0,0,0]"
    - net: o2ib
    local NI(s):
        - nid: 192.168.3.104@o2ib
          status: up
          interfaces:
              0: ib0
          statistics:
              send_count: 0
              recv_count: 0
              drop_count: 0
          tunables:
              peer_timeout: 180
              peer_credits: 8
              peer_buffer_credits: 0
              credits: 256
          lnd tunables:
              peercredits_hiw: 64
              map_on_demand: 32
              concurrent_sends: 256
              fmr_pool_size: 2048
              fmr_flush_trigger: 512
              fmr_cache: 1
              conns_per_peer: 4
          tcp bonding: 0
          dev cpt: 0
          CPT: "[0,0,0,0]"
    - net type: o2ib1
    local NI(s):
        - nid: 192.168.5.152@o2ib1
          status: up
          interfaces:
              0: ib1
          statistics:
              send_count: 0
              recv_count: 0
              drop_count: 0
          tunables:
              peer_timeout: 180
              peer_credits: 8
              peer_buffer_credits: 0
              credits: 256
          lnd tunables:
              peercredits_hiw: 64
              map_on_demand: 32
              concurrent_sends: 256
              fmr_pool_size: 2048
              fmr_flush_trigger: 512
              fmr_cache: 1
              conns_per_peer: 4
          tcp bonding: 0
          dev cpt: 0
          CPT: "[0,0,0,0]"  

/etc/modprobe.d/ko2iblnd.conf中的参数设置是全局有效的,适用于节点中的所有驱动程序。如果上述可调参数同时用于OPA和MLX,MLX性能会下降5-10%。因此,如果需要的话,MLX卡的设置可以使用动态LNet配置( DLC )进行更改。

在Lustre 2.10.X版本中,多NIs都可以使用它们唯一的可调参数进行配置。为此,MLX卡的可调参数可以在lnet.conf中编辑,如下所示:

- net type: o2ib
  local NI(s):
    - nid: 192.168.3.104@o2ib
      status: up
      interfaces:
          0: ib0
      tunables:
          peer_timeout: 180
          peer_credits: 8
          peer_buffer_credits: 0
          credits: 256
      lnd tunables:
          peercredits_hiw: 4
          map_on_demand: 0
          concurrent_sends: 8
          fmr_pool_size: 512
          fmr_flush_trigger: 384
          fmr_cache: 1
          conns_per_peer: 1
      tcp bonding: 0
      dev cpt: 0
      CPT: "[0,0,0,0]" 

在系统启动时启用配置:

#systemctl enable lnet 

配置Lustre服务器

要配置Lustre服务器(基于Infiniband),请运行以下命令:

#modprobe lnet
#lnetctl lnet configure
#lnetctl net add --net o2ib --if ib0
#lnetctl route add --net o2ib1 --gateway 192.168.3.104@o2ib
#lnetctl net show --verbose
net:
    - net: lo
    local NI(s):
        - nid: 0@lo
          status: up
          statistics:
              send_count: 0
              recv_count: 0
              drop_count: 0
          tunables:
              peer_timeout: 0
              peer_credits: 0
              peer_buffer_credits: 0
              credits: 0
          lnd tunables:
              peercredits_hiw: 4
              map_on_demand: 0
              concurrent_sends: 8
              fmr_pool_size: 512
              fmr_flush_trigger: 384
              fmr_cache: 1
              conns_per_peer: 1
          tcp bonding: 0
          dev cpt: 0
          CPT: "[0,0,0,0]"
    - net: o2ib
    local NI(s):
        - nid: 192.168.3.106@o2ib
          status: up
          interfaces:
              0: ib0
          statistics:
              send_count: 0
              recv_count: 0
              drop_count: 0
          tunables:
              peer_timeout: 180
              peer_credits: 8
              peer_buffer_credits: 0
              credits: 256
          lnd tunables:
              peercredits_hiw: 4
              map_on_demand: 0
              concurrent_sends: 8
              fmr_pool_size: 512
              fmr_flush_trigger: 384
              fmr_cache: 1
              conns_per_peer: 1
          tcp bonding: 0
          dev cpt: 0
          CPT: "[0,0,0,0]"
  
#lnetctl route show --verbose
route:
    - net: o2ib1
    gateway: 192.168.3.104@o2ib
    hop: 1
    priority: 0
    state: up