Skip to main content
开放网络的先行者与推动者—星融元
加入我们技术支持(Support)  TEL:(+86)4000989811

安装指导-基于Proxmox VE的安装部署和性能测试

1 目标

本文档将简要介绍Proxmox VE基本概念,并使用PVE进行集群部署以及功能验证。

2 概要介绍

2.1 关于Proxmox VE

Proxmox VE (Virtual Environment) 是一个开源的虚拟化平台,它基于 Debian GNU/Linux 发行版,并集成了 KVM (Kernel-based Virtual Machine) 和 LXC (Linux Containers) 两种虚拟化技术,提供了一套完整的虚拟化解决方案。以下为PVE架构图:

PVE架构

图1.1:PVE架构

由以下几个组件构成:

  1. Proxmox VE管理界面:提供了易于使用的Web界面,用于管理虚拟机、容器、存储、网络和集群等。
  2. KVM虚拟化:Proxmox VE基于Linux内核虚拟机(KVM)技术实现了完整的虚拟化,并支持Windows和Linux等操作系统的虚拟化。
  3. LXC容器:Proxmox VE支持Linux容器(LXC)技术,可以在同一物理主机上运行多个隔离的Linux容器,从而提供更高的资源利用率和更快的启动时间。
  4. 存储管理:Proxmox VE支持多种存储类型,包括本地存储、网络存储(NFS、iSCSI、FC)、对象存储(Ceph、Swift)等,可以通过Web界面方便地管理存储池、卷和镜像等。
  5. 网络管理:Proxmox VE支持多种网络模式,包括桥接、NAT、VLAN、OpenvSwitch等,可以通过Web界面方便地管理虚拟网络接口、虚拟交换机和虚拟网络等。
  6. 集群管理:Proxmox VE支持多台物理主机组成的集群,可以通过Web界面方便地管理节点、HA、负载均衡等。
  7. API:Proxmox VE提供RESTful API,可以通过API方便地进行自动化管理和集成。

2.2 功能特性与ESXi对比

功能/特性Proxmox VEESXi
许可证费用开源免费商业许可证
支持的虚拟化技术KVM, LXCVMware 虚拟化技术
界面和管理工具Web 界面管理工具客户端界面
高可用性 (HA)支持支持
备份与恢复完整备份和恢复方案,包括快照完整备份和恢复方案,包括快照
存储管理多种存储管理方式,包括本地存储、NFS、iSCSI 和 Ceph 等多种存储管理方式,包括本地存储、NFS、iSCSI 和 Fibre Channel 等
网络管理多种网络管理方式,包括 NAT、桥接和 VLAN 等多种网络管理方式,包括 NAT、桥接和 VLAN 等
安全性基于角色的用户访问控制、防火墙和 TLS 加密等基于角色的用户访问控制、防火墙和 TLS 加密等
社区支持活跃的社区支持和开发者社区有活跃的用户和支持社区
表2.1:功能对比

3 配置

3.1 最小硬件配置

  • CPU要求为Intel EMT64或AMD64,需要支持Intel VT/AMD-V虚拟化。
  • 内存不低于2GB,以确保操作系统和Proxmox VE服务正常运行。如需运行虚拟机,需相应增加更多内存。如需运行Ceph或ZFS,还需要增配内存,大概1TB存储空间增加1GB内存。
  • 高性能高冗余存储资源,最好使用SSD盘。
  • 操作系统盘:带有电池保护缓存的硬RAID卡,没有硬RAID卡时可以使用带有SSD缓存的ZFS。
  • 虚拟机存储:本地磁盘可以采用带有电池保护缓存的硬RAID卡,或不带硬RAID卡的ZFS。ZFS和Ceph都不能和硬RAID控制器同时使用。也可以共享分布式存储。
  • 多块千兆网卡。根据所用存储技术和集群配置,可以选配更多网卡。也可使用10Gbit或更高速网卡。
  • 如需使用PCI直通,必须采用支持VT-d/AMD-d的CPU。

3.2 推荐系统硬件配置

  • CPU:64位(Intel EMT64或AMD64),推荐使用多核CPU。
  • CPU和主板需要支持Intel VT/AMD-V技术,以便支持KVM全虚拟化功能。
  • 内存:8GB,如果要运行虚拟机则应配置更多硬RAID卡,带有电池保护(BBU)或闪存保护的写缓存。
  • 性能硬盘,最好是15k转速的SAS盘,配置成Raid10。
  • 最少2块以太网卡,也根据采用的共享存储技术配置更多网卡。

3.3 软件源配置

默认情况下,PVE是企业订阅源,并且每次登录有订阅通知窗口,需要去除弹窗,并且将软件源更改为国内源。

订阅提示
vi /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js
将if(data.status!==’Active’)修改为 if(false)

cat >/etc/apt/sources.list <<EOF
deb https://mirrors.ustc.edu.cn/debian bookworm main contrib
deb https://mirrors.ustc.edu.cn/debian bookworm-updates main contrib
# security updates
deb https://mirrors.ustc.edu.cn/debian-security bookworm-security main contrib
deb http://download.proxmox.com/debian bookworm pve-no-subscription
EOF

echo "deb http://mirrors.ustc.edu.cn/proxmox/debian/ceph-pacific bullseye main
" > /etc/apt/sources.list.d//ceph.list

rm pve-enterprise.list

echo "deb https://mirrors.ustc.edu.cn/proxmox/debian/pve bookworm pve-no-subscription">/etc/apt/sources.list.d/pve -no-subscription.list

apt-get update && apt-get upgrade -y

3.4 网络配置

3.4.1 基于网桥的默认配置

网桥相当于一个软件实现的物理交换机。所有虚拟机共享一个网桥,在多个域的网络环境中,也可以创建多个网桥以分别对应不同网络域。理论上,每个Proxmox VE最多可以支持4094个网桥。 Proxmox VE安装程序会创建一个名为vmbr0的网桥,并和检测到的服务器第一块网卡桥接。配置文件/etc/network/interfaces中的对应配置信息如下:

auto lo
iface lo inet loopback

iface ens160 inet manual

auto vmbr0
iface vmbr0 inet static
        address 10.240.4.148/24
        gateway 10.240.4.1
        bridge-ports ens160
        bridge-stp off
        bridge-fd 0

iface ens192 inet manual

3.4.2 路由配置

大部分IPC服务器供应商不支持基于网桥的默认配置方式,出于网络安全的考虑,一旦发现网络接口上有多个MAC地址出现,则会立刻禁用相关网络端口。
可以通过配置“路由”的方式让多个虚拟机共享一个网络端口,对方通信使用同一个MAC地址。

auto lo
iface lo inet loopback

auto eno1
iface eno1 inet static
address 192.51.100.5
netmask 255.255.255.0
gateway 192.51.100.1
post-up echo 1 > /proc/sys/net/ipv4/ip_forward 
post-up echo 1 > /proc/sys/net/ipv4/conf/eno1/proxy_arp

auto vmbr0
iface vmbr0 inet static
address 203.0.113.17
netmask 255.255.255.248
bridge_ports none
bridge_stp off
bridge_fd 0

3.4.3 网络地址转换(NAT)

利用地址转换技术,所有虚拟机可以使用内部私有IP地址,并通过Proxmox VE服务器的IP来访问外部网络。Iptables将改写虚拟机和外部网络通信数据包,对于虚拟机向外部网络发出的数据包,将源IP地址替换成服务器IP地址,对于外部网络返回数据包,将目的地址替换为对应虚拟机IP地址。配置如下:

auto lo
iface lo inet loopback

auto eno1
#real IP address
iface eno1 inet static
address 192.51.100.5
netmask 255.255.255.0
gateway 192.51.100.1

auto vmbr0
#private sub network
iface vmbr0 inet static
address 10.10.10.1
netmask 255.255.255.0
bridge_ports none
bridge_stp off
bridge_fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s ’10.10.10.0/24’ -o eno1 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s ’10.10.10.0/24’ -o eno1 -j MASQUERADE

3.4.4 多网口绑定

多网口绑定(也称为网卡组或链路聚合)是一种将多个网卡绑定成单个网络设备的技术。利用该技术可以实现某个或多个目标,例如提高网络链路容错能力,增加网络通信性能等。配置如下:

auto lo
iface lo inet loopback

iface eno1 inet manual

iface eno2 inet manual

auto bond0
iface bond0 inet static
slaves eno1 eno2
address 192.168.1.2
netmask 255.255.255.0
bond_miimon 100
bond_mode 802.3ad
bond_xmit_hash_policy layer2+3

auto vmbr0
iface vmbr0 inet static
address 10.10.10.2
netmask 255.255.255.0
gateway 10.10.10.1
bridge_ports eno1
bridge_stp off
bridge_fd 0

4 集群配置

4.1 创建集群

4.1.1 通过Web创建集群

在“数据中心”→“集群”下,单击创建集群。输入集群名称,然后从下拉列表中选择一个网络连接作为主集群网络(Link 0)。然后点击“加入信息”按钮,复制Information字符串,接下来,登录到要添加的节点上的Web界面。在“数据中心→集群”下,单击“加入集群”。用之前复制的“加入信息”文本填写Information字段。

4.1.2 命令行创建

# 创建集群的主机
pvecm create CLUSTERNAME
# 待加入集群的主机
pvecm add IP-ADDRESS-CLUSTER

4.2 Qemu/KVM虚拟机

Proxmo VE优先使用半虚拟化硬件,相比于虚拟化硬件(以软件模拟方式实现虚拟化硬件)性能更高。Qemu的半虚拟化硬件采用了virtio标准,并以virtio半虚拟化硬件形式实现。
虚拟机通用配置包括:

  • 节点:虚拟机所处的物理服务器名。
  • VM ID:Proxmox VE用于标识虚拟机的一个唯一编号。
  • 名称:虚拟机名称,用户描述虚拟机的字符串。
  • 资源池:虚拟机所处的逻辑组。

4.2.1 系统

创建虚拟机时可以修改虚拟机的部分系统配置如下图所示,可以更改SCSI控制器类型,如上面所述一般为了性能选择VirtIO SCSI single,对于不支持VirtIO的虚拟机系统,需要手动安装VirtIO驱动。

PVE dashboard01

图3.2:PVE dashboard01

4.2.2 硬盘

追求最极致的性能,可以选用VirtIO SCSI single,并启用IO Thread选项。在选用VirtIO SCSI single时,Qemu将为每个虚拟磁盘创建一个专用控制器,而不是让所有磁盘共享一个控制器。

虚拟硬盘的Cache模式设置会影响Proxmox VE主机系统向虚拟机操作系统返回数据块写操作完成通知的时机。设置为No cache是指在所有数据块都已写入物理存储设备写队列后,再向虚拟机发出写操作完成通知,而忽略主机页缓存机制。该方式将能较好地平衡数据安全性和写入性能。

Discard指令允许操作系统在SSD上将不再使用的数据通知到SSD底层并在其内部将数据擦除掉。

图3.3:PVE dashboard02

图3.3:PVE dashboard02

4.2.3 CPU

需要确保虚拟机的在线迁移能力,最好使用默认的kvm64虚拟CPU。如果不在乎在线迁移,或者集群内所有节点硬件型号完全一样,可以设置虚拟CPU类型为host,以获得最好的性能。

如果所有 VM 的内核总数大于服务器上的核心数(例如,在只有 8 个内核的计算机上有 4 个 VM,每个 4 个内核),则是完全安全的。在这种情况下,主机系统将在服务器内核之间平衡 Qemu 执行线程,就像运行标准的多线程应用程序一样。但是,Proxmox VE 将阻止启动虚拟 CPU 内核数多于物理可用内核的虚拟机,因为这只会由于上下文切换的成本而降低性能。

PVE dashboard03

图3.4:PVE dashboard03

4.2.4 内存

当设置内存容量和最小内存容量为相同值时,Proxmox VE将为虚拟机分配固定容量内存。即使使用固定容量内存,也可以在虚拟机启用ballooning设备,以监控虚拟机的实际内存使用量。

当设置的最小内存容量低于设置的内存容量值时,Proxmox VE将为虚拟机至少分配设置的最小容量内存,并在物理服务器内存占用率达到80%之前根据虚拟机需要动态分配内存,直到达到设置的最大内存分配量。当物理服务器内存不足时,Proxmox VE将开始回收分配给虚拟机的内存,并在必要时启动SWAP分区,如果仍然不能满足需要,最终将启动oom进程杀掉部分进程以释放内存。物理服务器和虚拟机之间的内存分配和释放通过虚拟机内的balloon驱动完成,该驱动主要用于从主机抓取或向主机释放内存页面。

PVE dashboard04

图3.5:PVE dashboard04

4.3 防火墙配置

PVE有3种防火墙:

  1. 面对数据中心的防火墙:处理流出流入数据中心的流量。
    集群防火墙规则是应用于整个Proxmox VE集群的防火墙规则。这些规则通常由集群管理员配置,用于限制集群中所有主机和虚拟机的网络访问。集群防火墙规则是在集群中所有主机的防火墙规则之前生效的。
    只有数据中心防火墙开启,才能开启集群内的防火墙,否则单独开启VM的防火墙是无效的。
  2. 面对虚拟化服务器的防火墙:处理主机的流量。
    主机防火墙规则是应用于单个Proxmox VE主机的防火墙规则。这些规则通常由主机管理员配置,用于限制主机上所有虚拟机和容器的网络访问。主机防火墙规则是在虚拟机防火墙规则之前生效的。
    这个防火墙的开关,不会影响VM的防火墙,所以要开启VM的防火墙,不必须开启这个防火墙,不同于数据中心防火墙
  3. 面对VM的防火墙:处理VM流出流出的流量。
    虚拟机防火墙规则是应用于单个Proxmox VE虚拟机或容器的防火墙规则。这些规则通常由虚拟机管理员配置,用于限制虚拟机或容器的网络访问。虚拟机防火墙规则是在主机防火墙规则之后生效的。
    总体来说,防火墙规则是按照集群规则、主机规则、虚拟机规则的顺序依次生效的。当一个数据包到达一个Proxmox VE虚拟机或容器时,首先会检查虚拟机的防火墙规则,如果没有匹配的规则,则检查主机的防火墙规则,最后检查集群的防火墙规则。如果在任意一层中找到了匹配的规则,则该数据包将被允许或拒绝。

每个虚拟网卡设备都有一个防火墙启用标识。可以控制每个网卡的防火墙启用状态。在设置启用虚拟机防火墙后,必须设置网卡上的防火墙启用标识才可以真正启用防火墙。

PVE dashboard05

图3.6:PVE dashboard05

4.3.1 GUI防火墙配置

  • 防火墙规则(Firewall Rules):防火墙规则定义了应该允许还是阻止的流量类型。规则可以基于源和目标IP、协议类型(如TCP、UDP、ICMP等)、源和目标端口等因素进行定义。规则的顺序非常重要,因为Proxmox VE防火墙会按照规则的顺序进行匹配,并在匹配到的第一个规则处停止。
  • 安全组(Security Groups):安全组是一组预定义的防火墙规则,可以应用于一个或多个虚拟机或容器。
  • IP集(IPSet):IPSet是一种可以匹配一组网络地址、网络端口或其他网络参数的机制。它可以用于创建复杂的、高效的防火墙规则。
  • 日志和审计(Logging and Auditing):Proxmox VE防火墙提供了详细的日志和审计功能,可以跟踪和记录防火墙的活动,包括被阻止的连接、被允许的连接等。
PVE dashboard06

图3.7:PVE dashboard06

4.3.2 配置文件

  • 数据中心防火墙
/etc/pve/firewall/cluster.fw
[OPTIONS]
该小节用于设置整个集群的防火墙配置项。

ebtables: <boolean> (default = 1)
集群范围内启用ebtables。

enable: <integer> (0 -N)
启用/禁用集群范围的防火墙。

log_ratelimit: [enable=]<1|0> [,burst=<integer>] [,rate=<rate>]
设置日志记录速度阀值。

burst=<integer> (0 - N) (default = 5)
将被记录的初始突发包。

enable=<boolean> (default = 1)
启用或禁用阀值

rate=<rate> (default = 1/second)
突发缓冲区重新填充频度。

policy_in: <ACCEPT | DROP | REJECT>
流入方向的防火墙策略。

policy_out: <ACCEPT | DROP | REJECT>
流出方向的防火墙策略。

[RULES]
该小节用于设置所有节点公共的防火墙策略。

[IPSET <name>]
整个集群范围内有效的IP集合定义。

[GROUP <name>]
整个集群范围内有效的组定义。

[ALIASES]
整个集群范围内有效的别名定义
  • 主机防火墙
/etc/pve/nodes/<nodename>/host.fw
[OPTIONS]
该小节用于设置当前主机的防火墙配置项。

enable: <boolean>
启用/禁用主机防火墙策略。

log_level_in: <alert | crit | debug | emerg | err | info | nolog | notice | warning>
流入方向的防火墙日志级别。

log_level_out: <alert | crit | debug | emerg | err | info | nolog | notice | warning>
流出方向的防火墙日志级别。

log_nf_conntrack: <boolean> (default = 0)
启用记录连接跟踪信息。

ndp: <boolean>
启用NDP。 

nf_conntrack_allow_invalid: <boolean> (default = 0)
在跟踪连接时允许记录不合法的包。

nf_conntrack_max: <integer> (32768 -N)
最大的跟踪连接数量。

nf_conntrack_tcp_timeout_established: <integer> (7875 -N)
反向连接建立超时时间。

nosmurfs: <boolean>
启用SMURFS过滤器。

smurf_log_level: <alert | crit | debug | emerg | err | info | nolog | notice | warning>
SMURFS过滤器日志级别。

tcp_flags_log_level: <alert | crit | debug | emerg | err | info | nolog | notice | warning>
非法TCP标志过滤器日志级别。

tcpflags: <boolean>
启用非法TCP标志组合过滤器。

[RULES]
该小节用于设置当前主机的防火墙策略。
  • VM和LXC的防火墙
/etc/pve/firewall/<VMID>.fw
[OPTIONS]
该小节用于设置当前虚拟机或容器的防火墙配置项。

dhcp: <boolean>
启用DHCP。

enable: <boolean>
启用/禁用防火墙策略。

ipfilter: <boolean>
启用默认IP地址过滤器。相当于为每个网卡接口增加一个空白的ipfilter-net<id>地址集合。
该IP地址集合隐式包含了一些默认控制,例如限制IPv6链路本地地址为网卡MAC生成的地址。对于容器,配置的IP地址将被隐式添加进去。

log_level_in: <alert | crit | debug | emerg | err | info | nolog | notice | warning>
流入方向的防火墙日志级别。

log_level_out: <alert | crit | debug | emerg | err | info | nolog | notice | warning>
流出方向的防火墙日志级别。

macfilter: <boolean>
启用/禁用MAC地址过滤器。

ndp: <boolean>
启用NDP。

policy_in: <ACCEPT | DROP | REJECT>
流入方向的防火墙策略。

policy_out: <ACCEPT | DROP | REJECT>
流出方向的防火墙策略。

radv: <boolean>
允许发出路由通知。

[RULES]
该小节用于设置当前虚拟机或容器的防火墙策略。

[IPSET <name>]
IP集合定义。

[ALIASES]
IP地址别名定义。

5 安装硬件开发部所需云环境实践

5.1 需求

需要安装15台虚拟机,并且所有虚拟机按照一定的规则能否挂载smb,并且Windows1对外访问以及对内访问没有限制,剩下的14台服务器不能访问外部网络,仅与宿主机和Windows1之间通信。

5.2 规划

宿主机服务器配置:amd 16核32线程处理器,128g内存,8T*2硬盘;宿主机网络配置为网桥模式, IP为192.168.52.200/24,网关为192.168.52.1。

虚拟机VMIDIP规格
Windows1100192.168.52.20116c16G
Windows2101192.168.52.2028C16G
Windows3102192.168.52.2038C16G
Windows4103192.168.52.2048C16G
Windows5104192.168.52.2058C16G
Windows6105192.168.52.2068C16G
Windows7106192.168.52.2078C16G
Windows8107192.168.52.2088C16G
Windows9108192.168.52.2098C16G
Windows10109192.168.52.2108C16G
Windows11110192.168.52.2118C16G
Windows12111192.168.52.2128C16G
Windows13112192.168.52.2138C16G
Windows14113192.168.52.2148C16G
Windows15114192.168.52.2158C16G
表4.1:虚拟机规划表

5.3 准备安装介质

官方网站下载最新版本的ISO镜像:Get the free Proxmox VE ISO installer(8.0.2),然后使用rufus将PVE镜像刻录到u盘后,在服务器以u盘方式引导启动。

下载Windows镜像,准备VirtIO驱动

5.4 安装PVE

  • 选择Install Proxmox VE(Graphical)。
PVE安装步骤

图4.1:PVE安装步骤01

  • 选择PVE安装的硬盘。
PVE安装步骤

图4.2:PVE安装步骤02

  • 设定时区。
PVE安装步骤

图4.3:PVE安装步骤03

  • 设置密码——既是Web登录密码也是服务器密码。
PVE安装步骤

图4.4:PVE安装步骤04

  • 配置FQDN以及IP地址,此处FQDN的第一部分为host名,如果安装集群的话,需要注意host不能冲突,否则集群无法加入,到此变安装完成, PVE的Web界面http://IP:8006/
PVE安装步骤

图4.5:PVE安装步05

5.5 安装Windows虚拟机

5.5.1 上传镜像到PVE

  • 登录Proxmox VE,在左边资源树中选择 local 存储 – 切换至 ISO Images – Upload。
VE镜像面板01

图4.6:PVE镜像面板01

  • 将Windows和VirtIO镜像上传上去。
PVE镜像面板

图4.7:PVE镜像面板02

  • 不能关闭上传页面否则上传失败。
PVE镜像面板03

图4.8:PVE镜像面板03

  • 上传完成后的结果。
PVE镜像面板04

图4.9:PVE镜像面板04

5.5.2 创建虚拟机

  • 在Proxmox VE界面的右上方 – 点击 Create VM。
图4.10:PVE VM创建01

图4.10:PVE VM创建01

  • General菜单这边配置好VMID以及Name。
图4.11:PVE VM创建02

图4.11:PVE VM创建02

图4.12:PVE VM创建03

图4.12:PVE VM创建03

  • System注意SCSI Controller选择VirtIO SCSI single。
图4.13:PVE VM创建04

图4.13:PVE VM创建04

  • Disks,选择VirtIO Block。
图4.14:PVE VM创建05

图4.14:PVE VM创建05

  • CPU这边Type选择host便于更好的性能,而KVM则是兼容性更好,规格的话按照之前规划配置。
图4.15:PVE VM创建06

图4.15:PVE VM创建06

  • Memory,由于所有虚拟机内存加起来超过宿主机内存,这边手动设置其最小内存,并且开启Ballooning,如3.6.4所述。
图4.16:PVE VM创建07

图4.16:PVE VM创建07

  • Network,Model选择VirtIO
图4.17:PVE VM创建08

图4.17:PVE VM创建08

  • 最后确认。
图4.18:PVE VM创建09

图4.18:PVE VM创建09

  • 附加驱动:切换到 Hardware – Add – CD/DVD Drive。
图4.19:PVE VM创建10

图4.19:PVE VM创建10

图4.19:PVE VM创建10

图4.19:PVE VM创建10

  • 然后开启,安装Windows系统,在磁盘这边,无法看到磁盘,则需要安装VirtIO驱动。
图4.21:驱动安装01

图4.21:驱动安装01

  • 安装驱动,浏览驱动文件位置——>选择 CD驱动器 virtio-win-0.1.221 – amd64 – w10,确定。
图4.23:驱动安装03

图4.22:驱动安装02

此时可以识别到硬盘

图4.23:驱动安装03

图4.23:驱动安装03

  • Windows系统安装完成后,很多驱动未安装,打开:资源管理器 – CD驱动器 virtio-win-0.1.221 文件夹,双击“virtio-win-guest-tools”进行安装。
图4.24:驱动安装04

图4.24:驱动安装04

图4.25:驱动安装05

图4.25:驱动安装05

至此安装完成,然后按照规划配置网络即可

  • 克隆虚拟机,以VM100为模板克隆出剩下的虚拟机,完成后,修改硬件规格配置,以及网络配置。
图4.26:虚拟机clone

图4.26:虚拟机clone

5.6 配置防火墙

  • 开启集群防火墙,允许所有内部虚拟机对外访问,并且允许外部ssh登录,访问80以及8006端口。
vi /etc/pve/firewall/cluster.fw [OPTIONS]

enable: 1

[RULES]

OUT ACCEPT -source 192.168.52.0/24 -log nolog
IN ACCEPT -i vmbr0 -p tcp -dport 80 -log nolog
IN ACCEPT -i vmbr0 -p tcp -dport 8006 -log nolog
IN SSH(ACCEPT) -i vmbr0 -log nolog
  • 配置Windows1防火墙,默认允许任何流量通过。
vi /etc/pve/firewall/100.fw
[OPTIONS]

enable: 1
policy_in: ACCEPT

[RULES]

OUT ACCEPT -log nolog
IN ACCEPT -log nolog
  • 配置Windows2-15防火墙,仅允许宿主机和windows1的流量流出流出。
vi /etc/pve/firewall/101.fw
[OPTIONS]

policy_in: REJECT
enable: 1
policy_out: ACCEPT

[RULES]

OUT ACCEPT -dest 192.168.52.201 -log nolog
OUT ACCEPT -dest 192.168.52.200 -log nolog
IN ACCEPT -source 192.168.52.201 -log nolog
IN ACCEPT -source 192.168.52.200 -log nolog

for (( i=101;i<115;i++ ));do cp $i.fw $i+1.fw;done

至此,所有虚拟机安装配置完成。

6 性能测试——使用pveperf进行测试

12345
cpu bogomips179214.72179214.72179214.72179214.72179214.72
regex/second32796603261539324982432231213263534
HD SIZE93.93 GB93.93 GB93.93 GB93.93 GB93.93 GB
BUFFERED READS188.33 MB/sec138.38 MB/sec134.17 MB/sec71.99 MB/sec
154.62 MB/sec
154.62 MB/sec
AVERAGE SEEK TIME9.15 ms19.01 ms12.30 ms27.26 ms23.27ms
FSYNCS/SECOND9.9533.4119.3029.4727.98
DNS EXT589.30 ms595.68 ms351.61 ms627.83 ms221.95 ms
DNS INT367.15 ms (PVE)594.21 ms (PVE)289.67 ms (PVE)317.43 ms (PVE)504.87 ms (PVE)
表6.1:性能测试结果
  • cpu bogomips:是一个基于时钟计数的测试,用于衡量系统CPU的性能。Proxmox VE的性能要求会随着使用场景和负载的不同而有所变化,但通常来说,CPU BOGOMIPS的值应该在100000以上。
  • regex/second: 每秒处理的正则表达式,通常该值应 >300000。
  • HD SIZE: 测试盘的大小,表中为系统盘,这个值与系统性能无关。
  • BUFFERED READS:缓存读取速度,是一个简单的硬盘读取测试指标,用于衡量硬盘的读取速度。现代硬盘的读取速度应该达到40MB/s以上。
  • AVERAGE SEEK TIME: (磁盘)平均巡道时间,是一个测试硬盘平均寻道时间的指标,用于衡量硬盘的读取速度。快速的SCSI硬盘的平均寻道时间可以达到小于8ms的值,而常见的IDE/SATA硬盘的平均寻道时间大概在15到20ms之间。
  • FSYNCS/SECOND: 一个文件系统同步操作的速度指标,用于衡量系统执行写入操作的性能。它反映了文件系统写入操作的速度,即文件系统将数据从内存缓存同步到磁盘的速度,对该值的最低要求是>200。

由于目前仅有两块机械硬盘且其中一块用作了samba,导致无法做raid,并且也无法使用WriteBack模式。

在WriteBack模式下,写操作会先被写入到主机页面缓存中——即写入脏页。当内存负载太高,需要回收内存,那么脏页可能将数据写入硬盘,或者达到了脏页的回收时间,那么也可以将脏页数据写入到硬盘,此时数据才算完整被写入。所以写入和读取都非常的高。

在没有writeback的模式下,结果如下:

root@aster:/tmp# grep -i "^cache\|dirty\|writeback:" /proc/meminfo
Cached:           392152 kB  是用于读取缓存的内存量。
Dirty:                20 kB    它表示要写入(即:已更改)的内存量。要回收此内存,系统必须将更改写出到磁盘。这意味着,根据底层IO子系统,脏页面回收可能会很慢。
Writeback:             0 kB    它是系统当前写入磁盘的内存量,这是内存负载(和脏页回收)和计时回收(最多30秒后,脏页被写回磁盘)的数据
  • DNS EXT:外部DNS 解析时间,的响应时间应该在100ms以下。
  • DNS INT: 内部DNS 解析时间,的响应时间应该在100ms以下。

根据五次pveperf脚本基准测试结果表明,目前服务器的CPU能够满足PVE性能要求,并且硬盘的读取速度也满足系统需求,但文件系统将数据从内存缓存同步到磁盘的速度不太理想,可以通过更换硬盘为更高写入速度的硬盘或者增加硬盘做硬raid来提升性能;网络方面DNS解析时间过长,可能会造成可能会导致客户端频繁发出DNS请求,并且访问网络资源的速度变慢。

7 参考资料

【1】Proxmox VE Administartion Guide
【2】Proxmox中文文档
【3】OVH Server benchmark
【4】Proxmox VE磁盘WriteBack性能调优和注意事项
【5】PVE开启硬件直通功能

配置指导:开源AAA解决方案 —FreeRADIUS

1 目标

2 环境介绍

2.1 硬件环境

2.2 软件环境

3 组网拓扑

4 交互流程

5 RADIUS服务器配置

5.1 添加NAS设备账号

5.2 添加终端用

6 交换机配置

6.1 接入RADIUS服务器

6.2 确认配置结果

7 结果验证

1 目标

本文档主要讲解如何使用Asterfusion CX-M系列云园区交换机和daloRADIUS进行配置组网,实现一个拥有AAA能力的园区网络。

关于园区网和daloRADIUS的配置部署,请参考《部署手册-开源AAA解决方案-FreeRADIUS》。

2 环境介绍

2.1 硬件环境

表1:硬件环境
表1:硬件环境

2.2 软件环境

表2:软件环境
表2:软件环境

3 组网拓扑

图1:组网拓扑
图1:组网拓扑

4 交互流程

图2:RADIUS认证、授权和计费流程
图2:RADIUS认证、授权和计费流程

5 RADIUS服务器配置

# 确认Radius服务正常运行

确认Radius服务正常运行

# 服务配置目录

# 服务配置目录

5.1 添加NAS设备账号

5.1添加NAS设备账号

5.2 添加终端用户

图3:在Web页面上创建终端用户user03
图3:在Web页面上创建终端用户user03
图4:在用户管理页面,确认用户添加成功
图4:在用户管理页面,确认用户添加成功

6 交换机配置

6.1 接入RADIUS服务器

leaf03# configure terminal                                                                                                                                                        
leaf03(config)# dot1x enable
leaf03(config)# dot1x radius-server 172.24.22.4 asteros source 172.24.20.17
leaf03(config)# dot1x radius-server detect-server enable
leaf03(config)# dot1x radius-server testuser testing password
6.1
leaf03# configure terminal
leaf03(config)# interface ethernet 25
leaf03(config-if-25)# dot1x enable
6.1(1)

6.2 确认配置结果

7 结果验证

# 在接入终端上不开启dot1x认证时,直接以DHCP的方式UP网卡,虽然可以获取到IP地址,但是没有网络访问权限,也无法Ping通网关。
7
7(1)
7(2)
7(3)
图5:终端VM1通过dot1x接入时的认证窗口
图5:终端VM1通过dot1x接入时的认证窗口
图6:终端VM1使用的dot1x配置
图6:终端VM1使用的dot1x配置
图7:认证成功后的网络状态信息
图7:认证成功后的网络状态信息
# 认证成功后,VM1拥有网络访问权限,可以在VM1上Ping通网关。
7(4)
# 接入交换机上,能看到认证信息。
7(5)

部署手册:开源AAA解决方案 —FreeRADIUS

1 软件介绍

2 基础环

2.1 部署环

2.2 操作系统基础设

3 安装配置数据

4 安装配置Web和PHP

5 安装配置FreeRADIUS

6 安装配置DaloRaDIUS

7 部署结果

1 软件介绍

RADIUS(Remote Authentication and Dial-In User Service)是做拨号用户接入认证和服务请求认证的网络协议。RADIUS提供中心式认证、鉴权和计费(AAA)能力,用于管理接入用户使用网络资源。RADIUS允许使用集中式的数据库来保存所有用户的配置信息,以供所有用户共享使用。

FreeRADIUS是一个开源的、模块化、高性能并且功能丰富的一套RADIUS程序,包含服务器、客户端、开发库和一些额外的相关RADIUS工具。作为第一款开源发布的RADIUS程序,源码几乎可以被任何系统编译安装。并且,产品为大规模的AAA认证服务器(1000万用户和每天百万级的请求)部署设计。FreeRADIUS没有Web界面,因此我们使用第三方Web界面DaloRADIUS作为管理界面。

2 基础环境

2.1 部署环境

  • 服务器硬件:KVM虚拟机,2 vCPU + 2GB vMem + 8GB Disk
  • 操作系统:CentOS Linux release 7.8.2003
  • 数据库:PostgreSQL 15.4
  • Web:v2.4.6
  • PHP:v5.4.16
  • FreeRADIUS:v3.0.13
  • DaloRADIUS:v1.3

2.2 操作系统基础设置

关闭SELinux

SELinux不关闭会导致Web访问异常。

# setenforce 0
# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

关闭防火墙

防止安装完成后无法从外部访问的情况。

# systemctl stop firewalld && systemctl disable firewalld                          

配置YUM源

配置系统的基础YUM源、EPEL源以及PostgreSQL数据库的源。

# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# wget -P /etc/yum.repos.d/ https://mirrors.163.com/.help/CentOS7-Base-163.repo
# yum clean all
# yum makecache
# yum install epel-release -y
# yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

下载安装包

提前准备好DaloRADIUS的安装包。

# wget https://codeload.github.com/lirantal/daloradius/tar.gz/refs/tags/1.3 -O /tmp/freeradius

3 安装配置数据库

# yum install -y mariadb-server mariadb
# systemctl start mariadb
# systemctl enable mariadb
# mysql_secure_installation

# mysql -u root -p
MariaDB [(none)]> create database radius;
MariaDB [(none)]> grant all on radius.* to radius@localhost identified by 'radius';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit

4 安装配置Web和PHP

# yum install -y httpd
# systemctl enable httpd
# systemctl start httpd

# yum install -y php php-mysql php-pear php-devel php-common php-gd php-mbstring php-mcrypt php-xml php-pear-DB
# systemctl restart httpd

5 安装配置FreeRADIUS

# yum install -y freeradius freeradius-utils freeradius-mysql
# systemctl start radiusd.service
# systemctl enable radiusd.service

# mysql -u root -p radius < /etc/raddb/mods-config/sql/main/mysql/schema.sql
# vim /etc/raddb/mods-available/sql
#  cat  /etc/raddb/mods-available/sql | grep -v ^#
sql {
        # The sub-module to use to execute queries. This should match
        # the database you're attempting to connect to.
        #
        #    * rlm_sql_mysql
        #    * rlm_sql_mssql
        #    * rlm_sql_oracle
        #    * rlm_sql_postgresql
        #    * rlm_sql_sqlite
        #    * rlm_sql_null (log queries to disk)
        #
        driver = "rlm_sql_mysql"


        # The dialect of SQL you want to use, this should usually match
        # the driver you selected above.
        #
        # If you're using rlm_sql_null, then it should be the type of
        # database the logged queries are going to be executed against.
        dialect = "mysql"

        # Connection info:
        #
        server = "localhost"
        port = 3306
        login = "radius"
        password = "radius"

        # Database table configuration for everything except Oracle
        radius_db = "radius"
# chgrp -h radiusd /etc/raddb/mods-available/sql
# systemctl restart radiusd.service

6 安装配置DaloRaDIUS

# cd /tmp/freeradius
# tar xvf daloradius-1.3.tar.gz
# mv daloradius-1.3/ /var/www/html/daloradius
# chown -R apache:apache /var/www/html/daloradius
# cd /var/www/html/daloradius/
# mv library/daloradius.conf.php.sample library/daloradius.conf.php
# chmod -R 644 library/daloradius.conf.php
# mysql -u root -p radius < /var/www/html/daloradius/contrib/db/fr2-mysql-daloradius-and-freeradius.sql
# mysql -u root -p radius < /var/www/html/daloradius/contrib/db/mysql-daloradius.sql
# vim library/daloradius.conf.php
# cat library/daloradius.conf.php
……
$configValues['FREERADIUS_VERSION'] = '2';
$configValues['CONFIG_DB_ENGINE'] = 'mysqli';
$configValues['CONFIG_DB_HOST'] = 'localhost';
$configValues['CONFIG_DB_PORT'] = '3306';
$configValues['CONFIG_DB_USER'] = 'radius';
$configValues['CONFIG_DB_PASS'] = 'radius';
$configValues['CONFIG_DB_NAME'] = 'radius';

# systemctl restart httpd

7 部署结果

完成FreeRADIUS的安装部署后,可通过浏览器访问网址:http://freeradius-ip/daloradius/验证部署结果,默认的用户名和密码为administrator/radius。

图1:FreeRADIUS的Web界面
图1:FreeRADIUS的Web界面

案例验证:分析NCCL-Tests运行日志优化Scale-Out网络拓扑

1、背景:All-reduce 和 Ring 算法

2、工具说明:NCCL-Tests

2.1NCCL-Tests常用参数及解释

3、案例验证:优化GPU互连拓扑

3.1NCCL-Test 性能测试结果

4、机内拓扑分析

5、NCCL通信路径分析

6、附录

背景:All-reduce 和 Ring 算法

GPU并行计算中需要大规模地在计算节点之间同步参数梯度,产生了大量的集合通信流量。为了优化集合通信性能,业界开发了不同的集合通信库(xCCL),其核心都是实现 All-Reduce,这也是分布式训练最主要的通信方式。

图1

LLM训练中的 All Reduce 操作一般分为三个步骤:

  • 把每个节点的数据切分成N份;
  • 通过reduce-scatter,让每个节点都得到1/N的完整数据块;
  • 通过all-gather,让所有节点的每个1/N数据块都变得完整

基于这种流量模式,Ring算法是目前实现该操作最常见的基础算法之一。

图2

顾名思义,Ring算法构建了一个环形网络——每个节点的数据会被切分成N份数据在所有GPU之间移动,且每个GPU只和相邻的GPU通信。这种流水线模式能充分利用所有节点的发送和接收带宽,减少 GPU 等待数据的空闲时间,同时也改善了传输大数据块时的性能和时延抖动问题。(但对于小规模数据传输,Ring算法可能会表现出较高的延迟和低效。)

工具说明:NCCL-Tests

NVIDIA提供的NCCL是当前面向AI的集合通信事实标准,NCCL-Test 是 NVIDIA 开源的工具,我们可以在官方Github下载来进行不同算法的性能测试(例如:ring,trees…)。本次测试使用All reduce的ring算法来进行性能评估。

root@bm-2204kzq:~# /usr/local/openmpi/bin/mpirun  #多机集群测试需要使用MPI方式执行
--allow-run-as-root
-bind-to none #不将进程绑定到特定的CPU核心
-H 172.17.0.215:8,172.17.0.81:8 # host列表,:后指定每台机器要用的GPU数量
-np 16 #指定要运行的进程数,等于总GPU数量
-x NCCL_SOCKET_NTHREADS=16
-mca btl_tcp_if_include bond0
-mca pml ^ucx -mca btl ^openib #指定BTL的value为'^openib'
-x NCCL_DEBUG=INFO #NCCL的调试级别为info
-x NCCL_IB_GID_INDEX=3
-x NCCL_IB_HCA=mlx5_0:1,mlx5_2:1,mlx5_3:1,mlx5_4:1
-x NCCL_SOCKET_IFNAME=bond0 #指定了 NCCL 使用的网络接口
-x UCX_TLS=sm,ud #调整MPI使用的传输模式
-x LD_LIBRARY_PATH -x PATH
-x NCCL_IBEXT_DISABLE=1 #如使用RoCE网络,此处应禁用
-x NCCL_ALGO=ring
/root/nccl-tests/build/all_reduce_perf -b 512 -e 18G -f 2 -g 1 #执行all reduce操作

NCCL-Tests常用参数及解释

  • GPU 数量
    • -t,--nthreads <num threads> 每个进程的线程数量配置, 默认 1;
    • -g,--ngpus <GPUs per thread> 每个线程的 GPU 数量,默认 1;
  • 数据大小配置
    • -b,--minbytes <min size in bytes> 开始的最小数据量,默认 32M;
    • -e,--maxbytes <max size in bytes> 结束的最大数据量,默认 32M;
  • 数据步长设置
    • -i,--stepbytes <increment size> 每次增加的数据量,默认: 1M;
    • -f,--stepfactor <increment factor> 每次增加的倍数,默认禁用;
  • NCCL 操作相关配置
    • -o,--op <sum/prod/min/max/avg/all>指定哪种操作为reduce,仅适用于Allreduce、Reduce或ReduceScatter等操作。默认值为:求和(Sum);
    • -d,--datatype <nccltype/all>指定使用哪种数据类型,默认 : Float;
  • 性能相关配置
    • -n,--iters <iteration count> 每次操作(一次发送)循环多少次,默认 : 20;
    • -w,--warmup_iters <warmup iteration count> 预热迭代次数(不计时),默认:5;
    • -m,--agg_iters <aggregation count> 每次迭代中要聚合在一起的操作数,默认:1;
    • -a,--average <0/1/2/3> 在所有 ranks 计算均值作为最终结果 (MPI=1 only). <0=Rank0,1=Avg,2=Min,3=Max>,默认:1;
  • 测试相关配置
    • -p,--parallel_init <0/1> 使用线程并行初始化 NCCL,默认: 0;
    • -c,--check <0/1> 检查结果的正确性。在大量GPU上可能会非常慢,默认:1;
    • -z,--blocking <0/1> 使NCCL集合阻塞,即在每个集合之后让CPU等待和同步,默认:0;
    • -G,--cudagraph <num graph launches>  将迭代作为CUDA图形捕获,然后重复指定的次数,默认:0;

案例验证:优化GPU互连拓扑

下图是一个未优化的双机8卡(H20)组网测试拓扑:

按照一般CPU云数据中心的连接方式,将同服务器的网卡连接到一台交换机上,两台交换机之间有4条400G链路相连。参与测试的为星融元(Asterfusion)交换机(CX732Q-N,32 x 400GE QSFP-DD, 2 x 10GE SFP+)。

图3

NCCL-Test 性能测试结果

                                        out-of-place                       in-place          
#       size         count      type   redop    root     time   algbw   busbw #wrong     time   algbw   busbw #wrong
#        (B)    (elements)                               (us)  (GB/s)  (GB/s)            (us)  (GB/s)  (GB/s)       
         512           128     float     sum      -1    56.12    0.01    0.02      0    54.54    0.01    0.02      0
        1024           256     float     sum      -1    55.09    0.02    0.03      0    53.85    0.02    0.04      0
        2048           512     float     sum      -1    55.67    0.04    0.07      0    54.84    0.04    0.07      0
        4096          1024     float     sum      -1    55.70    0.07    0.14      0    55.05    0.07    0.14      0
        8192          2048     float     sum      -1    56.36    0.15    0.27      0    56.53    0.14    0.27      0
       16384          4096     float     sum      -1    57.21    0.29    0.54      0    57.02    0.29    0.54      0
       32768          8192     float     sum      -1    60.74    0.54    1.01      0    59.87    0.55    1.03      0
       65536         16384     float     sum      -1    67.42    0.97    1.82      0    68.41    0.96    1.80      0
      131072         32768     float     sum      -1    109.6    1.20    2.24      0    108.8    1.20    2.26      0
      262144         65536     float     sum      -1    108.3    2.42    4.54      0    108.3    2.42    4.54      0
      524288        131072     float     sum      -1    115.0    4.56    8.55      0    112.8    4.65    8.72      0
     1048576        262144     float     sum      -1    135.0    7.77   14.57      0    129.4    8.10   15.19      0
     2097152        524288     float     sum      -1    144.6   14.51   27.20      0    142.9   14.67   27.51      0
     4194304       1048576     float     sum      -1    222.0   18.89   35.43      0    220.0   19.07   35.75      0
     8388608       2097152     float     sum      -1    396.5   21.15   39.66      0    392.1   21.40   40.12      0
    16777216       4194304     float     sum      -1    736.3   22.78   42.72      0    904.7   18.55   34.77      0
    33554432       8388608     float     sum      -1   1405.5   23.87   44.76      0   1542.0   21.76   40.80      0
    67108864      16777216     float     sum      -1   2679.0   25.05   46.97      0   2721.0   24.66   46.24      0
   134217728      33554432     float     sum      -1   5490.1   24.45   45.84      0   5291.6   25.36   47.56      0
   268435456      67108864     float     sum      -1    10436   25.72   48.23      0    11788   22.77   42.70      0
   536870912     134217728     float     sum      -1    25853   20.77   38.94      0    23436   22.91   42.95      0
  1073741824     268435456     float     sum      -1    47974   22.38   41.97      0    54979   19.53   36.62      0
  2147483648     536870912     float     sum      -1   117645   18.25   34.23      0   117423   18.29   34.29      0
  4294967296    1073741824     float     sum      -1   248208   17.30   32.44      0   229171   18.74   35.14      0
  8589934592    2147483648     float     sum      -1   474132   18.12   33.97      0   476988   18.01   33.77      0
 17179869184    4294967296     float     sum      -1   949191   18.10   33.94      0   965703   17.79   33.36      0
# Out of bounds values : 0 OK
  • size (B):操作处理的数据的大小,以字节为单位;
  • count (elements):操作处理的元素的数量;
  • type:元素的数据类型;
  • redo p:使用的归约操作;
  • root:-1 表示这个操作没有根节点(all-reduce 操作涉及到所有的节点);
  • time (us):操作的执行时间,以微秒为单位;
  • algbw (GB/s):算法带宽,以 GB/s 为单位;
  • busbw (GB/s):总线带宽,以 GB/s 为单位;
  • wrong:错误的数量,如果这个值不是 0,那可能表示有一些错误发生。

查看结果时需要关注如下几点:

  • 数据量增加时,带宽是否会下降(下降明显不符合预期);
  • 带宽的峰值,每次算到的带宽峰值,可以只关注 in 或者 out;
  • 平均值,在数据量递增的情况下,可能无法体现最终的结果;
  • 请确保数据量足够大,可以压到带宽上限(通过调整 b、e 或者 n 选项)。

分析以上信息可以发现:平均总线带宽仅22GB/s,在达到47GB/s左右的峰值流量后,随着数据量越大带宽性能却在下降,与正常值相差甚远。

机内拓扑分析

通过 nvidia-smi topo -m 可以得知机内设备拓扑

图4

将上表转化为如下示意图:

图5

NCCL通信路径分析

NCCL中用Channel的概念表示一个通信路径,在初始化的过程会自动感知拓扑并计算最佳的通信路径。为了更好的利用带宽和网卡实现并发通信,NCCL会使用多channel。NCCL-test运行日志里列出了16组channel如下:

### ChannelNum:16
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 00/16 :    0   7   5   6   4   3   1   2   8  15  13  14  12  11   9  10
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 01/16 :    0   7   5   6   4   3   1  10   8  15  13  14  12  11   9   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 02/16 :    0   7   5   6  12  11   9  10   8  15  13  14   4   3   1   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 03/16 :    0   7   5  14  12  11   9  10   8  15  13   6   4   3   1   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 04/16 :    0   7   5   6   4   3   1   2   8  15  13  14  12  11   9  10
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 05/16 :    0   7   5   6   4   3   1  10   8  15  13  14  12  11   9   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 06/16 :    0   7   5   6  12  11   9  10   8  15  13  14   4   3   1   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 07/16 :    0   7   5  14  12  11   9  10   8  15  13   6   4   3   1   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 08/16 :    0   7   5   6   4   3   1   2   8  15  13  14  12  11   9  10
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 09/16 :    0   7   5   6   4   3   1  10   8  15  13  14  12  11   9   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 10/16 :    0   7   5   6  12  11   9  10   8  15  13  14   4   3   1   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 11/16 :    0   7   5  14  12  11   9  10   8  15  13   6   4   3   1   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 12/16 :    0   7   5   6   4   3   1   2   8  15  13  14  12  11   9  10
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 13/16 :    0   7   5   6   4   3   1  10   8  15  13  14  12  11   9   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 14/16 :    0   7   5   6  12  11   9  10   8  15  13  14   4   3   1   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 15/16 :    0   7   5  14  12  11   9  10   8  15  13   6   4   3   1   2

Device map 显示 Rank #0-7、#8-15在同一服务器

### Device maps
    ## GPU map
        #  Rank  0 Group  0 Pid 252978 on bm-2204kzq device  0 [0x0f] NVIDIA H20
        #  Rank  1 Group  0 Pid 252979 on bm-2204kzq device  1 [0x34] NVIDIA H20
        #  Rank  2 Group  0 Pid 252980 on bm-2204kzq device  2 [0x48] NVIDIA H20
        #  Rank  3 Group  0 Pid 252981 on bm-2204kzq device  3 [0x5a] NVIDIA H20
        #  Rank  4 Group  0 Pid 252982 on bm-2204kzq device  4 [0x87] NVIDIA H20
        #  Rank  5 Group  0 Pid 252983 on bm-2204kzq device  5 [0xae] NVIDIA H20
        #  Rank  6 Group  0 Pid 252984 on bm-2204kzq device  6 [0xc2] NVIDIA H20
        #  Rank  7 Group  0 Pid 252985 on bm-2204kzq device  7 [0xd7] NVIDIA H20
        #  Rank  8 Group  0 Pid 253834 on bm-2204qhn device  0 [0x0f] NVIDIA H20 
        #  Rank  9 Group  0 Pid 253835 on bm-2204qhn device  1 [0x34] NVIDIA H20 
        #  Rank 10 Group  0 Pid 253836 on bm-2204qhn device  2 [0x48] NVIDIA H20 
        #  Rank 11 Group  0 Pid 253837 on bm-2204qhn device  3 [0x5a] NVIDIA H20 
        #  Rank 12 Group  0 Pid 253838 on bm-2204qhn device  4 [0x87] NVIDIA H20 
        #  Rank 13 Group  0 Pid 253839 on bm-2204qhn device  5 [0xae] NVIDIA H20
        #  Rank 14 Group  0 Pid 253840 on bm-2204qhn device  6 [0xc2] NVIDIA H20
        #  Rank 15 Group  0 Pid 253841 on bm-2204qhn device  7 [0xd7] NVIDIA H20 

结合每个channel的具体路径信息(详见文末),在所有16条channel下的机间流量仅有以下8种固定的rank组合:10-0、2-8、1-10、9-2、6-12、14-4、5-14、13-6,对应的,产生通信的网卡有且仅有:

<bm-2204kzq>       <bm-2204qhn>
NIC0: mlx5_0 <---> NIC2: mlx5_2
NIC2: mlx5_2 
NIC3: mlx5_3 <---> NIC4: mlx5_4
NIC4: mlx5_4 

优化前性能不佳的原因是: 所有跨节点的并行流量都需跨交换机在四条互联链路上负载均衡,而现有的ECMP负载均衡对大流不够友好,形成了性能瓶颈。

所以在设计Scale-out网络拓扑的时候,我们应让集群内所有同轨道的网卡连接在一台交换机上,使集群性能达到最优。

图6

按此方式调整后,测得单机四卡模式跨RoCE交换机(CX732Q-N)的总线带宽与网卡直连数值相近,约195GB/s


附录

## NIC map
        bm-2204kzq:252982:252982 [*] NCCL INFO NCCL_SOCKET_IFNAME set by environment to bond0
        bm-2204kzq:252982:252982 [*] NCCL INFO Bootstrap : Using bond0:172.17.0.215<0>
        bm-2204kzq:252982:252982 [*] NCCL INFO NCCL version 2.22.3+cuda12.6
        bm-2204kzq:252985:253055 [*] NCCL INFO NET/IB : Using [0]mlx5_2:1/RoCE [1]mlx5_3:1/RoCE [2]mlx5_4:1/RoCE [3]mlx5_0:1/RoCE [RO]; OOB bond0:172.17.0.215<0>
        
        bm-2204qhn:253837:253837 [*] NCCL INFO NCCL_SOCKET_IFNAME set by environment to bond0
        bm-2204qhn:253837:253837 [*] NCCL INFO Bootstrap : Using bond0:172.17.0.81<0>
        bm-2204qhn:253837:253837 [*] NCCL INFO NCCL version 2.22.3+cuda12.6
        bm-2204qhn:253840:253908 [*] NCCL INFO NET/IB : Using [0]mlx5_0:1/RoCE [1]mlx5_2:1/RoCE [2]mlx5_3:1/RoCE [3]mlx5_4:1/RoCE [RO]; OOB bond0:172.17.0.81<0>
### ChannelNum:16
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 00/16 :    0   7   5   6   4   3   1   2   8  15  13  14  12  11   9  10
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 01/16 :    0   7   5   6   4   3   1  10   8  15  13  14  12  11   9   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 02/16 :    0   7   5   6  12  11   9  10   8  15  13  14   4   3   1   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 03/16 :    0   7   5  14  12  11   9  10   8  15  13   6   4   3   1   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 04/16 :    0   7   5   6   4   3   1   2   8  15  13  14  12  11   9  10
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 05/16 :    0   7   5   6   4   3   1  10   8  15  13  14  12  11   9   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 06/16 :    0   7   5   6  12  11   9  10   8  15  13  14   4   3   1   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 07/16 :    0   7   5  14  12  11   9  10   8  15  13   6   4   3   1   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 08/16 :    0   7   5   6   4   3   1   2   8  15  13  14  12  11   9  10
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 09/16 :    0   7   5   6   4   3   1  10   8  15  13  14  12  11   9   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 10/16 :    0   7   5   6  12  11   9  10   8  15  13  14   4   3   1   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 11/16 :    0   7   5  14  12  11   9  10   8  15  13   6   4   3   1   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 12/16 :    0   7   5   6   4   3   1   2   8  15  13  14  12  11   9  10
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 13/16 :    0   7   5   6   4   3   1  10   8  15  13  14  12  11   9   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 14/16 :    0   7   5   6  12  11   9  10   8  15  13  14   4   3   1   2
    bm-2204kzq:252978:253054 [0] NCCL INFO Channel 15/16 :    0   7   5  14  12  11   9  10   8  15  13   6   4   3   1   2

    ## Channel C0
        bm-2204kzq:252978:253054 [0] NCCL INFO Channel 00/16 :    0   7   5   6   4   3   1   2   8  15  13  14  12  11   9  10

        bm-2204kzq:
            [0]mlx5_2:1/RoCE 
            [1]mlx5_3:1/RoCE 
            [2]mlx5_4:1/RoCE 
            [3]mlx5_0:1/RoCE
        
        bm-2204qhn:
            [0]mlx5_0:1/RoCE 
            [1]mlx5_2:1/RoCE 
            [2]mlx5_3:1/RoCE 
            [3]mlx5_4:1/RoCE

        bm-2204kzq:252978:253115 [0] NCCL INFO Channel 00/0 : 0[0] -> 7[7] via P2P/CUMEM
        bm-2204kzq:252985:253113 [7] NCCL INFO Channel 00/0 : 7[7] -> 5[5] via P2P/CUMEM
        bm-2204kzq:252983:253114 [5] NCCL INFO Channel 00/0 : 5[5] -> 6[6] via P2P/CUMEM
        bm-2204kzq:252984:253117 [6] NCCL INFO Channel 00/0 : 6[6] -> 4[4] via P2P/CUMEM
        bm-2204kzq:252982:253118 [4] NCCL INFO Channel 00/0 : 4[4] -> 3[3] via P2P/CUMEM
        bm-2204kzq:252981:253116 [3] NCCL INFO Channel 00/0 : 3[3] -> 1[1] via P2P/CUMEM
        bm-2204kzq:252979:253119 [1] NCCL INFO Channel 00/0 : 1[1] -> 2[2] via P2P/CUMEM
        bm-2204kzq:252980:253120 [2] NCCL INFO Channel 00/0 : 2[2] -> 8[0] [send] via NET/IB/3(0)/GDRDMA mlx5_0:1/RoCE
        bm-2204qhn:253834:253970 [0] NCCL INFO Channel 00/0 : 2[2] -> 8[0] [receive] via NET/IB/0/GDRDMA mlx5_0:1/RoCE
        bm-2204qhn:253834:253970 [0] NCCL INFO Channel 00/0 : 8[0] -> 15[7] via P2P/CUMEM
        bm-2204qhn:253841:253968 [7] NCCL INFO Channel 00/0 : 15[7] -> 13[5] via P2P/CUMEM
        bm-2204qhn:253839:253969 [5] NCCL INFO Channel 00/0 : 13[5] -> 14[6] via P2P/CUMEM
        bm-2204qhn:253840:253973 [6] NCCL INFO Channel 00/0 : 14[6] -> 12[4] via P2P/CUMEM
        bm-2204qhn:253838:253972 [4] NCCL INFO Channel 00/0 : 12[4] -> 11[3] via P2P/CUMEM
        bm-2204qhn:253837:253967 [3] NCCL INFO Channel 00/0 : 11[3] -> 9[1] via P2P/CUMEM
        bm-2204qhn:253835:253971 [1] NCCL INFO Channel 00/0 : 9[1] -> 10[2] via P2P/CUMEM
        bm-2204qhn:253836:253974 [2] NCCL INFO Channel 00/0 : 10[2] -> 0[0] [send] via NET/IB/0(8)/GDRDMA mlx5_0:1/RoCE
        bm-2204kzq:252978:253115 [0] NCCL INFO Channel 00/0 : 10[2] -> 0[0] [receive] via NET/IB/3/GDRDMA mlx5_0:1/RoCE

    ## Channel C1
        bm-2204kzq:252978:253054 [0] NCCL INFO Channel 01/16 :    0   7   5   6   4   3   1  10   8  15  13  14  12  11   9   2
        
        bm-2204kzq:
            [0]mlx5_2:1/RoCE 
            [1]mlx5_3:1/RoCE 
            [2]mlx5_4:1/RoCE 
            [3]mlx5_0:1/RoCE
        
        bm-2204qhn:
            [0]mlx5_0:1/RoCE 
            [1]mlx5_2:1/RoCE 
            [2]mlx5_3:1/RoCE 
            [3]mlx5_4:1/RoCE
            
        bm-2204kzq:252978:253115 [0] NCCL INFO Channel 01/0 : 0[0] -> 7[7] via P2P/CUMEM
        bm-2204kzq:252985:253113 [7] NCCL INFO Channel 01/0 : 7[7] -> 5[5] via P2P/CUMEM
        bm-2204kzq:252983:253114 [5] NCCL INFO Channel 01/0 : 5[5] -> 6[6] via P2P/CUMEM
        bm-2204kzq:252984:253117 [6] NCCL INFO Channel 01/0 : 6[6] -> 4[4] via P2P/CUMEM
        bm-2204kzq:252982:253118 [4] NCCL INFO Channel 01/0 : 4[4] -> 3[3] via P2P/CUMEM
        bm-2204kzq:252981:253116 [3] NCCL INFO Channel 01/0 : 3[3] -> 1[1] via P2P/CUMEM
        bm-2204kzq:252979:253119 [1] NCCL INFO Channel 01/0 : 1[1] -> 10[2] [send] via NET/IB/0(2)/GDRDMA mlx5_2:1/RoCE 
        bm-2204qhn:253836:253974 [2] NCCL INFO Channel 01/0 : 1[1] -> 10[2] [receive] via NET/IB/1/GDRDMA mlx5_2:1/RoCE 
        bm-2204qhn:253836:253974 [2] NCCL INFO Channel 01/0 : 10[2] -> 8[0] via P2P/CUMEM
        bm-2204qhn:253834:253970 [0] NCCL INFO Channel 01/0 : 8[0] -> 15[7] via P2P/CUMEM
        bm-2204qhn:253841:253968 [7] NCCL INFO Channel 01/0 : 15[7] -> 13[5] via P2P/CUMEM
        bm-2204qhn:253839:253969 [5] NCCL INFO Channel 01/0 : 13[5] -> 14[6] via P2P/CUMEM
        bm-2204qhn:253840:253973 [6] NCCL INFO Channel 01/0 : 14[6] -> 12[4] via P2P/CUMEM
        bm-2204qhn:253838:253972 [4] NCCL INFO Channel 01/0 : 12[4] -> 11[3] via P2P/CUMEM
        bm-2204qhn:253837:253967 [3] NCCL INFO Channel 01/0 : 11[3] -> 9[1] via P2P/CUMEM
        bm-2204qhn:253835:253971 [1] NCCL INFO Channel 01/0 : 9[1] -> 2[2] [send] via NET/IB/1(10)/GDRDMA mlx5_2:1/RoCE 
        bm-2204kzq:252980:253120 [2] NCCL INFO Channel 01/0 : 9[1] -> 2[2] [receive] via NET/IB/0/GDRDMA mlx5_2:1/RoCE 
        bm-2204kzq:252980:253120 [2] NCCL INFO Channel 01/0 : 2[2] -> 0[0] via P2P/CUMEM
        
    ## Channel C2
        bm-2204kzq:252978:253054 [0] NCCL INFO Channel 02/16 :    0   7   5   6  12  11   9  10   8  15  13  14   4   3   1   2

        bm-2204kzq:
            [0]mlx5_2:1/RoCE 
            [1]mlx5_3:1/RoCE 
            [2]mlx5_4:1/RoCE 
            [3]mlx5_0:1/RoCE
        
        bm-2204qhn:
            [0]mlx5_0:1/RoCE 
            [1]mlx5_2:1/RoCE 
            [2]mlx5_3:1/RoCE 
            [3]mlx5_4:1/RoCE
            
        bm-2204kzq:252978:253115 [0] NCCL INFO Channel 02/0 : 0[0] -> 7[7] via P2P/CUMEM
        bm-2204kzq:252985:253113 [7] NCCL INFO Channel 02/0 : 7[7] -> 5[5] via P2P/CUMEM
        bm-2204kzq:252983:253114 [5] NCCL INFO Channel 02/0 : 5[5] -> 6[6] via P2P/CUMEM
        bm-2204kzq:252984:253117 [6] NCCL INFO Channel 02/0 : 6[6] -> 12[4] [send] via NET/IB/1(4)/GDRDMA mlx5_3:1/RoCE
        bm-2204qhn:253838:253972 [4] NCCL INFO Channel 02/0 : 6[6] -> 12[4] [receive] via NET/IB/2/GDRDMA mlx5_3:1/RoCE
        bm-2204qhn:253838:253972 [4] NCCL INFO Channel 02/0 : 12[4] -> 11[3] via P2P/CUMEM
        bm-2204qhn:253837:253967 [3] NCCL INFO Channel 02/0 : 11[3] -> 9[1] via P2P/CUMEM
        bm-2204qhn:253835:253971 [1] NCCL INFO Channel 02/0 : 9[1] -> 10[2] via P2P/CUMEM
        bm-2204qhn:253836:253974 [2] NCCL INFO Channel 02/0 : 10[2] -> 8[0] via P2P/CUMEM
        bm-2204qhn:253834:253970 [0] NCCL INFO Channel 02/0 : 8[0] -> 15[7] via P2P/CUMEM
        bm-2204qhn:253841:253968 [7] NCCL INFO Channel 02/0 : 15[7] -> 13[5] via P2P/CUMEM
        bm-2204qhn:253839:253969 [5] NCCL INFO Channel 02/0 : 13[5] -> 14[6] via P2P/CUMEM
        bm-2204qhn:253840:253973 [6] NCCL INFO Channel 02/0 : 14[6] -> 4[4] [send] via NET/IB/2(12)/GDRDMA mlx5_3:1/RoCE
        bm-2204kzq:252982:253118 [4] NCCL INFO Channel 02/0 : 14[6] -> 4[4] [receive] via NET/IB/1/GDRDMA mlx5_3:1/RoCE
        bm-2204kzq:252982:253118 [4] NCCL INFO Channel 02/0 : 4[4] -> 3[3] via P2P/CUMEM
        bm-2204kzq:252981:253116 [3] NCCL INFO Channel 02/0 : 3[3] -> 1[1] via P2P/CUMEM
        bm-2204kzq:252979:253119 [1] NCCL INFO Channel 02/0 : 1[1] -> 2[2] via P2P/CUMEM
        bm-2204kzq:252980:253120 [2] NCCL INFO Channel 02/0 : 2[2] -> 0[0] via P2P/CUMEM

    ## Channel C3
        bm-2204kzq:252978:253054 [0] NCCL INFO Channel 03/16 :    0   7   5  14  12  11   9  10   8  15  13   6   4   3   1   2

        bm-2204kzq:
            [0]mlx5_2:1/RoCE 
            [1]mlx5_3:1/RoCE 
            [2]mlx5_4:1/RoCE 
            [3]mlx5_0:1/RoCE
        
        bm-2204qhn:
            [0]mlx5_0:1/RoCE 
            [1]mlx5_2:1/RoCE 
            [2]mlx5_3:1/RoCE 
            [3]mlx5_4:1/RoCE
            
        bm-2204kzq:252978:253115 [0] NCCL INFO Channel 03/0 : 0[0] -> 7[7] via P2P/CUMEM
        bm-2204kzq:252985:253113 [7] NCCL INFO Channel 03/0 : 7[7] -> 5[5] via P2P/CUMEM
        bm-2204kzq:252983:253114 [5] NCCL INFO Channel 03/0 : 5[5] -> 14[6] [send] via NET/IB/2(6)/GDRDMA mlx5_4:1/RoCE
        bm-2204qhn:253840:253973 [6] NCCL INFO Channel 03/0 : 5[5] -> 14[6] [receive] via NET/IB/3/GDRDMA mlx5_4:1/RoCE
        bm-2204qhn:253840:253973 [6] NCCL INFO Channel 03/0 : 14[6] -> 12[4] via P2P/CUMEM
        bm-2204qhn:253838:253972 [4] NCCL INFO Channel 03/0 : 12[4] -> 11[3] via P2P/CUMEM
        bm-2204qhn:253837:253967 [3] NCCL INFO Channel 03/0 : 11[3] -> 9[1] via P2P/CUMEM
        bm-2204qhn:253835:253971 [1] NCCL INFO Channel 03/0 : 9[1] -> 10[2] via P2P/CUMEM
        bm-2204qhn:253836:253974 [2] NCCL INFO Channel 03/0 : 10[2] -> 8[0] via P2P/CUMEM
        bm-2204qhn:253834:253970 [0] NCCL INFO Channel 03/0 : 8[0] -> 15[7] via P2P/CUMEM
        bm-2204qhn:253841:253968 [7] NCCL INFO Channel 03/0 : 15[7] -> 13[5] via P2P/CUMEM
        bm-2204qhn:253839:253969 [5] NCCL INFO Channel 03/0 : 13[5] -> 6[6] [send] via NET/IB/3(14)/GDRDMA mlx5_4:1/RoCE
        bm-2204kzq:252984:253117 [6] NCCL INFO Channel 03/0 : 13[5] -> 6[6] [receive] via NET/IB/2/GDRDMA mlx5_4:1/RoCE
        bm-2204kzq:252984:253117 [6] NCCL INFO Channel 03/0 : 6[6] -> 4[4] via P2P/CUMEM
        bm-2204kzq:252982:253118 [4] NCCL INFO Channel 03/0 : 4[4] -> 3[3] via P2P/CUMEM
        bm-2204kzq:252981:253116 [3] NCCL INFO Channel 03/0 : 3[3] -> 1[1] via P2P/CUMEM
        bm-2204kzq:252979:253119 [1] NCCL INFO Channel 03/0 : 1[1] -> 2[2] via P2P/CUMEM
        bm-2204kzq:252980:253120 [2] NCCL INFO Channel 03/0 : 2[2] -> 0[0] via P2P/CUMEM

    ## Channel C4
        bm-2204kzq:252978:253054 [0] NCCL INFO Channel 04/16 :    0   7   5   6   4   3   1   2   8  15  13  14  12  11   9  10

        bm-2204kzq:
            [0]mlx5_2:1/RoCE 
            [1]mlx5_3:1/RoCE 
            [2]mlx5_4:1/RoCE 
            [3]mlx5_0:1/RoCE
        
        bm-2204qhn:
            [0]mlx5_0:1/RoCE 
            [1]mlx5_2:1/RoCE 
            [2]mlx5_3:1/RoCE 
            [3]mlx5_4:1/RoCE
            
        bm-2204kzq:252978:253115 [0] NCCL INFO Channel 04/0 : 0[0] -> 7[7] via P2P/CUMEM
        bm-2204kzq:252985:253113 [7] NCCL INFO Channel 04/0 : 7[7] -> 5[5] via P2P/CUMEM
        bm-2204kzq:252983:253114 [5] NCCL INFO Channel 04/0 : 5[5] -> 6[6] via P2P/CUMEM
        bm-2204kzq:252984:253117 [6] NCCL INFO Channel 04/0 : 6[6] -> 4[4] via P2P/CUMEM
        bm-2204kzq:252982:253118 [4] NCCL INFO Channel 04/0 : 4[4] -> 3[3] via P2P/CUMEM
        bm-2204kzq:252981:253116 [3] NCCL INFO Channel 04/0 : 3[3] -> 1[1] via P2P/CUMEM
        bm-2204kzq:252979:253119 [1] NCCL INFO Channel 04/0 : 1[1] -> 2[2] via P2P/CUMEM
        bm-2204kzq:252980:253120 [2] NCCL INFO Channel 04/0 : 2[2] -> 8[0] [send] via NET/IB/3(0)/GDRDMA mlx5_0:1/RoCE
        bm-2204qhn:253834:253970 [0] NCCL INFO Channel 04/0 : 2[2] -> 8[0] [receive] via NET/IB/0/GDRDMA mlx5_0:1/RoCE
        bm-2204qhn:253834:253970 [0] NCCL INFO Channel 04/0 : 8[0] -> 15[7] via P2P/CUMEM
        bm-2204qhn:253841:253968 [7] NCCL INFO Channel 04/0 : 15[7] -> 13[5] via P2P/CUMEM
        bm-2204qhn:253839:253969 [5] NCCL INFO Channel 04/0 : 13[5] -> 14[6] via P2P/CUMEM
        bm-2204qhn:253840:253973 [6] NCCL INFO Channel 04/0 : 14[6] -> 12[4] via P2P/CUMEM
        bm-2204qhn:253838:253972 [4] NCCL INFO Channel 04/0 : 12[4] -> 11[3] via P2P/CUMEM
        bm-2204qhn:253837:253967 [3] NCCL INFO Channel 04/0 : 11[3] -> 9[1] via P2P/CUMEM
        bm-2204qhn:253835:253971 [1] NCCL INFO Channel 04/0 : 9[1] -> 10[2] via P2P/CUMEM
        bm-2204qhn:253836:253974 [2] NCCL INFO Channel 04/0 : 10[2] -> 0[0] [send] via NET/IB/0(8)/GDRDMA mlx5_0:1/RoCE
        bm-2204kzq:252978:253115 [0] NCCL INFO Channel 04/0 : 10[2] -> 0[0] [receive] via NET/IB/3/GDRDMA mlx5_0:1/RoCE

    ## Channel C5
        bm-2204kzq:252978:253054 [0] NCCL INFO Channel 05/16 :    0   7   5   6   4   3   1  10   8  15  13  14  12  11   9   2

        bm-2204kzq:
            [0]mlx5_2:1/RoCE 
            [1]mlx5_3:1/RoCE 
            [2]mlx5_4:1/RoCE 
            [3]mlx5_0:1/RoCE
        
        bm-2204qhn:
            [0]mlx5_0:1/RoCE 
            [1]mlx5_2:1/RoCE 
            [2]mlx5_3:1/RoCE 
            [3]mlx5_4:1/RoCE
            
        bm-2204kzq:252978:253115 [0] NCCL INFO Channel 05/0 : 0[0] -> 7[7] via P2P/CUMEM
        bm-2204kzq:252985:253113 [7] NCCL INFO Channel 05/0 : 7[7] -> 5[5] via P2P/CUMEM
        bm-2204kzq:252983:253114 [5] NCCL INFO Channel 05/0 : 5[5] -> 6[6] via P2P/CUMEM
        bm-2204kzq:252984:253117 [6] NCCL INFO Channel 05/0 : 6[6] -> 4[4] via P2P/CUMEM
        bm-2204kzq:252982:253118 [4] NCCL INFO Channel 05/0 : 4[4] -> 3[3] via P2P/CUMEM
        bm-2204kzq:252981:253116 [3] NCCL INFO Channel 05/0 : 3[3] -> 1[1] via P2P/CUMEM
        bm-2204kzq:252979:253119 [1] NCCL INFO Channel 05/0 : 1[1] -> 10[2] [send] via NET/IB/0(2)/GDRDMA mlx5_2:1/RoCE
        bm-2204qhn:253836:253974 [2] NCCL INFO Channel 05/0 : 1[1] -> 10[2] [receive] via NET/IB/1/GDRDMA mlx5_2:1/RoCE
        bm-2204qhn:253836:253974 [2] NCCL INFO Channel 05/0 : 10[2] -> 8[0] via P2P/CUMEM
        bm-2204qhn:253834:253970 [0] NCCL INFO Channel 05/0 : 8[0] -> 15[7] via P2P/CUMEM
        bm-2204qhn:253841:253968 [7] NCCL INFO Channel 05/0 : 15[7] -> 13[5] via P2P/CUMEM
        bm-2204qhn:253839:253969 [5] NCCL INFO Channel 05/0 : 13[5] -> 14[6] via P2P/CUMEM
        bm-2204qhn:253840:253973 [6] NCCL INFO Channel 05/0 : 14[6] -> 12[4] via P2P/CUMEM
        bm-2204qhn:253838:253972 [4] NCCL INFO Channel 05/0 : 12[4] -> 11[3] via P2P/CUMEM
        bm-2204qhn:253837:253967 [3] NCCL INFO Channel 05/0 : 11[3] -> 9[1] via P2P/CUMEM
        bm-2204qhn:253835:253971 [1] NCCL INFO Channel 05/0 : 9[1] -> 2[2] [send] via NET/IB/1(10)/GDRDMA mlx5_2:1/RoCE
        bm-2204kzq:252980:253120 [2] NCCL INFO Channel 05/0 : 9[1] -> 2[2] [receive] via NET/IB/0/GDRDMA mlx5_2:1/RoCE
        bm-2204kzq:252980:253120 [2] NCCL INFO Channel 05/0 : 2[2] -> 0[0] via P2P/CUMEM

    ## Channel C6
        bm-2204kzq:252978:253054 [0] NCCL INFO Channel 06/16 :    0   7   5   6  12  11   9  10   8  15  13  14   4   3   1   2

        bm-2204kzq:
            [0]mlx5_2:1/RoCE 
            [1]mlx5_3:1/RoCE 
            [2]mlx5_4:1/RoCE 
            [3]mlx5_0:1/RoCE
        
        bm-2204qhn:
            [0]mlx5_0:1/RoCE 
            [1]mlx5_2:1/RoCE 
            [2]mlx5_3:1/RoCE 
            [3]mlx5_4:1/RoCE
            
        bm-2204kzq:252978:253115 [0] NCCL INFO Channel 06/0 : 0[0] -> 7[7] via P2P/CUMEM
        bm-2204kzq:252985:253113 [7] NCCL INFO Channel 06/0 : 7[7] -> 5[5] via P2P/CUMEM
        bm-2204kzq:252983:253114 [5] NCCL INFO Channel 06/0 : 5[5] -> 6[6] via P2P/CUMEM
        bm-2204kzq:252984:253117 [6] NCCL INFO Channel 06/0 : 6[6] -> 12[4] [send] via NET/IB/1(4)/GDRDMA mlx5_3:1/RoCE
        bm-2204qhn:253838:253972 [4] NCCL INFO Channel 06/0 : 6[6] -> 12[4] [receive] via NET/IB/2/GDRDMA mlx5_3:1/RoCE
        bm-2204qhn:253838:253972 [4] NCCL INFO Channel 06/0 : 12[4] -> 11[3] via P2P/CUMEM
        bm-2204qhn:253837:253967 [3] NCCL INFO Channel 06/0 : 11[3] -> 9[1] via P2P/CUMEM
        bm-2204qhn:253835:253971 [1] NCCL INFO Channel 06/0 : 9[1] -> 10[2] via P2P/CUMEM
        bm-2204qhn:253836:253974 [2] NCCL INFO Channel 06/0 : 10[2] -> 8[0] via P2P/CUMEM
        bm-2204qhn:253834:253970 [0] NCCL INFO Channel 06/0 : 8[0] -> 15[7] via P2P/CUMEM
        bm-2204qhn:253841:253968 [7] NCCL INFO Channel 06/0 : 15[7] -> 13[5] via P2P/CUMEM
        bm-2204qhn:253839:253969 [5] NCCL INFO Channel 06/0 : 13[5] -> 14[6] via P2P/CUMEM
        bm-2204qhn:253840:253973 [6] NCCL INFO Channel 06/0 : 14[6] -> 4[4] [send] via NET/IB/2(12)/GDRDMA mlx5_3:1/RoCE
        bm-2204kzq:252982:253118 [4] NCCL INFO Channel 06/0 : 14[6] -> 4[4] [receive] via NET/IB/1/GDRDMA mlx5_3:1/RoCE
        bm-2204kzq:252982:253118 [4] NCCL INFO Channel 06/0 : 4[4] -> 3[3] via P2P/CUMEM
        bm-2204kzq:252981:253116 [3] NCCL INFO Channel 06/0 : 3[3] -> 1[1] via P2P/CUMEM
        bm-2204kzq:252979:253119 [1] NCCL INFO Channel 06/0 : 1[1] -> 2[2] via P2P/CUMEM
        bm-2204kzq:252980:253120 [2] NCCL INFO Channel 06/0 : 2[2] -> 0[0] via P2P/CUMEM

    ## Channel C7
        bm-2204kzq:252978:253054 [0] NCCL INFO Channel 07/16 :    0   7   5  14  12  11   9  10   8  15  13   6   4   3   1   2

        bm-2204kzq:
            [0]mlx5_2:1/RoCE 
            [1]mlx5_3:1/RoCE 
            [2]mlx5_4:1/RoCE 
            [3]mlx5_0:1/RoCE
        
        bm-2204qhn:
            [0]mlx5_0:1/RoCE 
            [1]mlx5_2:1/RoCE 
            [2]mlx5_3:1/RoCE 
            [3]mlx5_4:1/RoCE
            
        bm-2204kzq:252978:253115 [0] NCCL INFO Channel 07/0 : 0[0] -> 7[7] via P2P/CUMEM
        bm-2204kzq:252985:253113 [7] NCCL INFO Channel 07/0 : 7[7] -> 5[5] via P2P/CUMEM
        bm-2204kzq:252983:253114 [5] NCCL INFO Channel 07/0 : 5[5] -> 14[6] [send] via NET/IB/2(6)/GDRDMA mlx5_4:1/RoCE
        bm-2204qhn:253840:253973 [6] NCCL INFO Channel 07/0 : 5[5] -> 14[6] [receive] via NET/IB/3/GDRDMA mlx5_4:1/RoCE
        bm-2204qhn:253840:253973 [6] NCCL INFO Channel 07/0 : 14[6] -> 12[4] via P2P/CUMEM
        bm-2204qhn:253838:253972 [4] NCCL INFO Channel 07/0 : 12[4] -> 11[3] via P2P/CUMEM
        bm-2204qhn:253837:253967 [3] NCCL INFO Channel 07/0 : 11[3] -> 9[1] via P2P/CUMEM
        bm-2204qhn:253835:253971 [1] NCCL INFO Channel 07/0 : 9[1] -> 10[2] via P2P/CUMEM
        bm-2204qhn:253836:253974 [2] NCCL INFO Channel 07/0 : 10[2] -> 8[0] via P2P/CUMEM
        bm-2204qhn:253834:253970 [0] NCCL INFO Channel 07/0 : 8[0] -> 15[7] via P2P/CUMEM
        bm-2204qhn:253841:253968 [7] NCCL INFO Channel 07/0 : 15[7] -> 13[5] via P2P/CUMEM
        bm-2204qhn:253839:253969 [5] NCCL INFO Channel 07/0 : 13[5] -> 6[6] [send] via NET/IB/3(14)/GDRDMA mlx5_4:1/RoCE
        bm-2204kzq:252984:253117 [6] NCCL INFO Channel 07/0 : 13[5] -> 6[6] [receive] via NET/IB/2/GDRDMA mlx5_4:1/RoCE
        bm-2204kzq:252984:253117 [6] NCCL INFO Channel 07/0 : 6[6] -> 4[4] via P2P/CUMEM
        bm-2204kzq:252982:253118 [4] NCCL INFO Channel 07/0 : 4[4] -> 3[3] via P2P/CUMEM
        bm-2204kzq:252981:253116 [3] NCCL INFO Channel 07/0 : 3[3] -> 1[1] via P2P/CUMEM
        bm-2204kzq:252979:253119 [1] NCCL INFO Channel 07/0 : 1[1] -> 2[2] via P2P/CUMEM
        bm-2204kzq:252980:253120 [2] NCCL INFO Channel 07/0 : 2[2] -> 0[0] via P2P/CUMEM

    ## Channel C8
        bm-2204kzq:252978:253054 [0] NCCL INFO Channel 08/16 :    0   7   5   6   4   3   1   2   8  15  13  14  12  11   9  10

        bm-2204kzq:
            [0]mlx5_2:1/RoCE 
            [1]mlx5_3:1/RoCE 
            [2]mlx5_4:1/RoCE 
            [3]mlx5_0:1/RoCE
        
        bm-2204qhn:
            [0]mlx5_0:1/RoCE 
            [1]mlx5_2:1/RoCE 
            [2]mlx5_3:1/RoCE 
            [3]mlx5_4:1/RoCE
            
        bm-2204kzq:252978:253115 [0] NCCL INFO Channel 08/0 : 0[0] -> 7[7] via P2P/CUMEM
        bm-2204kzq:252985:253113 [7] NCCL INFO Channel 08/0 : 7[7] -> 5[5] via P2P/CUMEM
        bm-2204kzq:252983:253114 [5] NCCL INFO Channel 08/0 : 5[5] -> 6[6] via P2P/CUMEM
        bm-2204kzq:252984:253117 [6] NCCL INFO Channel 08/0 : 6[6] -> 4[4] via P2P/CUMEM
        bm-2204kzq:252982:253118 [4] NCCL INFO Channel 08/0 : 4[4] -> 3[3] via P2P/CUMEM
        bm-2204kzq:252981:253116 [3] NCCL INFO Channel 08/0 : 3[3] -> 1[1] via P2P/CUMEM
        bm-2204kzq:252979:253119 [1] NCCL INFO Channel 08/0 : 1[1] -> 2[2] via P2P/CUMEM
        bm-2204kzq:252980:253120 [2] NCCL INFO Channel 08/0 : 2[2] -> 8[0] [send] via NET/IB/3(0)/GDRDMA mlx5_0:1/RoCE
        bm-2204qhn:253834:253970 [0] NCCL INFO Channel 08/0 : 2[2] -> 8[0] [receive] via NET/IB/0/GDRDMA mlx5_0:1/RoCE
        bm-2204qhn:253834:253970 [0] NCCL INFO Channel 08/0 : 8[0] -> 15[7] via P2P/CUMEM
        bm-2204qhn:253841:253968 [7] NCCL INFO Channel 08/0 : 15[7] -> 13[5] via P2P/CUMEM
        bm-2204qhn:253839:253969 [5] NCCL INFO Channel 08/0 : 13[5] -> 14[6] via P2P/CUMEM
        bm-2204qhn:253840:253973 [6] NCCL INFO Channel 08/0 : 14[6] -> 12[4] via P2P/CUMEM
        bm-2204qhn:253838:253972 [4] NCCL INFO Channel 08/0 : 12[4] -> 11[3] via P2P/CUMEM
        bm-2204qhn:253837:253967 [3] NCCL INFO Channel 08/0 : 11[3] -> 9[1] via P2P/CUMEM
        bm-2204qhn:253835:253971 [1] NCCL INFO Channel 08/0 : 9[1] -> 10[2] via P2P/CUMEM
        bm-2204qhn:253836:253974 [2] NCCL INFO Channel 08/0 : 10[2] -> 0[0] [send] via NET/IB/0(8)/GDRDMA mlx5_0:1/RoCE
        bm-2204kzq:252978:253115 [0] NCCL INFO Channel 08/0 : 10[2] -> 0[0] [receive] via NET/IB/3/GDRDMA mlx5_0:1/RoCE

    ## Channel C9
        bm-2204kzq:252978:253054 [0] NCCL INFO Channel 09/16 :    0   7   5   6   4   3   1  10   8  15  13  14  12  11   9   2

        bm-2204kzq:
            [0]mlx5_2:1/RoCE 
            [1]mlx5_3:1/RoCE 
            [2]mlx5_4:1/RoCE 
            [3]mlx5_0:1/RoCE
        
        bm-2204qhn:
            [0]mlx5_0:1/RoCE 
            [1]mlx5_2:1/RoCE 
            [2]mlx5_3:1/RoCE 
            [3]mlx5_4:1/RoCE
            
        bm-2204kzq:252978:253115 [0] NCCL INFO Channel 09/0 : 0[0] -> 7[7] via P2P/CUMEM
        bm-2204kzq:252985:253113 [7] NCCL INFO Channel 09/0 : 7[7] -> 5[5] via P2P/CUMEM
        bm-2204kzq:252983:253114 [5] NCCL INFO Channel 09/0 : 5[5] -> 6[6] via P2P/CUMEM
        bm-2204kzq:252984:253117 [6] NCCL INFO Channel 09/0 : 6[6] -> 4[4] via P2P/CUMEM
        bm-2204kzq:252982:253118 [4] NCCL INFO Channel 09/0 : 4[4] -> 3[3] via P2P/CUMEM
        bm-2204kzq:252981:253116 [3] NCCL INFO Channel 09/0 : 3[3] -> 1[1] via P2P/CUMEM
        bm-2204kzq:252979:253119 [1] NCCL INFO Channel 09/0 : 1[1] -> 10[2] [send] via NET/IB/0(2)/GDRDMA mlx5_2:1/RoCE
        bm-2204qhn:253836:253974 [2] NCCL INFO Channel 09/0 : 1[1] -> 10[2] [receive] via NET/IB/1/GDRDMA mlx5_2:1/RoCE
        bm-2204qhn:253836:253974 [2] NCCL INFO Channel 09/0 : 10[2] -> 8[0] via P2P/CUMEM
        bm-2204qhn:253834:253970 [0] NCCL INFO Channel 09/0 : 8[0] -> 15[7] via P2P/CUMEM
        bm-2204qhn:253841:253968 [7] NCCL INFO Channel 09/0 : 15[7] -> 13[5] via P2P/CUMEM
        bm-2204qhn:253839:253969 [5] NCCL INFO Channel 09/0 : 13[5] -> 14[6] via P2P/CUMEM
        bm-2204qhn:253840:253973 [6] NCCL INFO Channel 09/0 : 14[6] -> 12[4] via P2P/CUMEM
        bm-2204qhn:253838:253972 [4] NCCL INFO Channel 09/0 : 12[4] -> 11[3] via P2P/CUMEM
        bm-2204qhn:253837:253967 [3] NCCL INFO Channel 09/0 : 11[3] -> 9[1] via P2P/CUMEM
        bm-2204qhn:253835:253971 [1] NCCL INFO Channel 09/0 : 9[1] -> 2[2] [send] via NET/IB/1(10)/GDRDMA mlx5_2:1/RoCE
        bm-2204kzq:252980:253120 [2] NCCL INFO Channel 09/0 : 9[1] -> 2[2] [receive] via NET/IB/0/GDRDMA mlx5_2:1/RoCE
        bm-2204kzq:252980:253120 [2] NCCL INFO Channel 09/0 : 2[2] -> 0[0] via P2P/CUMEM

    ## Channel C10
        bm-2204kzq:252978:253054 [0] NCCL INFO Channel 10/16 :    0   7   5   6  12  11   9  10   8  15  13  14   4   3   1   2

        bm-2204kzq:
            [0]mlx5_2:1/RoCE 
            [1]mlx5_3:1/RoCE 
            [2]mlx5_4:1/RoCE 
            [3]mlx5_0:1/RoCE
        
        bm-2204qhn:
            [0]mlx5_0:1/RoCE 
            [1]mlx5_2:1/RoCE 
            [2]mlx5_3:1/RoCE 
            [3]mlx5_4:1/RoCE
            
        bm-2204kzq:252978:253115 [0] NCCL INFO Channel 10/0 : 0[0] -> 7[7] via P2P/CUMEM
        bm-2204kzq:252985:253113 [7] NCCL INFO Channel 10/0 : 7[7] -> 5[5] via P2P/CUMEM
        bm-2204kzq:252983:253114 [5] NCCL INFO Channel 10/0 : 5[5] -> 6[6] via P2P/CUMEM
        bm-2204kzq:252984:253117 [6] NCCL INFO Channel 10/0 : 6[6] -> 12[4] [send] via NET/IB/1(4)/GDRDMA mlx5_3:1/RoCE
        bm-2204qhn:253838:253972 [4] NCCL INFO Channel 10/0 : 6[6] -> 12[4] [receive] via NET/IB/2/GDRDMA mlx5_3:1/RoCE
        bm-2204qhn:253838:253972 [4] NCCL INFO Channel 10/0 : 12[4] -> 11[3] via P2P/CUMEM
        bm-2204qhn:253837:253967 [3] NCCL INFO Channel 10/0 : 11[3] -> 9[1] via P2P/CUMEM
        bm-2204qhn:253835:253971 [1] NCCL INFO Channel 10/0 : 9[1] -> 10[2] via P2P/CUMEM
        bm-2204qhn:253836:253974 [2] NCCL INFO Channel 10/0 : 10[2] -> 8[0] via P2P/CUMEM
        bm-2204qhn:253834:253970 [0] NCCL INFO Channel 10/0 : 8[0] -> 15[7] via P2P/CUMEM
        bm-2204qhn:253841:253968 [7] NCCL INFO Channel 10/0 : 15[7] -> 13[5] via P2P/CUMEM
        bm-2204qhn:253839:253969 [5] NCCL INFO Channel 10/0 : 13[5] -> 14[6] via P2P/CUMEM
        bm-2204qhn:253840:253973 [6] NCCL INFO Channel 10/0 : 14[6] -> 4[4] [send] via NET/IB/2(12)/GDRDMA mlx5_3:1/RoCE
        bm-2204kzq:252982:253118 [4] NCCL INFO Channel 10/0 : 14[6] -> 4[4] [receive] via NET/IB/1/GDRDMA mlx5_3:1/RoCE
        bm-2204kzq:252982:253118 [4] NCCL INFO Channel 10/0 : 4[4] -> 3[3] via P2P/CUMEM
        bm-2204kzq:252981:253116 [3] NCCL INFO Channel 10/0 : 3[3] -> 1[1] via P2P/CUMEM
        bm-2204kzq:252979:253119 [1] NCCL INFO Channel 10/0 : 1[1] -> 2[2] via P2P/CUMEM
        bm-2204kzq:252980:253120 [2] NCCL INFO Channel 10/0 : 2[2] -> 0[0] via P2P/CUMEM

    ## Channel C11
        bm-2204kzq:252978:253054 [0] NCCL INFO Channel 11/16 :    0   7   5  14  12  11   9  10   8  15  13   6   4   3   1   2

        bm-2204kzq:
            [0]mlx5_2:1/RoCE 
            [1]mlx5_3:1/RoCE 
            [2]mlx5_4:1/RoCE 
            [3]mlx5_0:1/RoCE
        
        bm-2204qhn:
            [0]mlx5_0:1/RoCE 
            [1]mlx5_2:1/RoCE 
            [2]mlx5_3:1/RoCE 
            [3]mlx5_4:1/RoCE
            
        bm-2204kzq:252978:253115 [0] NCCL INFO Channel 11/0 : 0[0] -> 7[7] via P2P/CUMEM
        bm-2204kzq:252985:253113 [7] NCCL INFO Channel 11/0 : 7[7] -> 5[5] via P2P/CUMEM
        bm-2204kzq:252983:253114 [5] NCCL INFO Channel 11/0 : 5[5] -> 14[6] [send] via NET/IB/2(6)/GDRDMA mlx5_4:1/RoCE
        bm-2204qhn:253840:253973 [6] NCCL INFO Channel 11/0 : 5[5] -> 14[6] [receive] via NET/IB/3/GDRDMA mlx5_4:1/RoCE
        bm-2204qhn:253840:253973 [6] NCCL INFO Channel 11/0 : 14[6] -> 12[4] via P2P/CUMEM
        bm-2204qhn:253838:253972 [4] NCCL INFO Channel 11/0 : 12[4] -> 11[3] via P2P/CUMEM
        bm-2204qhn:253837:253967 [3] NCCL INFO Channel 11/0 : 11[3] -> 9[1] via P2P/CUMEM
        bm-2204qhn:253835:253971 [1] NCCL INFO Channel 11/0 : 9[1] -> 10[2] via P2P/CUMEM
        bm-2204qhn:253836:253974 [2] NCCL INFO Channel 11/0 : 10[2] -> 8[0] via P2P/CUMEM
        bm-2204qhn:253834:253970 [0] NCCL INFO Channel 11/0 : 8[0] -> 15[7] via P2P/CUMEM
        bm-2204qhn:253841:253968 [7] NCCL INFO Channel 11/0 : 15[7] -> 13[5] via P2P/CUMEM
        bm-2204qhn:253839:253969 [5] NCCL INFO Channel 11/0 : 13[5] -> 6[6] [send] via NET/IB/3(14)/GDRDMA mlx5_4:1/RoCE
        bm-2204kzq:252984:253117 [6] NCCL INFO Channel 11/0 : 13[5] -> 6[6] [receive] via NET/IB/2/GDRDMA mlx5_4:1/RoCE
        bm-2204kzq:252984:253117 [6] NCCL INFO Channel 11/0 : 6[6] -> 4[4] via P2P/CUMEM
        bm-2204kzq:252982:253118 [4] NCCL INFO Channel 11/0 : 4[4] -> 3[3] via P2P/CUMEM
        bm-2204kzq:252981:253116 [3] NCCL INFO Channel 11/0 : 3[3] -> 1[1] via P2P/CUMEM
        bm-2204kzq:252979:253119 [1] NCCL INFO Channel 11/0 : 1[1] -> 2[2] via P2P/CUMEM
        bm-2204kzq:252980:253120 [2] NCCL INFO Channel 11/0 : 2[2] -> 0[0] via P2P/CUMEM

    ## Channel C12
        bm-2204kzq:252978:253054 [0] NCCL INFO Channel 12/16 :    0   7   5   6   4   3   1   2   8  15  13  14  12  11   9  10

        bm-2204kzq:
            [0]mlx5_2:1/RoCE 
            [1]mlx5_3:1/RoCE 
            [2]mlx5_4:1/RoCE 
            [3]mlx5_0:1/RoCE
        
        bm-2204qhn:
            [0]mlx5_0:1/RoCE 
            [1]mlx5_2:1/RoCE 
            [2]mlx5_3:1/RoCE 
            [3]mlx5_4:1/RoCE
            
        bm-2204kzq:252978:253115 [0] NCCL INFO Channel 12/0 : 0[0] -> 7[7] via P2P/CUMEM
        bm-2204kzq:252985:253113 [7] NCCL INFO Channel 12/0 : 7[7] -> 5[5] via P2P/CUMEM
        bm-2204kzq:252983:253114 [5] NCCL INFO Channel 12/0 : 5[5] -> 6[6] via P2P/CUMEM
        bm-2204kzq:252984:253117 [6] NCCL INFO Channel 12/0 : 6[6] -> 4[4] via P2P/CUMEM
        bm-2204kzq:252982:253118 [4] NCCL INFO Channel 12/0 : 4[4] -> 3[3] via P2P/CUMEM
        bm-2204kzq:252981:253116 [3] NCCL INFO Channel 12/0 : 3[3] -> 1[1] via P2P/CUMEM
        bm-2204kzq:252979:253119 [1] NCCL INFO Channel 12/0 : 1[1] -> 2[2] via P2P/CUMEM
        bm-2204kzq:252980:253120 [2] NCCL INFO Channel 12/0 : 2[2] -> 8[0] [send] via NET/IB/3(0)/GDRDMA mlx5_0:1/RoCE
        bm-2204qhn:253834:253970 [0] NCCL INFO Channel 12/0 : 2[2] -> 8[0] [receive] via NET/IB/0/GDRDMA mlx5_0:1/RoCE
        bm-2204qhn:253834:253970 [0] NCCL INFO Channel 12/0 : 8[0] -> 15[7] via P2P/CUMEM
        bm-2204qhn:253841:253968 [7] NCCL INFO Channel 12/0 : 15[7] -> 13[5] via P2P/CUMEM
        bm-2204qhn:253839:253969 [5] NCCL INFO Channel 12/0 : 13[5] -> 14[6] via P2P/CUMEM
        bm-2204qhn:253840:253973 [6] NCCL INFO Channel 12/0 : 14[6] -> 12[4] via P2P/CUMEM
        bm-2204qhn:253838:253972 [4] NCCL INFO Channel 12/0 : 12[4] -> 11[3] via P2P/CUMEM
        bm-2204qhn:253837:253967 [3] NCCL INFO Channel 12/0 : 11[3] -> 9[1] via P2P/CUMEM
        bm-2204qhn:253835:253971 [1] NCCL INFO Channel 12/0 : 9[1] -> 10[2] via P2P/CUMEM
        bm-2204qhn:253836:253974 [2] NCCL INFO Channel 12/0 : 10[2] -> 0[0] [send] via NET/IB/0(8)/GDRDMA mlx5_0:1/RoCE
        bm-2204kzq:252978:253115 [0] NCCL INFO Channel 12/0 : 10[2] -> 0[0] [receive] via NET/IB/3/GDRDMA mlx5_0:1/RoCE

    ## Channel C13
        bm-2204kzq:252978:253054 [0] NCCL INFO Channel 13/16 :    0   7   5   6   4   3   1  10   8  15  13  14  12  11   9   2

        bm-2204kzq:
            [0]mlx5_2:1/RoCE 
            [1]mlx5_3:1/RoCE 
            [2]mlx5_4:1/RoCE 
            [3]mlx5_0:1/RoCE
        
        bm-2204qhn:
            [0]mlx5_0:1/RoCE 
            [1]mlx5_2:1/RoCE 
            [2]mlx5_3:1/RoCE 
            [3]mlx5_4:1/RoCE
            
        bm-2204kzq:252980:253120 [2] NCCL INFO Channel 13/0 : 2[2] -> 0[0] via P2P/CUMEM
        bm-2204kzq:252978:253115 [0] NCCL INFO Channel 13/0 : 0[0] -> 7[7] via P2P/CUMEM
        bm-2204kzq:252985:253113 [7] NCCL INFO Channel 13/0 : 7[7] -> 5[5] via P2P/CUMEM
        bm-2204kzq:252983:253114 [5] NCCL INFO Channel 13/0 : 5[5] -> 6[6] via P2P/CUMEM
        bm-2204kzq:252984:253117 [6] NCCL INFO Channel 13/0 : 6[6] -> 4[4] via P2P/CUMEM
        bm-2204kzq:252982:253118 [4] NCCL INFO Channel 13/0 : 4[4] -> 3[3] via P2P/CUMEM
        bm-2204kzq:252981:253116 [3] NCCL INFO Channel 13/0 : 3[3] -> 1[1] via P2P/CUMEM
        bm-2204kzq:252979:253119 [1] NCCL INFO Channel 13/0 : 1[1] -> 10[2] [send] via NET/IB/0(2)/GDRDMA mlx5_2:1/RoCE
        bm-2204qhn:253836:253974 [2] NCCL INFO Channel 13/0 : 1[1] -> 10[2] [receive] via NET/IB/1/GDRDMA mlx5_2:1/RoCE
        bm-2204qhn:253836:253974 [2] NCCL INFO Channel 13/0 : 10[2] -> 8[0] via P2P/CUMEM
        bm-2204qhn:253834:253970 [0] NCCL INFO Channel 13/0 : 8[0] -> 15[7] via P2P/CUMEM
        bm-2204qhn:253841:253968 [7] NCCL INFO Channel 13/0 : 15[7] -> 13[5] via P2P/CUMEM
        bm-2204qhn:253839:253969 [5] NCCL INFO Channel 13/0 : 13[5] -> 14[6] via P2P/CUMEM
        bm-2204qhn:253840:253973 [6] NCCL INFO Channel 13/0 : 14[6] -> 12[4] via P2P/CUMEM
        bm-2204qhn:253838:253972 [4] NCCL INFO Channel 13/0 : 12[4] -> 11[3] via P2P/CUMEM
        bm-2204qhn:253837:253967 [3] NCCL INFO Channel 13/0 : 11[3] -> 9[1] via P2P/CUMEM
        bm-2204qhn:253835:253971 [1] NCCL INFO Channel 13/0 : 9[1] -> 2[2] [send] via NET/IB/1(10)/GDRDMA mlx5_2:1/RoCE
        bm-2204kzq:252980:253120 [2] NCCL INFO Channel 13/0 : 9[1] -> 2[2] [receive] via NET/IB/0/GDRDMA mlx5_2:1/RoCE

    ## Channel C14
        bm-2204kzq:252978:253054 [0] NCCL INFO Channel 14/16 :    0   7   5   6  12  11   9  10   8  15  13  14   4   3   1   2

        bm-2204kzq:
            [0]mlx5_2:1/RoCE 
            [1]mlx5_3:1/RoCE 
            [2]mlx5_4:1/RoCE 
            [3]mlx5_0:1/RoCE
        
        bm-2204qhn:
            [0]mlx5_0:1/RoCE 
            [1]mlx5_2:1/RoCE 
            [2]mlx5_3:1/RoCE 
            [3]mlx5_4:1/RoCE
            
        bm-2204kzq:252978:253115 [0] NCCL INFO Channel 14/0 : 0[0] -> 7[7] via P2P/CUMEM
        bm-2204kzq:252985:253113 [7] NCCL INFO Channel 14/0 : 7[7] -> 5[5] via P2P/CUMEM
        bm-2204kzq:252983:253114 [5] NCCL INFO Channel 14/0 : 5[5] -> 6[6] via P2P/CUMEM
        bm-2204kzq:252984:253117 [6] NCCL INFO Channel 14/0 : 6[6] -> 12[4] [send] via NET/IB/1(4)/GDRDMA mlx5_3:1/RoCE
        bm-2204qhn:253838:253972 [4] NCCL INFO Channel 14/0 : 6[6] -> 12[4] [receive] via NET/IB/2/GDRDMA mlx5_3:1/RoCE
        bm-2204qhn:253838:253972 [4] NCCL INFO Channel 14/0 : 12[4] -> 11[3] via P2P/CUMEM
        bm-2204qhn:253837:253967 [3] NCCL INFO Channel 14/0 : 11[3] -> 9[1] via P2P/CUMEM
        bm-2204qhn:253835:253971 [1] NCCL INFO Channel 14/0 : 9[1] -> 10[2] via P2P/CUMEM
        bm-2204qhn:253836:253974 [2] NCCL INFO Channel 14/0 : 10[2] -> 8[0] via P2P/CUMEM
        bm-2204qhn:253834:253970 [0] NCCL INFO Channel 14/0 : 8[0] -> 15[7] via P2P/CUMEM
        bm-2204qhn:253841:253968 [7] NCCL INFO Channel 14/0 : 15[7] -> 13[5] via P2P/CUMEM
        bm-2204qhn:253839:253969 [5] NCCL INFO Channel 14/0 : 13[5] -> 14[6] via P2P/CUMEM
        bm-2204qhn:253840:253973 [6] NCCL INFO Channel 14/0 : 14[6] -> 4[4] [send] via NET/IB/2(12)/GDRDMA mlx5_3:1/RoCE
        bm-2204kzq:252982:253118 [4] NCCL INFO Channel 14/0 : 14[6] -> 4[4] [receive] via NET/IB/1/GDRDMA mlx5_3:1/RoCE
        bm-2204kzq:252982:253118 [4] NCCL INFO Channel 14/0 : 4[4] -> 3[3] via P2P/CUMEM
        bm-2204kzq:252981:253116 [3] NCCL INFO Channel 14/0 : 3[3] -> 1[1] via P2P/CUMEM
        bm-2204kzq:252979:253119 [1] NCCL INFO Channel 14/0 : 1[1] -> 2[2] via P2P/CUMEM
        bm-2204kzq:252980:253120 [2] NCCL INFO Channel 14/0 : 2[2] -> 0[0] via P2P/CUMEM

    ## Channel C15
        bm-2204kzq:252978:253054 [0] NCCL INFO Channel 15/16 :    0   7   5  14  12  11   9  10   8  15  13   6   4   3   1   2
        
        bm-2204kzq:
            [0]mlx5_2:1/RoCE 
            [1]mlx5_3:1/RoCE 
            [2]mlx5_4:1/RoCE 
            [3]mlx5_0:1/RoCE
        
        bm-2204qhn:
            [0]mlx5_0:1/RoCE 
            [1]mlx5_2:1/RoCE 
            [2]mlx5_3:1/RoCE 
            [3]mlx5_4:1/RoCE
            
        bm-2204kzq:252978:253115 [0] NCCL INFO Channel 15/0 : 0[0] -> 7[7] via P2P/CUMEM
        bm-2204kzq:252985:253113 [7] NCCL INFO Channel 15/0 : 7[7] -> 5[5] via P2P/CUMEM
        bm-2204kzq:252983:253114 [5] NCCL INFO Channel 15/0 : 5[5] -> 14[6] [send] via NET/IB/2(6)/GDRDMA mlx5_4:1/RoCE
        bm-2204qhn:253840:253973 [6] NCCL INFO Channel 15/0 : 5[5] -> 14[6] [receive] via NET/IB/3/GDRDMA mlx5_4:1/RoCE
        bm-2204qhn:253840:253973 [6] NCCL INFO Channel 15/0 : 14[6] -> 12[4] via P2P/CUMEM
        bm-2204qhn:253838:253972 [4] NCCL INFO Channel 15/0 : 12[4] -> 11[3] via P2P/CUMEM
        bm-2204qhn:253837:253967 [3] NCCL INFO Channel 15/0 : 11[3] -> 9[1] via P2P/CUMEM
        bm-2204qhn:253835:253971 [1] NCCL INFO Channel 15/0 : 9[1] -> 10[2] via P2P/CUMEM
        bm-2204qhn:253836:253974 [2] NCCL INFO Channel 15/0 : 10[2] -> 8[0] via P2P/CUMEM
        bm-2204qhn:253834:253970 [0] NCCL INFO Channel 15/0 : 8[0] -> 15[7] via P2P/CUMEM
        bm-2204qhn:253841:253968 [7] NCCL INFO Channel 15/0 : 15[7] -> 13[5] via P2P/CUMEM
        bm-2204qhn:253839:253969 [5] NCCL INFO Channel 15/0 : 13[5] -> 6[6] [send] via NET/IB/3(14)/GDRDMA mlx5_4:1/RoCE
        bm-2204kzq:252984:253117 [6] NCCL INFO Channel 15/0 : 13[5] -> 6[6] [receive] via NET/IB/2/GDRDMA mlx5_4:1/RoCE
        bm-2204kzq:252984:253117 [6] NCCL INFO Channel 15/0 : 6[6] -> 4[4] via P2P/CUMEM
        bm-2204kzq:252982:253118 [4] NCCL INFO Channel 15/0 : 4[4] -> 3[3] via P2P/CUMEM
        bm-2204kzq:252981:253116 [3] NCCL INFO Channel 15/0 : 3[3] -> 1[1] via P2P/CUMEM
        bm-2204kzq:252979:253119 [1] NCCL INFO Channel 15/0 : 1[1] -> 2[2] via P2P/CUMEM
        bm-2204kzq:252980:253120 [2] NCCL INFO Channel 15/0 : 2[2] -> 0[0] via P2P/CUMEM

配置指导:CX-N的ZTP功能验证-以MC-LAG场景为例

1 介绍

2 工作原理

3 具体配置

3.1 MC-LAG场景准备

3.1.1 物理拓扑

3.1.2 设备接口信息

3.1.3 文件导出

3.1.4 恢复设备出场设置

3.1.5 启动ZTP服务

3.2 DHCP配置

3.3 配置文件上传FTP

4 验证

4.1 配置验证

4.1.1 Spine1

4.1.2 Leaf1

4.1.3 Leaf2

4.1.4 Leaf3

4.1.5 Leaf4

4.2 服务器连通性验证

4.2.1 服务器配置

4.2.2 服务器互相访问

4.3 交换机功能验证

4.3.1 BGP

4.3.2 MC-LAG

4.3.3 VXLAN EVPN

4.3.4 路由

1 介绍

零配置部署ZTP(Zero Touch Provisioning)是指新出厂或者空配置设备(要求设备的/host/ztp/ztp_data.json不存在以及/etc/sonic/config_db.json没有被改动还是默认配置状态)上电时自动加载开局文件(配置文件、升级文件)的功能,实现设备的免现场配置和部署,从而降低人力成本,提升部署效率(需要提前编辑好设备配置文件)。本文旨在指导使用ZTP方式自动化完成CX-N设备的MC-LAG场景的配置工作。

工作原理

设备使用基于DHCP协议实现的ZTP功能,通过DHCP协议Option字段附带配置文件、升级文件的地址和路径信息,实现相关开局文件的自动化获取和加载任务。本质上就是从FTP获取config_db.json文件替换交换机中的/etc/sonic/config_db.json文件,从而实现配置的自动下发。

ZTP功能工作原理

以设备出厂状态为例:

  1. 首先ZTP服务会检查自身设备的/etc/sonic/config_db.json文件相对于默认配置有无改动以及检查/host/ztp/ztp_data.json存在——当ztp成功执行的时候会以此文件来记录操作过程。
  2. 检测到设备没有进行配置后,通过DHCP服务来获取存放ZTP配置的FTP服务器信息,正常DHCP服务器应当配置option bootfile-name ftp://ftpserver:test@10.230.1.11/ztp.json 字段。
  3. 通过获取FTP服务器的ztp.json中的配置信息,到FTP对应路径下获得与设备序列号相同文件名的配置文件。
  4. 将FTP中获取的config_db.json文件覆盖本身的config_db.json文件,重启服务器信息。

至此,整个ZTP零配置部署流程完成。

具体配置

3.1 MC-LAG场景准备

3.1.1 物理拓扑

拓扑图

3.1.2设备接口信息

设备接口信息

3.1.3文件导出

完成MC-LAG场景配置后需要导出所有交换机的/etc/sonic/config_db.json文件,并将config_db.json文件改名为设备序列号。以Spine1为例,其序列号如图所示,因此需要将config_db.json改名F018716A006.json。

获取序列号

五台交换机的配置文件如下所示:

五台交换机的配置文件

3.1.4恢复设备出场设置

各交换机以此执行如下命令:

admin@Spine1:~$ sudo sonic-cli
Spine1# delete startup-config

3.1.5启动ZTP服务

以Spine1为例,所有交换机按如下方式开启ZTP服务:

admin@Spine1:~$ sudo config ztp enable
admin@Spine1:~$ sudo config ztp run

3.2 DHCP配置

首先准备好FTP服务器(验证使用10.230.1.11,FTP账号密码为ftpuser/ftpuser),修改DHCP服务器的配置文件/etc/dhcp/dhcpd.conf,再对应网段添加option bootfile-nameftp://ftpuser:ftpuser@10.230.1.11/ztp.json。配置完成后重启dhcp服务。

root@adminserver:/etc/dhcp# vi dhcpd.conf
subnet 10.230.1.0  netmask 255.255.255.0 {
range 10.230.1.100  10.230.1.240;
option routers 10.230.1.1;
option broadcast-address 10.230.1.255;
default-lease-time 21600;
max-lease-time 43200;
allow leasequery;
option domain-name-servers  223.5.5.5,114.114.114.114;
option bootfile-name "ftp://ftpuser:ftpuser@10.230.1.11/ztp.json";
}

3.3 配置文件上传FTP

在ftp的根目录下上传ztp.json文件,文件中要配置好ZTP的操作内容。config_db.json指定配置文件所在目录,identifier字段为使用序列号serial-number作为配置识别参数。

{
  "ztp": {
    "configdb-json": {
      "dynamic-url": {
        "source": {
          "prefix": "ftp://ftpuser:ftpuser@10.230.1.11/ZTP_CFG/",
          "identifier": "serial-number",
          "suffix": ".json"
        },
        "destination": "/etc/sonic/config_db.json"
      }
    },
     "reboot-on-success": true
  }
}

上传config_db.json配置文件到FTP的ZTP_CFG目录下。

config_db.json文件

重启设备,启动后设备将打印ZTP输出结果。打印成功后,可以开始进行配置验证工作。

输出打印

验证

4.1 配置验证

4.1.1 Spine1

Spine1# show running-config
!
interface ethernet 0/0
 fec rs
 ip address 10.0.10.2/30
 mtu 9216
 speed 100000
exit
!
interface ethernet 0/4
 fec rs
 ip address 10.0.20.2/30
 mtu 9216
 speed 100000
exit
!
interface ethernet 0/8
 fec rs
 ip address 10.0.30.2/30
 mtu 9216
 speed 100000
exit
!
interface ethernet 0/12
 fec rs
 ip address 10.0.40.2/30
 mtu 9216
 speed 100000
exit
!
interface loopback 0
 ip address 10.10.25.1/32
exit
!
hostname Spine1
!
interface mgmt 0
 ip address 10.230.1.7/24 gw 10.230.1.1
exit
!
router bgp 65201
 bgp router-id 10.10.25.1
 no bgp ebgp-requires-policy
 neighbor PEER_V4_EBGP peer-group
 neighbor PEER_V4_EBGP bfd
 neighbor 10.0.10.1 remote-as 65101
 neighbor 10.0.10.1 peer-group PEER_V4_EBGP
 neighbor 10.0.20.1 remote-as 65101
 neighbor 10.0.20.1 peer-group PEER_V4_EBGP
 neighbor 10.0.30.1 remote-as 65102
 neighbor 10.0.30.1 peer-group PEER_V4_EBGP
 neighbor 10.0.40.1 remote-as 65102
 neighbor 10.0.40.1 peer-group PEER_V4_EBGP
 !
 address-family ipv4 unicast
  network 10.10.25.1/32
 exit-address-family
 !
 address-family l2vpn evpn
  neighbor PEER_V4_EBGP activate
  advertise-all-vni
 exit-address-family
exit
!
end

4.1.2 Leaf1

Leaf1# show running-config
!
interface vxlan 0
 source 10.10.25.3
exit
!
vrf 100
 mac 60:eb:5a:00:86:20
 vni 1000 vxlan 0
exit-vrf
!
vlan 100
 vni 10
!
vlan 300
!
interface link-aggregation 1
 description server1
 switchport access vlan 100
exit
!
interface link-aggregation 2
 switchport trunk vlan 100
 switchport trunk vlan 300
exit
!
interface ethernet 0/0
 mtu 9216
 no fec
 speed 10000
 link-aggregation-group 1
exit
!
interface ethernet 0/48
 fec rs
 ip address 10.0.10.1/30
 mtu 9216
 speed 100000
exit
!
interface ethernet 0/52
 fec rs
 mtu 9216
 speed 100000
exit
!
interface ethernet 0/56
 fec rs
 mtu 9216
 speed 100000
 link-aggregation-group 2
exit
!
interface ethernet 0/60
 fec rs
 mtu 9216
 speed 100000
 link-aggregation-group 2
exit
!
interface ethernet 0/64
 fec rs
 mtu 9216
 speed 100000
exit
!
interface ethernet 0/68
 fec rs
 mtu 9216
 speed 100000
exit
!
interface ethernet 0/72
 fec rs
 mtu 9216
 speed 100000
exit
!
interface ethernet 0/76
 fec rs
 mtu 9216
 speed 100000
exit
!
interface loopback 0
 ip address 10.10.25.3/32
exit
!
interface vlan 100
 ip address 100.0.10.1/24
 mac-address 18:17:25:37:64:40
 vrf 100
exit
!
interface vlan 300
 ip address 10.0.0.3/24
exit
!
hostname Leaf1
!
interface mgmt 0
 ip address 10.230.1.18/24 gw 10.230.1.1
exit
!
mclag domain 1
 local-address 10.0.0.3
 peer-address 10.0.0.4
 peer-link link-aggregation 2
 commit
 member lag 1
!
router bgp 65101
 bgp router-id 10.10.25.3
 no bgp ebgp-requires-policy
 neighbor 10.0.10.2 remote-as 65201
 neighbor 10.0.10.2 bfd
 !
 address-family ipv4 unicast
  network 10.10.25.3/32
network 10.0.10.1/30
 exit-address-family
 !
 address-family l2vpn evpn
  neighbor 10.0.10.2 activate
  advertise-all-vni
 exit-address-family
exit
!
end

4.1.3 Leaf2

Leaf2# show running-config
!
interface vxlan 0
 source 10.10.25.3
exit
!
vrf 100
 mac 60:eb:5a:00:86:20
 vni 1000 vxlan 0
exit-vrf
!
vlan 100
 vni 10
!
vlan 300
!
interface link-aggregation 1
 switchport access vlan 100
exit
!
interface link-aggregation 2
 switchport trunk vlan 100
 switchport trunk vlan 300
exit
!
interface ethernet 0/0
 mtu 9216
 no fec
 speed 10000
 link-aggregation-group 1
exit
!
interface ethernet 0/48
 fec rs
 ip address 10.0.20.1/30
 mtu 9216
 speed 100000
exit
!
interface ethernet 0/56
 fec rs
 mtu 9216
 speed 100000
 link-aggregation-group 2
exit
!
interface ethernet 0/60
 fec rs
 mtu 9216
 speed 100000
 link-aggregation-group 2
exit
!
interface loopback 0
 ip address 10.10.25.3/32
exit
!
interface vlan 100
 ip address 100.0.10.1/24
 mac-address 18:17:25:37:64:40
 vrf 100
exit
!
interface vlan 300
 ip address 10.0.0.4/24
exit
!
hostname Leaf2
!
interface mgmt 0
 ip address 10.230.1.19/24 gw 10.230.1.1
exit
!
mclag domain 1
 local-address 10.0.0.4
 peer-address 10.0.0.3
 peer-link link-aggregation 2
 commit
 member lag 1
!
router bgp 65101
 bgp router-id 10.10.25.3
 no bgp ebgp-requires-policy
 neighbor 10.0.20.2 remote-as 65201
 neighbor 10.0.20.2 bfd
 !
 address-family ipv4 unicast
  network 10.10.25.3/32
network 10.0.20.1/30
 exit-address-family
 !
 address-family l2vpn evpn
  neighbor 10.0.20.2 activate
  advertise-all-vni
 exit-address-family
exit
!
end

4.1.4 Leaf3

Leaf3# show running-config
!
interface vxlan 0
 source 10.10.25.4
exit
!
vrf 200
 mac 60:eb:5a:00:86:22
 vni 1000 vxlan 0
exit-vrf
!
vlan 200
 vni 20
!
vlan 300
!
interface link-aggregation 1
 switchport access vlan 200
exit
!
interface link-aggregation 2
 switchport trunk vlan 200
 switchport trunk vlan 300
exit
!
interface ethernet 0/0
 mtu 9216
 no fec
 speed 10000
 link-aggregation-group 1
exit
!
interface ethernet 0/48
 fec rs
 ip address 10.0.30.1/30
 mtu 9216
 speed 100000
exit
!
interface ethernet 0/56
 fec rs
 mtu 9216
 speed 100000
 link-aggregation-group 2
exit
!
interface ethernet 0/60
 fec rs
 mtu 9216
 speed 100000
 link-aggregation-group 2
exit
!
interface loopback 0
 ip address 10.10.25.4/32
exit
!
interface vlan 200
 ip address 100.0.20.1/24
 mac-address 18:17:25:37:64:32
 vrf 200
exit
!
interface vlan 300
 ip address 10.0.0.5/24
exit
!
hostname Leaf3
!
interface mgmt 0
 ip address 10.230.1.20/24 gw 10.230.1.1
exit
!
mclag domain 1
 local-address 10.0.0.5
 peer-address 10.0.0.6
 peer-link link-aggregation 2
 commit
 member lag 1
!
router bgp 65102
 bgp router-id 10.10.25.4
 no bgp ebgp-requires-policy
 neighbor 10.0.30.2 remote-as 65201
 neighbor 10.0.30.2 bfd
 !
 address-family ipv4 unicast
  network 10.10.25.4/32
network 10.0.30.1/30
 exit-address-family
 !
 address-family l2vpn evpn
  neighbor 10.0.30.2 activate
  advertise-all-vni
 exit-address-family
exit
!
end

4.1.5 Leaf4

Leaf4# show running-config
!
interface vxlan 0
 source 10.10.25.4
exit
!
vrf 200
 mac 60:eb:5a:00:86:22
 vni 1000 vxlan 0
exit-vrf
!
vlan 200
 vni 20
!
vlan 300
!
interface link-aggregation 1
 switchport access vlan 200
exit
!
interface link-aggregation 2
 switchport trunk vlan 200
 switchport trunk vlan 300
exit
!
interface ethernet 0/0
 mtu 9216
 no fec
 speed 10000
 link-aggregation-group 1
exit
!
interface ethernet 0/48
 fec rs
 ip address 10.0.40.1/30
 mtu 9216
 speed 100000
exit
!
interface ethernet 0/56
 fec rs
 mtu 9216
 speed 100000
 link-aggregation-group 2
exit
!
interface ethernet 0/60
 fec rs
 mtu 9216
 speed 100000
 link-aggregation-group 2
exit
!
interface loopback 0
 ip address 10.10.25.4/32
exit
!
interface vlan 200
 ip address 100.0.20.1/24
 mac-address 18:17:25:37:64:32
 vrf 200
exit
!
interface vlan 300
 ip address 10.0.0.6/24
exit
!
hostname Leaf4
!
interface mgmt 0
 ip address 10.230.1.21/24 gw 10.230.1.1
exit
!
mclag domain 1
 local-address 10.0.0.6
 peer-address 10.0.0.5
 peer-link link-aggregation 2
 commit
 member lag 1
!
router bgp 65102
 bgp router-id 10.10.25.4
 no bgp ebgp-requires-policy
 neighbor 10.0.40.2 remote-as 65201
 neighbor 10.0.40.2 bfd
 !
 address-family ipv4 unicast
  network 10.10.25.4/32
network 10.0.40.1/30
 exit-address-family
 !
 address-family l2vpn evpn
  neighbor 10.0.40.2 activate
  advertise-all-vni
 exit-address-family
exit
!
end

4.2 服务器连通性验证

4.2.1 服务器配置

Server1:
网卡配置
4.2.1-1
路由添加
[root@server1 ~]# route add -net 100.0.20.0 netmask 255.255.255.0  gw 100.0.10.1 dev bond0
Server2:
网卡配置
4.2.1-2

路由添加
[root@server2 ~]# route add -net 100.0.10.0 netmask 255.255.255.0 gw 100.0.20.1 dev bond0

4.2.2 服务器互相访问

Server1:

4.2.2-1

Server2:

4.2.2-2

4.3 交换机功能验证

4.3.1 BGP

Spine1:

4.3.1-1

Leaf1:

4.3.1-2

Leaf2:

4.3.1-3

Leaf3:

4.3.1-4

Leaf4:

4.3.1-5

4.3.2 MC-LAG

Leaf1:

4.3.2-1

Leaf2:

4.3.2-2

Leaf3:

4.3.2-3

Leaf4:

4.3.2-4

4.3.3 VXLAN EVPN

Leaf1:

4.3.3-1

Leaf2:

4.3.3-2

Leaf3:

4.3.3-3

Leaf4:

4.3.3-4

4.3.4 路由

Leaf1:

4.3.4-1

Leaf2:

4.3.4-2

Leaf3:

4.3.4-3

Leaf4:

4.3.4-4

部署指南:基于Asterfusion CX312-T和CX532-T部署 EVPN-VXLAN

1 目标与物理网络拓扑

2 硬件与软件环境

3 解决方案:BGP EVPN和VXLAN

3.1 逻辑组网与配置思路

3.2 配置步骤

4 测试结果

1 目标与物理网络拓扑

本文主要描述如何在Asterfusion CX312P-T和CX532P-T(以下简称CX312和CX532)搭建的网络上部署如下解决方案:

  • BGP EVPNVXLAN

在网络上承载VXLAN网络,将原本在服务器上进行的封装、去封装全部从Server端卸载到CX312内的VTEP上,并且在网络上启动BGP EVPN,自动化地创建VXLAN隧道、传递虚拟网络路由。

如上解决方案共用一个物理拓扑,如图1所示:

物理网络拓扑
图1:物理网络拓扑

部署过程中所涉及到的设备、接口及管理网口的IP地址如下表1所示:

设备名称设备型号IP地址备注
Spine1CX532-T10.230.1.7
Spine2CX532-T10.230.1.8
Leaf1CX312-T10.230.1.18
Leaf2CX312-T10.230.1.19
Servrr1X8610.230.1.11互联网口ens1f2
Servrr2X8610.230.1.12互联网口ens1f3

表1:设备管理口列表

2 硬件与软件环境

部署环境中涉及到的硬件和软件如表2和表3所示:

名称型号硬件指标数量备注
交换机CX532-T【参见产品彩页】2
交换机CX312-T【参见产品彩页】2
服务器X862本方案采用10G网卡
光模块10GSFP+4
光模块100GQSFP2812
光纤多模100G适用6
光纤多模10G/25G适用2

表2:硬件环境

名称版本
AFCV5.0.0
服务器系统CentOS Linux 7.9.2009
服务器内核3.10.0-1127.18.2.el7

表3:软件环境

3 解决方案:BGP EVPN和VXLAN

3.1 逻辑组网与配置思路

BGP EVPN和VXLAN方案网络拓扑与接口配置

图3:BGP EVPN和VXLAN方案网络拓扑与接口配置

配置思路:

  1. 配置各交换机的端口IP信息
  2. 配置Leaf1和Leaf2的VLAN信息
  3. 配置各交换机的BGP
  4. 配置Leaf1和Leaf2使能EVPN
  5. Leaf1和Leaf2创建Vnet,绑定VLAN
  6. Leaf1和Leaf2配置二层和三层VXLAN映射
  7. 配置Server1和Server2的IP和路由信息
  8. 测试Server1和Server2的连通性
  9. 查看Leaf1的路由信息
  10. 查看Leaf2的路由信息

3.2 配置步骤

  • 配置各交换机的端口IP信息
Spine1:
sudo config interface ip add Ethernet4 10.0.10.2/24
sudo config interface ip add Ethernet8 10.0.11.2/24

Spine2:
sudo config interface ip add Ethernet4 10.1.10.2/24
sudo config interface ip add Ethernet8 10.1.11.2/24

Leaf1:
sudo config interface ip add Ethernet48 10.0.10.1/24
sudo config interface ip add Ethernet52 10.1.10.1/24

Leaf2:
sudo config interface ip add Ethernet48 10.0.11.1/24
sudo config interface ip add Ethernet52 10.1.11.1/24
  • 配置Leaf1和Leaf2的VLAN信息并配置好网口速率
Leaf1:
sudo config vlan add 10
sudo config interface ip add Vlan10 100.0.10.1/24
sudo config interface mac_address set Vlan10 18:17:25:55:17:69
sudo config vlan member add 10 Ethernet2 -u
sudo config interface speed Ethernet2 10000

Leaf2:
sudo config vlan add 20
sudo config interface ip add Vlan20 100.0.20.1/24
sudo config interface mac_address set Vlan20 18:17:25:55:17:71
sudo config vlan member add 20 Ethernet3 -u
sudo config interface speed Ethernet3 10000
  • 配置各交换机的BGP
Spine1:
sudo config bgp asn 65228
sudo config interface ip add Loopback0 10.10.0.100/32
sudo config bgp add neighbor 10.0.10.1 -a 65230 -l 10.0.10.2 -n Leaf1
sudo config bgp add neighbor 10.0.11.1 -a 65231 -l 10.0.11.2 -n Leaf2

Spine2:
sudo config bgp asn 65229
sudo config interface ip add Loopback0 10.10.0.110/32
sudo config bgp add neighbor 10.1.10.1 -a 65230 -l 10.1.10.2 -n Leaf1
sudo config bgp add neighbor 10.1.11.1 -a 65231 -l 10.1.11.2 -n Leaf2

Leaf1:
sudo config bgp asn 65230
sudo config interface ip add Loopback0 10.10.0.120/32
sudo config bgp add neighbor 10.0.10.2 -a 65228 -l 10.0.10.1 -n Spine1
sudo config bgp add neighbor 10.1.10.2 -a 65229 -l 10.1.10.1 -n Spine2

Leaf2:
sudo config bgp asn 65231
sudo config interface ip add Loopback0 10.10.0.130/32
sudo config bgp add neighbor 10.0.11.2 -a 65228 -l 10.0.11.1 -n Spine1
sudo config bgp add neighbor 10.1.11.2 -a 65229 -l 10.1.11.1 -n Spine2
  • 配置Leaf1和Leaf2使能EPVN
Leaf1:
sudo config evpn enable 10.10.0.120

Leaf2:
sudo config evpn enable 10.10.0.130
  • Leaf1和Leaf2创建Vnet,绑定VLAN
Leaf1:
sudo config vnet add Vnet123 -mac 18:17:25:55:17:69
sudo config interface vnet bind Vlan10 Vnet123 

Leaf2:
sudo config vnet add Vnet456 -mac 18:17:25:55:17:71
sudo config interface vnet bind Vlan20 Vnet456
  • Leaf1和Leaf2配置二层和三层VXLAN映射
Leaf1:
sudo config evpn map add 10 Vlan10
sudo config evpn map add 1000 Vnet123

Leaf2:
sudo config evpn map add 20 Vlan20
sudo config evpn map add 1000 Vnet456
sudo config evpn enable 10.10.0.130
  • 保存配置并重新加载
sudo config save -y
sudo config reload -y
  • 配置Server1和Server2的IP和路由信息
Server1:
[root@server1 ~]# ifconfig ens1f2

 
[root@server1 ~]# route add -net 100.0.20.0 netmask 255.255.255.0 gw 100.0.10.1 dev ens1f2

Server:2

 
[root@server1 ~]# route add -net 100.0.10.0 netmask 255.255.255.0 gw 100.0.20.1 dev ens1f3
  • 测试Server1和Server2的连通性
[root@server1 ~]# ping 100.0.20.3

 
[root@server1 ~]# ping 100.0.10.2

 
  • 查看Leaf1的路由信息
查看VTEP信息
admin@Leaf1:~$ show evpn status

交换机路由信息
admin@Leaf1:~$ ip route show


下面信息显示Server2的路由转发到了Leaf1

admin@Leaf1:~$ ip neigh show nud all | grep Vlan

admin@Leaf1:~$ sudo bridge fdb|grep vxlan

admin@Leaf1:~$ show ip route vrf Vnet123
  • 查看Leaf2的路由信息
查看VTEP信息
admin@Leaf2:~$ show evpn status

交换机路由信息
admin@Leaf2:~$ ip route show

下面信息显示Server2的路由转发到了Leaf1
admin@Leaf2:~$ ip neigh show nud all | grep Vlan

admin@Leaf2:~$ sudo bridge fdb |grep vxlan

admin@Leaf2:~$ show ip route vrf Vnet123

4 测试结果

  • Server1Server2之间使用交换机建立的VXLAN通道完成了通信;
  • Leaf1Leaf2对服务器之间的通信进行了VXLAN封装/去封装和L2/L3路由转发。

结论: VXLAN网络的封装、去封装可以从Server端卸载到CX312内的VTEP上,并且在网络上启动BGP EVPN,自动化地创建VXLAN隧道、传递虚拟网络路由。

部署教程:在VM上进行Soft-RoCE的功能验证与性能测试

1 概述

2 硬件与软件环境

3 验证思路及过程

3.1 验证思路

3.2 验证过程

3.2.1 配置部署Soft-RoCE

3.2.2 配置部署MPI环境

3.2.3 安装性能测试工具

3.2.4 进行性能对比测试

3.2.5 进行可用性测试

4 总结

1概述

RDMA(Remote Direct Memory Access)技术是一种基于网络的内存访问技术,它允许内存数据在计算机之间直接传输,无需CPU或操作系统的参与。目前,RDMA技术被广泛应用于超算、AI训练、存储等网络密集型场景。虽然RDMA技术的性能十分可观,但是需要专用的RDMA网卡,为了兼容普通网卡,IBTA提出了一种RDMA的软件实现方式——SoftRoCE。SoftRoCE整体由软件实现,底层使用普通的以太网卡,和硬件方案相比性能较差,但优势在于能用普通以太网卡与RDMA网卡通信。

本文档主要讲解如何在RHEL的社区发行版Rocky 8.5系统上配置部署SoftRoCE,进行TCP/IP模式和SoftRoCE模式的性能对比测试,以及是否可以正常运行MPI应用。

2硬件与软件环境

验证过程中涉及到的硬件和软件环境如表2-1和表2-2所示。

配置信息备注
CPU8 vCPUs
内存8 GB
硬盘100GB
网卡10GE
表2-1:虚拟机配置
软件版本备注
系统Rocky Linux 8.5
iperf33.5
perftest23.04.0.0.23
OpenMPI4.1.1
OSU Micro-Benchmarks5.6.3
表2-2:软件环境

3验证思路及过程

3.1验证思路

为了验证Soft-RoCE当前版本的可用性和性能,本次验证使用了2台Linux虚拟机配置部署Soft-RoCE,并进行RDMA网卡参数配置、MPI运行环境和应用的安装配置,最后再进行性能测试。

3.2验证过程

两台Server上需要进行同样的操作,此处只展示Server1上的操作步骤。

3.2.1配置部署Soft-RoCE

# 安装Soft-RoCE
[root@server1 ~]# dnf install rdma-core iproute libibverbs libibverbs-utils infiniband-diags
[root@server1 ~]# modprobe rdma_rxe
[root@server1 ~]# lsmod | grep rxe
rdma_rxe             131072  0
ib_uverbs            159744  2 rdma_rxe,rdma_ucm
ip6_udp_tunnel      16384   1 rdma_rxe
udp_tunnel           20480   1 rdma_rxe
ib_core               393216  11 rdma_cm,rdma_rxe,rpcrdma,ib_srpt,iw_cm,ib_iser, ib_umad,ib_isert,rdma_ucm,ib_uverbs,ib_cm
# 创建Soft-RoCE接口
[root@server1 ~]# rdma link add rxe_eth0 type rxe netdev ens192
[root@server1 ~]# ibv_devices 
    device                 node GUID
    ------              ----------------
rxe_eth0            020c29fffee73e3f
# 尝试配置无损相关参数,发现不可配置
[root@server1 ~]# ls /sys/class/net/
ens192  lo  virbr0  virbr0-nic
[root@server1 ~]# ls /sys/class/net/ens192/ -lh
total 0
-r--r--r--.  1 root root 4.0K Feb 21 16:41 addr_assign_type
-r--r--r--.  1 root root 4.0K Feb 21 16:41 address
-r--r--r--.  1 root root 4.0K Feb 21 16:41 addr_len
-r--r--r--.  1 root root 4.0K Feb 21 16:41 broadcast
-rw-r--r--.  1 root root 4.0K Feb 21 16:41 carrier
-r--r--r--.  1 root root 4.0K Feb 21 16:41 carrier_changes
-r--r--r--.  1 root root 4.0K Feb 21 16:41 carrier_down_count
-r--r--r--.  1 root root 4.0K Feb 21 16:41 carrier_up_count
lrwxrwxrwx.  1 root root    0 Feb 21 16:41 device -> ../../../0000:0b:00.0
-r--r--r--.  1 root root 4.0K Feb 21 16:41 dev_id
-r--r--r--.  1 root root 4.0K Feb 21 16:41 dev_port
-r--r--r--.  1 root root 4.0K Feb 21 16:41 dormant
-r--r--r--.  1 root root 4.0K Feb 21 16:41 duplex
-rw-r--r--.  1 root root 4.0K Feb 21 16:41 flags
-rw-r--r--.  1 root root 4.0K Feb 21 16:41 gro_flush_timeout
-rw-r--r--.  1 root root 4.0K Feb 21 16:41 ifalias
-r--r--r--.  1 root root 4.0K Feb 21 16:41 ifindex
-r--r--r--.  1 root root 4.0K Feb 21 16:41 iflink
-r--r--r--.  1 root root 4.0K Feb 21 16:41 link_mode
-rw-r--r--.  1 root root 4.0K Feb 21 16:41 mtu
-r--r--r--.  1 root root 4.0K Feb 21 16:41 name_assign_type
-rw-r--r--.  1 root root 4.0K Feb 21 16:41 napi_defer_hard_irqs
-rw-r--r--.  1 root root 4.0K Feb 21 16:41 netdev_group
-r--r--r--.  1 root root 4.0K Feb 21 16:41 operstate
-r--r--r--.  1 root root 4.0K Feb 21 16:41 phys_port_id
-r--r--r--.  1 root root 4.0K Feb 21 16:41 phys_port_name
-r--r--r--.  1 root root 4.0K Feb 21 16:41 phys_switch_id
drwxr-xr-x.  2 root root    0 Feb 21 16:41 power
-rw-r--r--.  1 root root 4.0K Feb 21 16:41 proto_down
drwxr-xr-x. 18 root root    0 Feb 21 16:41 queues
-r--r--r--.  1 root root 4.0K Feb 21 16:41 speed
drwxr-xr-x.  2 root root    0 Feb 21 16:41 statistics
lrwxrwxrwx.  1 root root    0 Feb 21 16:41 subsystem -> ../../../../../../class/net
-r--r--r--.  1 root root 4.0K Feb 21 16:41 testing
-rw-r--r--.  1 root root 4.0K Feb 21 16:41 threaded
-rw-r--r--.  1 root root 4.0K Feb 21 16:41 tx_queue_len
-r--r--r--.  1 root root 4.0K Feb 21 16:41 type
-rw-r--r--.  1 root root 4.0K Feb 21 16:41 uevent

3.2.2配置部署MPI环境

# 安装OpenMPI
[root@server1 ~]# dnf install openmpi openmpi-devel
[root@server1 ~]# vim .bashrc
# 配置OpenMPI的环境变量
[root@server1 ~]# export PATH=$PATH:/usr/lib64/openmpi/bin
[root@server1 ~]# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64/openmpi/lib
[root@server1 ~]# source .bashr
[root@server1 ~]# mpirun --version
mpirun (Open MPI) 4.1.1

Report bugs to http://www.open-mpi.org/community/help/
# 修改主机名,配置免密登陆和Hosts
[root@server1 ~]# hostname server1
[root@server1 ~]# ssh-keygen
[root@server1 ~]# ssh-copy-id root@10.240.3.52
[root@server1 ~]# cat /etc/hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

10.240.3.51 server1
10.240.3.52 server2
# 测试MPI运行环境
[root@server1 ~]# mpirun --allow-run-as-root -np 2 -host server1,server2 /usr/bin/hostname
server1
server2

3.2.3安装性能测试工具

# 安装iperf3
[root@server1 ~]# dnf install iperf3
# 安装perftest
[root@server1 ~]# dnf install perftest
# 安装OSU Micro-Benchmarks
[root@server1 ~]# dnf group install "Development Tools"
[root@server1 ~]# mkdir mpi
[root@server1 ~]# cd mpi/
[root@server1 mpi]# wget http://mvapich.cse.ohio-state.edu/download/mvapich/osu-micro-benchmarks-5.6.3.tar.gz
[root@server1 mpi]# tar xvf osu-micro-benchmarks-5.6.3.tar.gz
[root@server1 mpi]# cd osu-micro-benchmarks-5.6.3/
[root@server1 osu-micro-benchmarks-5.6.3]# ./configure CC=mpicc CXX=mpicc
[root@server1 osu-micro-benchmarks-5.6.3]# make -j
[root@server1 osu-micro-benchmarks-5.6.3]# ls -lt mpi/pt2pt/
total 1556
-rwxr-xr-x. 1 root root 153800 Feb 27 10:41 osu_latency_mp
-rwxr-xr-x. 1 root root 162600 Feb 27 10:41 osu_latency_mt
-rwxr-xr-x. 1 root root 153744 Feb 27 10:41 osu_bibw
-rwxr-xr-x. 1 root root 153672 Feb 27 10:41 osu_multi_lat
-rwxr-xr-x. 1 root root 152408 Feb 27 10:41 osu_latency
-rwxr-xr-x. 1 root root 153472 Feb 27 10:41 osu_bw
-rwxr-xr-x. 1 root root 159712 Feb 27 10:41 osu_mbw_mr
-rw-r--r--. 1 root root  43720 Feb 27 10:41 osu_latency_mp.o
-rw-r--r--. 1 root root  73792 Feb 27 10:41 osu_latency_mt.o
-rw-r--r--. 1 root root  62176 Feb 27 10:41 osu_mbw_mr.o
-rw-r--r--. 1 root root  43128 Feb 27 10:41 osu_bibw.o
-rw-r--r--. 1 root root  42336 Feb 27 10:41 osu_bw.o
-rw-r--r--. 1 root root  42776 Feb 27 10:41 osu_multi_lat.o
-rw-r--r--. 1 root root  39320 Feb 27 10:41 osu_latency.o
-rw-r--r--. 1 root root  27797 Feb 27 10:40 Makefile
-rw-rw-r--. 1 1006 1006  28560 Jun  1  2020 Makefile.in
-rw-rw-r--. 1 1006 1006   1446 Jun  1  2020 Makefile.am
-rw-rw-r--. 1 1006 1006   5283 Jun  1  2020 osu_bibw.c
-rw-rw-r--. 1 1006 1006   4836 Jun  1  2020 osu_bw.c
-rw-rw-r--. 1 1006 1006   4439 Jun  1  2020 osu_latency.c
-rw-rw-r--. 1 1006 1006   5892 Jun  1  2020 osu_latency_mp.c
-rw-rw-r--. 1 1006 1006   9971 Jun  1  2020 osu_latency_mt.c
-rw-rw-r--. 1 1006 1006   9775 Jun  1  2020 osu_mbw_mr.c
-rw-rw-r--. 1 1006 1006   5022 Jun  1  2020 osu_multi_lat.c

3.2.4进行性能对比测试

# 使用iperf3的测试结果作为参照(在server1上运行server端,在server2上运行client端)
[root@server2 ~]# iperf3 -c 10.240.3.51
Connecting to host 10.240.3.51, port 5201
[  5] local 10.240.3.52 port 58984 connected to 10.240.3.51 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   894 MBytes  7.50 Gbits/sec    0    844 KBytes       
[  5]   1.00-2.00   sec   906 MBytes  7.60 Gbits/sec    0    887 KBytes       
[  5]   2.00-3.00   sec   900 MBytes  7.55 Gbits/sec    0   1.20 MBytes       
[  5]   3.00-4.00   sec   915 MBytes  7.68 Gbits/sec    0   1.37 MBytes       
[  5]   4.00-5.00   sec   904 MBytes  7.58 Gbits/sec    0   1.37 MBytes       
[  5]   5.00-6.00   sec   888 MBytes  7.45 Gbits/sec    0   1.37 MBytes       
[  5]   6.00-7.00   sec   998 MBytes  8.37 Gbits/sec    0   1.37 MBytes       
[  5]   7.00-8.00   sec   859 MBytes  7.21 Gbits/sec    0   1.37 MBytes       
[  5]   8.00-9.00   sec  1.01 GBytes  8.67 Gbits/sec    0   1.37 MBytes       
[  5]   9.00-10.00  sec   914 MBytes  7.67 Gbits/sec    0   1.37 MBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  8.99 GBytes  7.73 Gbits/sec    0             sender
[  5]   0.00-10.04  sec  8.99 GBytes  7.69 Gbits/sec                  receiver

iperf Done.
# 使用perftest进行Soft-RoCE性能测试

3.2.5进行可用性测试

# 使用iperf3的测试结果作为参照(在server1上运行server端,在server2上运行client端)
[root@server2 ~]# iperf3 -c 10.240.3.51
Connecting to host 10.240.3.51, port 5201
[  5] local 10.240.3.52 port 58984 connected to 10.240.3.51 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec   894 MBytes  7.50 Gbits/sec    0    844 KBytes       
[  5]   1.00-2.00   sec   906 MBytes  7.60 Gbits/sec    0    887 KBytes       
[  5]   2.00-3.00   sec   900 MBytes  7.55 Gbits/sec    0   1.20 MBytes       
[  5]   3.00-4.00   sec   915 MBytes  7.68 Gbits/sec    0   1.37 MBytes       
[  5]   4.00-5.00   sec   904 MBytes  7.58 Gbits/sec    0   1.37 MBytes       
[  5]   5.00-6.00   sec   888 MBytes  7.45 Gbits/sec    0   1.37 MBytes       
[  5]   6.00-7.00   sec   998 MBytes  8.37 Gbits/sec    0   1.37 MBytes       
[  5]   7.00-8.00   sec   859 MBytes  7.21 Gbits/sec    0   1.37 MBytes       
[  5]   8.00-9.00   sec  1.01 GBytes  8.67 Gbits/sec    0   1.37 MBytes       
[  5]   9.00-10.00  sec   914 MBytes  7.67 Gbits/sec    0   1.37 MBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  8.99 GBytes  7.73 Gbits/sec    0             sender
[  5]   0.00-10.04  sec  8.99 GBytes  7.69 Gbits/sec                  receiver

iperf Done.
# 使用perftest进行Soft-RoCE性能测试

4总结

功能/可用性方面:
Soft-RoCE可以正常使用IB的性能测试工具,通过配置MPI运行环境,进行简单测试,并运行OMB性能测试工具,也能证明Soft-RoCE可以正常配置承载MPI应用。
性能方面:
由于本次的测试是在虚拟化环境中完成,性能表现情况仅供参考,这次性能测试先使用iperf3进行常规的TCP/IP协议的带宽测试,10Gbps的虚拟网口实测可以跑到8Gbps左右,作为性能参考;再使用ib_send_bw进行RoCEv2的带宽测试,实测可以跑到2Gbps左右,性能不太理想,只能跑到网口实测带宽的1/4左右。

并行文件系统的安装部署与性能测试

1 目标

本文档将简要介绍并行文件系统及其开源方案BeeGFS的基本概念,并选用Asterfusion CX-N系列超低时延云交换机进行组网,完成3节点环境的部署配置和性能测试。

2 概要介绍

2.1 关于并行文件系统

高性能计算机系统(HPC)通过汇总多个计算资源来快速解决大型计算问题,为了让集群中的计算节点更好地配合,通常会为HPC搭建一个用于计算节点之间共享的并行文件系统。

并行文件系统(Parallel File System)是一种经过优化的高性能文件系统,提供毫秒级别访问时延,TB/s级别带宽和百万级别的IOPS,能够快速处理高性能计算(HPC)工作负载。

并行文件系统适用于需要处理大量数据和高度并行化计算的领域,例如:

  1. 科学计算:天气预测、气候模拟、地震模拟、流体力学、生物医学、物理学等需要处理大量实验数据和进行复杂计算的领域;
  2. 工业制造:汽车设计、航空航天、船舶设计、复杂机械制造等需要进行大规模计算和模拟的领域;
  3. 金融:证券交易、风险管理、金融建模等需要处理大量交易数据和进行复杂计算的领域;
  4. 动画制作:电影、电视、游戏等需要进行大规模渲染和图像处理的领域;
  5. 互联网应用:大规模数据挖掘、搜索引擎、社交网络、电子商务等需要处理大量数据和进行实时计算的领域。
    如今,HPC已经从传统的计算密集型(大规模的仿真应用等),转变为数据驱动的以数据为中心的计算(基于大规模数据的生产、处理和分析等),这种转变趋势驱使后端存储不断演进发展,满足高性能和高可扩展性的要求。
    并行文件系统中,文件/数据被切分并放置到多个存储设备中(各个被切分的数据如何放置,由并行文件系统通过算法来控制),系统使用全局名称空间来进行数据访问。并行文件系统的客户端可以同时使用多个 IO 路径将数据读/写到多个存储设备。
    目前,常用的并行文件系统有以下几种:
  6. Lustre:是一种开源的并行分布式文件系统,由Sun Microsystems和Cray公司开发,目前由OpenSFS和欧洲开源软件基金会(EOFS)维护。被广泛应用于高性能计算(HPC)和大规模数据存储领域,具有高性能、高可靠性和高可扩展性等特点;
  7. BeeGFS:是一种高性能、可扩展的并行文件系统,由Fraunhofer Institute for Industrial Mathematics and IT(ITWM)开发。它支持多种数据访问协议,包括POSIX、NFS和SMB等,被广泛应用于高性能计算和大规模数据存储领域;
  8. IBM Spectrum Scale(原名GPFS):是一种高性能、可扩展的并行文件系统,由IBM公司开发,可用于大规模数据存储和分析。它支持多种数据访问协议,包括POSIX、NFS、SMB和HDFS等;
  9. Ceph:是一种开源的分布式存储系统,可以提供块存储、对象存储和文件存储等多种接口,支持高可靠性和可扩展性的数据存储和访问;
  10. PVFS(Parallel Virtual File System):是一种开源的并行文件系统,由Clemson University和Oak Ridge National Laboratory共同开发。被广泛用于科学计算和高性能计算领域,具有高性能和高可扩展性等特点。

这些并行文件系统都具有高性能、高可靠性和高可扩展性等特点,被广泛应用于高性能计算、大规模数据存储和分析等领域。

2.2 关于BeeGFS

BeeGFS原名为FhGFS,是由Fraunhofer Institute为工业数学计算而设计开发,由于在欧洲和美国的中小型HPC系统性能表现良好,在2014年改名注册为BeeGFS并受到科研和商业的广泛应用。

BeeGFS既是一个网络文件系统也是一个并行文件系统。客户端通过网络与存储服务器进行通信(具有TCP/IP或任何具有RDMA功能的互连,如InfiniBand,RoCE或Omni-Path,支持native verbs 接口)。

BeeGFS实现了文件和MetaData的分离。文件是用户希望存储的数据,而MetaData是包括访问权限、文件大小和位置的“关于数据的数据”,MetaData中最重要的是如何从多个文件服务器中找到具体对应的文件,这样才能使客户端获取特定文件或目录的MetaData后,可以直接与存储文件的Stroage服务器对话以检索信息。

BeeGFS的Storage Servers和MetaData Servers的数量可以弹性伸缩。因此,可通过扩展到适当数量的服务器来满足不同性能要求,软件整体架构如下图所示:

BeeGFS整体架构图

图1:BeeGFS整体架构图

组件名称组件包名称说明
管理服务beegfs-mgmtd管理服务用于监控所有已注册服务的状态,不存储用户的任何数据。
注:在进行元数据服务、存储服务、客户端服务配置时,都需要指向管理服务节点IP地址,一般集群部署需要第一个部署的服务,有且只有一个。
元数据服务beegfs-meta元数据服务用于存储文件的元数据信息,如目录结构、权限信息、数据分片存放位置等,一个文件对应一个元数据文件,客户端打开文件时,由元数据服务向客户端提供数据具体存放节点位置,之后客户端直接与存储服务进行数据读写操作,可支持横向扩展,增加多个元数据服务用以提升文件系统性能。
存储服务beegfs-storage存储服务用于存储条带化后的数据块文件。
客户端服务beegfs-client
beegfs-helperd
客户端服务用于集群存储空间挂载,当服务开启时自动挂载到本地路径,之后可通过nfs/samba服务将本地挂载点导出,提供linux/windows客户端访问。
注:挂载路径通过/etc/beegfs/beegfs-mounts.conf 配置文件指定,beegfs-helperd主要用于日志写入,不需要额外的配置。
命令行组件beegfs-utils
beegfs-common
提供命令行工具,如beegfs-ctl、beegfs-df等。
表1:BeeGFS的系统组件

2.3 关于Asterfusion CX-N系列超低时延云交换机

星融元Asterfusion自主开发的面向数据中心网络的CX-N系列超低时延云交换机,为云数据中心的高性能计算集群、存储集群、大数据分析、高频交易、Cloud OS全面融合等多业务场景提供高性能的网络服务。

本次测试环境使用了一台CX532P-N进行组网,这款1U交换机拥有32x100GE QSFP28光口,和2 x 10GE SFP+光口,交换容量高达6.4Tbps。

3 测试环境声明与组网拓扑

3.1 硬件设备与物料

设备类型配置参数数量
交换机CX532P-N(1U, 32 x 100GE QSFP28, 2 x 10GE SFP+)1
模块、线缆100G breakout 4x25G[10G] 的模块、线缆1
服务器处理器:Intel(R) Core(TM) i7-7700
内存:8GB
硬盘:1TB HDD + 1TB SSD
1
服务器处理器:Intel(R) Core(TM) i7-8700
内存:8GB
硬盘:1TB HDD + 1TB SSD
1
服务器处理器:Intel(R) Core(TM) i7-9700
内存:8GB
硬盘:1TB HDD + 1TB SSD
1
表2:硬件设备与物料

3.2 系统和软件版本

设备类型主机名版本
交换机CX532P-NAsterNOS Software, Version 3.1, R0314P06
服务器server4操作系统:openEuler release 22.03 (LTS-SP1)
内核:5.10.0-136.35.0.111.oe2203sp1.x86_64
BeeGFS:7.3.3
OFED驱动:MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64
服务器server5操作系统:openEuler release 22.03 (LTS-SP1)
内核:5.10.0-136.35.0.111.oe2203sp1.x86_64
BeeGFS:7.3.3
OFED驱动:MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64
服务器server6操作系统:Rocky Linux release 8.8 (Green Obsidian)
内核:4.18.0-477.13.1.el8_8.x86_64
BeeGFS:7.3.3
OFED驱动:MLNX_OFED_LINUX-5.4-3.7.5.0-rhel8.8-x86_64
表3:系统和软件版本

3.3 存储系统规划

主机名节点IP节点角色硬盘划分
server4管理口 10.230.1.54
业务-1 172.16.8.54/24
mgmtd、meta、storagemgmtd:50G NVMe
meta:50G NVMe
storage:500G NVMe
server5管理口 10.230.1.55
业务-1 172.16.8.55/24
mgmtd、meta、storagemgmtd:50G NVMe
meta:50G NVMe
storage:500G NVMe
server6管理口 10.230.1.56
业务-1 172.16.8.56/24
client、helperd/
表4:存储规划

3.4 测试组网拓扑

测试组网拓扑

图2:测试组网拓扑

4 测试结果

4.1 Run BeeGFS Bench

命令行

4.2 Run IOR and mdtest

命令行
命令行
命令行

4.3 Run dbench

命令行

4.4 Run IO500

命令行

5 配置参考

5.1 服务器

5.1.1 安装Mellanox OFED驱动

Server4
# 下载当前系统发行版适用的驱动包
[root@server4 ~]# cat /etc/openEuler-release 
openEuler release 22.03 (LTS-SP1)
[root@server4 ~]# wget https://content.mellanox.com/ofed/MLNX_OFED-5.4-3.6.8.1/MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64.tgz
# 编译当前系统内核适用的驱动包
[root@server4 ~]# tar xvf MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64.tgz
[root@server4 MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64]# cd MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64
[root@server4 MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64]# ./mlnx_add_kernel_support.sh -m /root/MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64
[root@server4 MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64]# cd ..
# 安装生成的驱动包
[root@server4 ~]# cp /tmp/MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64-ext.tgz ./
[root@server4 ~]# tar xvf MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64-ext.tgz
[root@server4 ~]# cd MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64-ext
[root@server4 MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64-ext]# ./mlnxofedinstall
# 生成initramfs,重启生效
[root@server4 MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64-ext]# dracut -f
[root@server4 MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64-ext]# reboot
# 启动openibd,检查驱动运行状态
[root@server4 ~]# /etc/init.d/openibd restart
[root@server4 ~]# /etc/init.d/openibd status

  HCA driver loaded

Configured Mellanox EN devices:
enp1s0f0
enp1s0f1

Currently active Mellanox devices:
enp1s0f0
enp1s0f1

The following OFED modules are loaded:

  rdma_ucm
  rdma_cm
  ib_ipoib
  mlx5_core
  mlx5_ib
  ib_uverbs
  ib_umad
  ib_cm
  ib_core
  mlxfw

[root@server4 ~]# 

Server5
# 下载当前系统发行版适用的驱动包
[root@server5 ~]# cat /etc/openEuler-release 
openEuler release 22.03 (LTS-SP1)
[root@server5 ~]# wget https://content.mellanox.com/ofed/MLNX_OFED-5.4-3.6.8.1/MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64.tgz
# 编译当前系统内核适用的驱动包
[root@server5 ~]# tar xvf MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64.tgz
[root@server5 MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64]# cd MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64
[root@server5 MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64]# ./mlnx_add_kernel_support.sh -m /root/MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64
[root@server5 MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64]# cd ..
# 安装生成的驱动包
[root@server5 ~]# cp /tmp/MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64-ext.tgz ./
[root@server5 ~]# tar xvf MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64-ext.tgz
[root@server5 ~]# cd MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64-ext
[root@server5 MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64-ext]# ./mlnxofedinstall
# 生成initramfs,重启生效
[root@server5 MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64-ext]# dracut -f
[root@server5 MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler22.03-x86_64-ext]# reboot
# 启动openibd,检查驱动运行状态
[root@server5 ~]# /etc/init.d/openibd restart
[root@server5 ~]# /etc/init.d/openibd status

  HCA driver loaded

Configured Mellanox EN devices:
enp1s0f0
enp1s0f1

Currently active Mellanox devices:
enp1s0f0
enp1s0f1

The following OFED modules are loaded:

  rdma_ucm
  rdma_cm
  ib_ipoib
  mlx5_core
  mlx5_ib
  ib_uverbs
  ib_umad
  ib_cm
  ib_core
  mlxfw

[root@server5 ~]# 

Server6
# 下载当前系统发行版适用的驱动包
[root@server6 ~]# cat /etc/rocky-release
Rocky Linux release 8.8 (Green Obsidian)
[root@server6 ~]# wget https://content.mellanox.com/ofed/MLNX_OFED-5.4-3.7.5.0/MLNX_OFED_LINUX-5.4-3.7.5.0-rhel8.8-x86_64.tgz
# 编译当前系统内核适用的驱动包
[root@server6 ~]# tar xvf MLNX_OFED_LINUX-5.4-3.7.5.0-rhel8.8-x86_64.tgz
[root@server6 MLNX_OFED_LINUX-5.4-3.7.5.0-rhel8.8-x86_64]# cd MLNX_OFED_LINUX-5.4-3.7.5.0-rhel8.8-x86_64
[root@server6 MLNX_OFED_LINUX-5.4-3.7.5.0-rhel8.8-x86_64]# ./mlnx_add_kernel_support.sh -m /root/MLNX_OFED_LINUX-5.4-3.7.5.0-rhel8.8-x86_64
[root@server6 MLNX_OFED_LINUX-5.4-3.7.5.0-rhel8.8-x86_64]# cd ..
# 安装生成的驱动包
[root@server6 ~]# cp /tmp/MLNX_OFED_LINUX-5.4-3.7.5.0-rhel8.8-x86_64-ext.tgz ./
[root@server6 ~]# tar xvf MLNX_OFED_LINUX-5.4-3.7.5.0-rhel8.8-x86_64-ext.tgz
[root@server6 ~]# cd MLNX_OFED_LINUX-5.4-3.7.5.0-rhel8.8-x86_64-ext
[root@server6 MLNX_OFED_LINUX-5.4-3.7.5.0-rhel8.8-x86_64-ext]# ./mlnxofedinstall
# 生成initramfs,重启生效
[root@server6 MLNX_OFED_LINUX-5.4-3.7.5.0-rhel8.8-x86_64-ext]# dracut -f
[root@server6 MLNX_OFED_LINUX-5.4-3.7.5.0-rhel8.8-x86_64-ext]# reboot
# 启动openibd,检查驱动运行状态
[root@server6 ~]# /etc/init.d/openibd restart
[root@server6 ~]# /etc/init.d/openibd status

  HCA driver loaded

Configured Mellanox EN devices:
enp7s0
enp8s0

Currently active Mellanox devices:
enp7s0
enp8s0

The following OFED modules are loaded:

  rdma_ucm
  rdma_cm
  ib_ipoib
  mlx5_core
  mlx5_ib
  ib_uverbs
  ib_umad
  ib_cm
  ib_core
  mlxfw

[root@server6 ~]# 

5.1.2 配置RoCEv2

Server4
[root@server4 ~]# ibdev2netdev 
mlx5_0 port 1 ==> enp1s0f0 (Up)
mlx5_1 port 1 ==> enp1s0f1 (Up)
[root@server4 ~]# cat /etc/sysconfig/network-scripts/config-rocev2.sh
#enp1s0f0
mlnx_qos -i enp1s0f0 --trust dscp
mlnx_qos -i enp1s0f0 --pfc 0,0,0,0,1,0,0,0
cma_roce_mode -d mlx5_0 -p 1 -m 2
echo 128 > /sys/class/infiniband/mlx5_0/tc/1/traffic_class
cma_roce_tos -d mlx5_0 -t 128
echo 1 > /sys/class/net/enp1s0f0/ecn/roce_np/enable/1
echo 1 > /sys/class/net/enp1s0f0/ecn/roce_rp/enable/1
echo 40 > /sys/class/net/enp1s0f0/ecn/roce_np/cnp_dscp
sysctl -w net.ipv4.tcp_ecn=1
# enp1s0f1
mlnx_qos -i enp1s0f1 --trust dscp
mlnx_qos -i enp1s0f1 --pfc 0,0,0,0,1,0,0,0
cma_roce_mode -d mlx5_1 -p 1 -m 2
echo 128 > /sys/class/infiniband/mlx5_1/tc/1/traffic_class
cma_roce_tos -d mlx5_1 -t 128
echo 1 > /sys/class/net/enp1s0f1/ecn/roce_np/enable/1
echo 1 > /sys/class/net/enp1s0f1/ecn/roce_rp/enable/1
echo 40 > /sys/class/net/enp1s0f1/ecn/roce_np/cnp_dscp
[root@server4 ~]# mlnx_qos -i enp1s0f0
DCBX mode: OS controlled
Priority trust state: dscp
dscp2prio mapping:
        prio:0 dscp:07,06,05,04,03,02,01,00,
        prio:1 dscp:15,14,13,12,11,10,09,08,
        prio:2 dscp:23,22,21,20,19,18,17,16,
        prio:3 dscp:31,30,29,28,27,26,25,24,
        prio:4 dscp:39,38,37,36,35,34,33,32,
        prio:5 dscp:47,46,45,44,43,42,41,40,
        prio:6 dscp:55,54,53,52,51,50,49,48,
        prio:7 dscp:63,62,61,60,59,58,57,56,
default priority:
Receive buffer size (bytes): 130944,130944,0,0,0,0,0,0,
Cable len: 7
PFC configuration:
        priority    0   1   2   3   4   5   6   7
        enabled     0   0   0   0   1   0   0   0   
        buffer      0   0   0   0   1   0   0   0   
tc: 0 ratelimit: unlimited, tsa: strict
         priority:  0
         priority:  1
         priority:  2
         priority:  3
         priority:  4
         priority:  5
         priority:  6
         priority:  7
[root@server4 ~]# mlnx_qos -i enp1s0f1
DCBX mode: OS controlled
Priority trust state: dscp
dscp2prio mapping:
        prio:0 dscp:07,06,05,04,03,02,01,00,
        prio:1 dscp:15,14,13,12,11,10,09,08,
        prio:2 dscp:23,22,21,20,19,18,17,16,
        prio:3 dscp:31,30,29,28,27,26,25,24,
        prio:4 dscp:39,38,37,36,35,34,33,32,
        prio:5 dscp:47,46,45,44,43,42,41,40,
        prio:6 dscp:55,54,53,52,51,50,49,48,
        prio:7 dscp:63,62,61,60,59,58,57,56,
default priority:
Receive buffer size (bytes): 130944,130944,0,0,0,0,0,0,
Cable len: 7
PFC configuration:
        priority    0   1   2   3   4   5   6   7
        enabled     0   0   0   0   1   0   0   0   
        buffer      0   0   0   0   1   0   0   0   
tc: 0 ratelimit: unlimited, tsa: strict
         priority:  0
         priority:  1
         priority:  2
         priority:  3
         priority:  4
         priority:  5
         priority:  6
         priority:  7
[root@server4 ~]# cat /sys/class/net/*/ecn/roce_np/cnp_dscp
40
40
[root@server4 ~]# 

Server5
[root@server5 ~]# ibdev2netdev 
mlx5_0 port 1 ==> enp1s0f0 (Up)
mlx5_1 port 1 ==> enp1s0f1 (Up)
[root@server5 ~]# cat /etc/sysconfig/network-scripts/config-rocev2.sh
#enp1s0f0
mlnx_qos -i enp1s0f0 --trust dscp
mlnx_qos -i enp1s0f0 --pfc 0,0,0,0,1,0,0,0
cma_roce_mode -d mlx5_0 -p 1 -m 2
echo 128 > /sys/class/infiniband/mlx5_0/tc/1/traffic_class
cma_roce_tos -d mlx5_0 -t 128
echo 1 > /sys/class/net/enp1s0f0/ecn/roce_np/enable/1
echo 1 > /sys/class/net/enp1s0f0/ecn/roce_rp/enable/1
echo 40 > /sys/class/net/enp1s0f0/ecn/roce_np/cnp_dscp
sysctl -w net.ipv4.tcp_ecn=1
# enp1s0f1
mlnx_qos -i enp1s0f1 --trust dscp
mlnx_qos -i enp1s0f1 --pfc 0,0,0,0,1,0,0,0
cma_roce_mode -d mlx5_1 -p 1 -m 2
echo 128 > /sys/class/infiniband/mlx5_1/tc/1/traffic_class
cma_roce_tos -d mlx5_1 -t 128
echo 1 > /sys/class/net/enp1s0f1/ecn/roce_np/enable/1
echo 1 > /sys/class/net/enp1s0f1/ecn/roce_rp/enable/1
echo 40 > /sys/class/net/enp1s0f1/ecn/roce_np/cnp_dscp
[root@server5 ~]# mlnx_qos -i enp1s0f0
DCBX mode: OS controlled
Priority trust state: dscp
dscp2prio mapping:
        prio:0 dscp:07,06,05,04,03,02,01,00,
        prio:1 dscp:15,14,13,12,11,10,09,08,
        prio:2 dscp:23,22,21,20,19,18,17,16,
        prio:3 dscp:31,30,29,28,27,26,25,24,
        prio:4 dscp:39,38,37,36,35,34,33,32,
        prio:5 dscp:47,46,45,44,43,42,41,40,
        prio:6 dscp:55,54,53,52,51,50,49,48,
        prio:7 dscp:63,62,61,60,59,58,57,56,
default priority:
Receive buffer size (bytes): 130944,130944,0,0,0,0,0,0,
Cable len: 7
PFC configuration:
        priority    0   1   2   3   4   5   6   7
        enabled     0   0   0   0   1   0   0   0   
        buffer      0   0   0   0   1   0   0   0   
tc: 0 ratelimit: unlimited, tsa: strict
         priority:  0
         priority:  1
         priority:  2
         priority:  3
         priority:  4
         priority:  5
         priority:  6
         priority:  7
[root@server5 ~]# mlnx_qos -i enp1s0f1
DCBX mode: OS controlled
Priority trust state: dscp
dscp2prio mapping:
        prio:0 dscp:07,06,05,04,03,02,01,00,
        prio:1 dscp:15,14,13,12,11,10,09,08,
        prio:2 dscp:23,22,21,20,19,18,17,16,
        prio:3 dscp:31,30,29,28,27,26,25,24,
        prio:4 dscp:39,38,37,36,35,34,33,32,
        prio:5 dscp:47,46,45,44,43,42,41,40,
        prio:6 dscp:55,54,53,52,51,50,49,48,
        prio:7 dscp:63,62,61,60,59,58,57,56,
default priority:
Receive buffer size (bytes): 130944,130944,0,0,0,0,0,0,
Cable len: 7
PFC configuration:
        priority    0   1   2   3   4   5   6   7
        enabled     0   0   0   0   1   0   0   0   
        buffer      0   0   0   0   1   0   0   0   
tc: 0 ratelimit: unlimited, tsa: strict
         priority:  0
         priority:  1
         priority:  2
         priority:  3
         priority:  4
         priority:  5
         priority:  6
         priority:  7
[root@server5 ~]# cat /sys/class/net/*/ecn/roce_np/cnp_dscp
40
40
[root@server5 ~]# 

Server6
[root@server6 ~]# ibdev2netdev 
mlx5_0 port 1 ==> enp7s0 (Up)
mlx5_1 port 1 ==> enp8s0 (Up)
[root@server6 ~]# cat /etc/sysconfig/network-scripts/config-rocev2.sh
#enp7s0
mlnx_qos -i enp7s0 --trust dscp
mlnx_qos -i enp7s0 --pfc 0,0,0,0,1,0,0,0
cma_roce_mode -d mlx5_0 -p 1 -m 2
echo 128 > /sys/class/infiniband/mlx5_0/tc/1/traffic_class
cma_roce_tos -d mlx5_0 -t 128
echo 1 > /sys/class/net/enp7s0/ecn/roce_np/enable/1
echo 1 > /sys/class/net/enp7s0/ecn/roce_rp/enable/1
echo 40 > /sys/class/net/enp7s0/ecn/roce_np/cnp_dscp
sysctl -w net.ipv4.tcp_ecn=1
# enp8s0
mlnx_qos -i enp8s0 --trust dscp
mlnx_qos -i enp8s0 --pfc 0,0,0,0,1,0,0,0
cma_roce_mode -d mlx5_1 -p 1 -m 2
echo 128 > /sys/class/infiniband/mlx5_1/tc/1/traffic_class
cma_roce_tos -d mlx5_1 -t 128
echo 1 > /sys/class/net/enp8s0/ecn/roce_np/enable/1
echo 1 > /sys/class/net/enp8s0/ecn/roce_rp/enable/1
echo 40 > /sys/class/net/enp8s0/ecn/roce_np/cnp_dscp
[root@server6 ~]# mlnx_qos -i enp7s0
DCBX mode: OS controlled
Priority trust state: dscp
dscp2prio mapping:
        prio:0 dscp:07,06,05,04,03,02,01,00,
        prio:1 dscp:15,14,13,12,11,10,09,08,
        prio:2 dscp:23,22,21,20,19,18,17,16,
        prio:3 dscp:31,30,29,28,27,26,25,24,
        prio:4 dscp:39,38,37,36,35,34,33,32,
        prio:5 dscp:47,46,45,44,43,42,41,40,
        prio:6 dscp:55,54,53,52,51,50,49,48,
        prio:7 dscp:63,62,61,60,59,58,57,56,
default priority:
Receive buffer size (bytes): 130944,130944,0,0,0,0,0,0,max_buffer_size=262016
Cable len: 7
PFC configuration:
        priority    0   1   2   3   4   5   6   7
        enabled     0   0   0   0   1   0   0   0   
        buffer      0   0   0   0   1   0   0   0   
tc: 0 ratelimit: unlimited, tsa: strict
         priority:  0
         priority:  1
         priority:  2
         priority:  3
         priority:  4
         priority:  5
         priority:  6
         priority:  7
[root@server6 ~]# mlnx_qos -i enp8s0
DCBX mode: OS controlled
Priority trust state: dscp
dscp2prio mapping:
        prio:0 dscp:07,06,05,04,03,02,01,00,
        prio:1 dscp:15,14,13,12,11,10,09,08,
        prio:2 dscp:23,22,21,20,19,18,17,16,
        prio:3 dscp:31,30,29,28,27,26,25,24,
        prio:4 dscp:39,38,37,36,35,34,33,32,
        prio:5 dscp:47,46,45,44,43,42,41,40,
        prio:6 dscp:55,54,53,52,51,50,49,48,
        prio:7 dscp:63,62,61,60,59,58,57,56,
default priority:
Receive buffer size (bytes): 130944,130944,0,0,0,0,0,0,max_buffer_size=262016
Cable len: 7
PFC configuration:
        priority    0   1   2   3   4   5   6   7
        enabled     0   0   0   0   1   0   0   0   
        buffer      0   0   0   0   1   0   0   0   
tc: 0 ratelimit: unlimited, tsa: strict
         priority:  0
         priority:  1
         priority:  2
         priority:  3
         priority:  4
         priority:  5
         priority:  6
         priority:  7
[root@server6 ~]# cat /sys/class/net/*/ecn/roce_np/cnp_dscp
40
40
[root@server6 ~]# 

5.1.3 部署BeeGFS

5.1.3.1 安装各个服务的软件包

Server4:meta、storage、mgmt

[root@server4 ~]# cd /etc/yum.repos.d/
[root@server4 yum.repos.d]# wget https://www.beegfs.io/release/beegfs_7.3.3/dists/beegfs-rhel8.repo
[root@server4 yum.repos.d]# yum makecache
[root@server4 ~]# yum install beegfs-mgmtd
[root@server4 ~]# yum install beegfs-meta libbeegfs-ib
[root@server4 ~]# yum install beegfs-storage libbeegfs-ib

Server5:meta、storage、mgmt

[root@server5 ~]# cd /etc/yum.repos.d/
[root@server5 yum.repos.d]# wget https://www.beegfs.io/release/beegfs_7.3.3/dists/beegfs-rhel8.repo
[root@server5 yum.repos.d]# yum makecache
[root@server5 ~]# yum install beegfs-mgmtd
[root@server5 ~]# yum install beegfs-meta libbeegfs-ib
[root@server5 ~]# yum install beegfs-storage libbeegfs-ib

Server6:client

[root@server6 ~]# cd /etc/yum.repos.d/
[root@server6 yum.repos.d]# wget https://www.beegfs.io/release/beegfs_7.3.3/dists/beegfs-rhel8.repo
[root@server6 yum.repos.d]# yum makecache
[root@server6 ~]# yum install beegfs-client beegfs-helperd beegfs-utils

5.1.3.2 编译客户端内核模块
[root@server6 ~]# cat /etc/beegfs/beegfs-client-autobuild.conf
# This is a config file for the automatic build process of BeeGFS client kernel
# modules.
# http://www.beegfs.com

#
# --- Section: [Notes] ---
#

# General Notes
# =============
# To force a rebuild of the client modules:
#  $ /etc/init.d/beegfs-client rebuild
#
# To see a list of available build arguments:
#  $ make help -C /opt/beegfs/src/client/client_module_${BEEGFS_MAJOR_VERSION}/build
#
#  Help example for BeeGFS 2015.03 release:
#   $ make help -C /opt/beegfs/src/client/client_module_2015.03/build

# RDMA Support Notes
# ==================
# If you installed InfiniBand kernel modules from OpenFabrics OFED, then also
# define the correspsonding header include path by adding
# "OFED_INCLUDE_PATH=<path>" to the "buildArgs", where <path> usually is
# "/usr/src/openib/include" or "/usr/src/ofa_kernel/default/include" for
# Mellanox OFED.
#
# OFED headers are automatically detected even if OFED_INCLUDE_PATH is not
# defined. To build the client without RDMA support, define BEEGFS_NO_RDMA=1.
#

# NVIDIA GPUDirect Storage Support Notes
# ==================
# If you want to build BeeGFS with NVIDIA GPUDirect Storage support, add
# "NVFS_INCLUDE_PATH=<path>" to the "buildArgs" below, where path is the directory
# that contains nvfs-dma.h. This is usually the nvidia-fs source directory:
# /usr/src/nvidia-fs-VERSION.
#
# If config-host.h is not present in NVFS_INCLUDE_PATH, execute the configure
# script. Example:
# $ cd /usr/src/nvidia-fs-2.13.5
# $ ./configure
#
# NVIDIA_INCLUDE_PATH must be defined and point to the NVIDIA driver source:
# /usr/src/nvidia-VERSION/nvidia
#
# OFED_INCLUDE_PATH must be defined and point to Mellanox OFED.
#

#
# --- Section: [Build Settings] ---
#

# Build Settings
# ==============
# These are the arguments for the client module "make" command.
#
# Note: Quotation marks and equal signs can be used without escape characters
# here.
#
# Example1:
#  buildArgs=-j8
#
# Example2 (see "RDMA Support Notes" above):
#  buildArgs=-j8 OFED_INCLUDE_PATH=/usr/src/openib/include
#
# Example3 (see "NVIDIA GPUDirect Storage Support Notes" above):
#  buildArgs=-j8 OFED_INCLUDE_PATH=/usr/src/ofa_kernel/default/include \
#    NVFS_INCLUDE_PATH=/usr/src/nvidia-fs-2.13.5 \
#    NVIDIA_INCLUDE_PATH=/usr/src/nvidia-520.61.05/nvidia
#
# Default:
#  buildArgs=-j8

buildArgs=-j8 OFED_INCLUDE_PATH=/usr/src/ofa_kernel/default/include

# Turn Autobuild on/off
# =====================
# Controls whether modules will be built on "/etc/init.d/beegfs-client start".
#
# Note that even if autobuild is enabled here, the modules will only be built
# if no beegfs kernel module for the current kernel version exists in
# "/lib/modules/<kernel_version>/updates/".
#
# Default:
#  buildEnabled=true

buildEnabled=true
[root@server6 ~]# cat /etc/beegfs/beegfs-client.conf 
# This is a config file for BeeGFS clients.
# http://www.beegfs.com

# --- [Table of Contents] ---
#
# 1) Settings
# 2) Mount Options
# 3) Basic Settings Documentation
# 4) Advanced Settings Documentation

#
# --- Section 1.1: [Basic Settings] ---
#

sysMgmtdHost                  = server5

#
# --- Section 1.2: [Advanced Settings] ---
#

connAuthFile                  =
connDisableAuthentication     = true
connClientPortUDP             = 8004
connHelperdPortTCP            = 8006
connMgmtdPortTCP              = 8008
connMgmtdPortUDP              = 8008
connPortShift                 = 0

connCommRetrySecs             = 600
connFallbackExpirationSecs    = 900
connInterfacesFile            = /etc/beegfs/interface.conf
connRDMAInterfacesFile        = /etc/beegfs/interface.conf
connMaxInternodeNum           = 12
connMaxConcurrentAttempts     = 0
connNetFilterFile             = /etc/beegfs/network.conf

connUseRDMA                   = true
connTCPFallbackEnabled        = true
connTCPRcvBufSize             = 0
connUDPRcvBufSize             = 0
connRDMABufNum                = 70
connRDMABufSize               = 8192
connRDMATypeOfService         = 0
connTcpOnlyFilterFile         =

logClientID                   = false
logHelperdIP                  =
logLevel                      = 3
logType                       = helperd

quotaEnabled                  = false

sysCreateHardlinksAsSymlinks  = false
sysMountSanityCheckMS         = 11000
sysSessionCheckOnClose        = false
sysSyncOnClose                = false
sysTargetOfflineTimeoutSecs   = 900
sysUpdateTargetStatesSecs     = 30
sysXAttrsEnabled              = false

tuneFileCacheType             = buffered
tunePreferredMetaFile         =
tunePreferredStorageFile      =
tuneRemoteFSync               = true
tuneUseGlobalAppendLocks      = false
tuneUseGlobalFileLocks        = false

#
# --- Section 1.3: [Enterprise Features] ---
#
# See end-user license agreement for definition and usage limitations of
# enterprise features.
#

sysACLsEnabled                = false
[root@server6 ~]# mkdir /mnt/beegfs
[root@server6 ~]# cat /etc/beegfs/beegfs-mounts.conf 
/mnt/beegfs /etc/beegfs/beegfs-client.conf
[root@server6 ~]# cat /etc/beegfs/interface.conf 
enp7s0
[root@server6 ~]# cat /etc/beegfs/network.conf 
172.16.8.0/24
[root@server6 ~]# /etc/init.d/beegfs-client rebuild
[root@server6 ~]# systemctl restart beegfs-client
[root@server6 ~]# systemctl status beegfs-client
● beegfs-client.service - Start BeeGFS Client
   Loaded: loaded (/usr/lib/systemd/system/beegfs-client.service; enabled; vendor preset: disabled)
   Active: active (exited) since Tue 2023-06-27 19:25:17 CST; 18min ago
  Process: 22301 ExecStop=/etc/init.d/beegfs-client stop (code=exited, status=0/SUCCESS)
  Process: 22323 ExecStart=/etc/init.d/beegfs-client start (code=exited, status=0/SUCCESS)
 Main PID: 22323 (code=exited, status=0/SUCCESS)

6月 27 19:25:17 server6 systemd[1]: Starting Start BeeGFS Client...
6月 27 19:25:17 server6 beegfs-client[22323]: Starting BeeGFS Client:
6月 27 19:25:17 server6 beegfs-client[22323]: - Loading BeeGFS modules
6月 27 19:25:17 server6 beegfs-client[22323]: - Mounting directories from /etc/beegfs/beegfs-mounts.conf
6月 27 19:25:17 server6 systemd[1]: Started Start BeeGFS Client.
[root@server6 ~]# lsmod | grep beegfs
beegfs                540672  1
rdma_cm               118784  2 beegfs,rdma_ucm
ib_core               425984  9 beegfs,rdma_cm,ib_ipoib,iw_cm,ib_umad,rdma_ucm,ib_uverbs,mlx5_ib,ib_cm
mlx_compat             16384  12 beegfs,rdma_cm,ib_ipoib,mlxdevm,iw_cm,ib_umad,ib_core,rdma_ucm,ib_uverbs,mlx5_ib,ib_cm,mlx5_core
[root@server6 ~]# 
5.1.3.3 BeeGFS配置

Server5和Server6上的存储空间分配。

[root@server4 ~]# mkdir -p /mnt/beegfs/{mgmtd,meta,storage}
[root@server4 ~]# fdisk  -l /dev/nvme0n1
Disk /dev/nvme0n1:953.87 GiB,1024209543168 字节,2000409264 个扇区
磁盘型号:ZHITAI TiPlus5000 1TB                   
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
磁盘标识符:090F6714-0F4E-E543-8293-10A0405490DE

设备                起点       末尾       扇区  大小 类型
/dev/nvme0n1p1      2048  104859647  104857600   50G Linux 文件系统
/dev/nvme0n1p2 104859648  209717247  104857600   50G Linux 文件系统
/dev/nvme0n1p3 209717248 1258293247 1048576000  500G Linux 文件系统
[root@server4 ~]# mkfs.ext4 /dev/nvme0n1p1
[root@server4 ~]# mkfs.ext4 /dev/nvme0n1p2
[root@server4 ~]# mkfs.xfs /dev/nvme0n1p3
[root@server4 ~]# mount /dev/nvme0n1p1 /mnt/beegfs/mgmtd/
[root@server4 ~]# mount /dev/nvme0n1p2 /mnt/beegfs/meta/
[root@server4 ~]# mount /dev/nvme0n1p3 /mnt/beegfs/storage/

[root@server5 ~]# mkdir -p /mnt/beegfs/{mgmtd,meta,storage}
[root@server5 ~]# fdisk -l /dev/nvme0n1
Disk /dev/nvme0n1:953.87 GiB,1024209543168 字节,2000409264 个扇区
磁盘型号:ZHITAI TiPlus5000 1TB                   
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
磁盘标识符:A64F55F2-0650-8A40-BE56-BC451387B729

设备                起点       末尾       扇区  大小 类型
/dev/nvme0n1p1      2048  104859647  104857600   50G Linux 文件系统
/dev/nvme0n1p2 104859648  209717247  104857600   50G Linux 文件系统
/dev/nvme0n1p3 209717248 1258293247 1048576000  500G Linux 文件系统
[root@server5 ~]# mkfs.ext4 /dev/nvme0n1p1
[root@server5 ~]# mkfs.ext4 /dev/nvme0n1p2
[root@server5 ~]# mkfs.xfs /dev/nvme0n1p3
[root@server5 ~]# mount /dev/nvme0n1p1 /mnt/beegfs/mgmtd/
[root@server5 ~]# mount /dev/nvme0n1p2 /mnt/beegfs/meta/
[root@server5 ~]# mount /dev/nvme0n1p3 /mnt/beegfs/storage/ 

Mgmt服务配置。

[root@server5 ~]# /opt/beegfs/sbin/beegfs-setup-mgmtd -p /mnt/beegfs/mgmtd
[root@server5 ~]# systemctl restart beegfs-mgmtd
[root@server5 ~]# systemctl status beegfs-mgmtd
● beegfs-mgmtd.service - BeeGFS Management Server
     Loaded: loaded (/usr/lib/systemd/system/beegfs-mgmtd.service; enabled; vendor preset: disabled)
     Active: active (running) since Sun 2023-06-25 11:22:00 CST; 2 days ago
       Docs: http://www.beegfs.com/content/documentation/
   Main PID: 18739 (beegfs-mgmtd/Ma)
      Tasks: 11 (limit: 45464)
     Memory: 13.9M
     CGroup: /system.slice/beegfs-mgmtd.service
             └─ 18739 /opt/beegfs/sbin/beegfs-mgmtd cfgFile=/etc/beegfs/beegfs-mgmtd.conf runDaemonized=false

6月 25 11:22:00 server5 systemd[1]: Started BeeGFS Management Server.
[root@server5 ~]# 

Meta服务配置。

Server4
[root@server4 ~]# /opt/beegfs/sbin/beegfs-setup-meta -p /mnt/beegfs/meta -s 54 -m server5
[root@server4 ~]# systemctl restart beegfs-meta
[root@server4 ~]# systemctl status beegfs-meta
● beegfs-meta.service - BeeGFS Metadata Server
     Loaded: loaded (/usr/lib/systemd/system/beegfs-meta.service; enabled; vendor preset: disabled)
     Active: active (running) since Sun 2023-06-25 16:31:57 CST; 2 days ago
       Docs: http://www.beegfs.com/content/documentation/
   Main PID: 4444 (beegfs-meta/Mai)
      Tasks: 63 (limit: 45901)
     Memory: 2.2G
     CGroup: /system.slice/beegfs-meta.service
             └─ 4444 /opt/beegfs/sbin/beegfs-meta cfgFile=/etc/beegfs/beegfs-meta.conf runDaemonized=false

6月 25 16:31:57 server4 systemd[1]: Started BeeGFS Metadata Server.
[root@server4 ~]# 

Server5
[root@server5 ~]# /opt/beegfs/sbin/beegfs-setup-meta -p /mnt/beegfs/meta -s 55 -m server5
[root@server5 ~]# systemctl restart beegfs-meta
[root@server5 ~]# systemctl status beegfs-meta
● beegfs-meta.service - BeeGFS Metadata Server
     Loaded: loaded (/usr/lib/systemd/system/beegfs-meta.service; enabled; vendor preset: disabled)
     Active: active (running) since Sun 2023-06-25 11:22:16 CST; 2 days ago
       Docs: http://www.beegfs.com/content/documentation/
   Main PID: 18763 (beegfs-meta/Mai)
      Tasks: 87 (limit: 45464)
     Memory: 1.7G
     CGroup: /system.slice/beegfs-meta.service
             └─ 18763 /opt/beegfs/sbin/beegfs-meta cfgFile=/etc/beegfs/beegfs-meta.conf runDaemonized=false

6月 25 11:22:16 server5 systemd[1]: Started BeeGFS Metadata Server.
[root@server5 ~]# 

Storage服务配置。

Server4
[root@server4 ~]# /opt/beegfs/sbin/beegfs-setup-storage -p /mnt/beegfs/storage -s 540 -i 5401 -m server5 -f
[root@server4 ~]# systemctl restart beegfs-storage
[root@server4 ~]# systemctl status beegfs-storage
● beegfs-storage.service - BeeGFS Storage Server
     Loaded: loaded (/usr/lib/systemd/system/beegfs-storage.service; enabled; vendor preset: disabled)
     Active: active (running) since Sun 2023-06-25 15:46:33 CST; 2 days ago
       Docs: http://www.beegfs.com/content/documentation/
   Main PID: 4197 (beegfs-storage/)
      Tasks: 21 (limit: 45901)
     Memory: 118.4M
     CGroup: /system.slice/beegfs-storage.service
             └─ 4197 /opt/beegfs/sbin/beegfs-storage cfgFile=/etc/beegfs/beegfs-storage.conf runDaemonized=false

6月 25 15:46:33 server4 systemd[1]: Started BeeGFS Storage Server.
[root@server4 ~]# 

Server5
[root@server5 ~]# /opt/beegfs/sbin/beegfs-setup-storage -p /mnt/beegfs/storage -s 550 -i 5501 -m server5 -f
[root@server5 ~]# systemctl restart beegfs-storage.service 
[root@server5 ~]# systemctl status beegfs-storage.service 
● beegfs-storage.service - BeeGFS Storage Server
     Loaded: loaded (/usr/lib/systemd/system/beegfs-storage.service; enabled; vendor preset: disabled)
     Active: active (running) since Sun 2023-06-25 11:29:58 CST; 2 days ago
       Docs: http://www.beegfs.com/content/documentation/
   Main PID: 18901 (beegfs-storage/)
      Tasks: 21 (limit: 45464)
     Memory: 124.8M
     CGroup: /system.slice/beegfs-storage.service
             └─ 18901 /opt/beegfs/sbin/beegfs-storage cfgFile=/etc/beegfs/beegfs-storage.conf runDaemonized=false

6月 25 11:29:58 server5 systemd[1]: Started BeeGFS Storage Server.
[root@server5 ~]# 
5.1.3.4 状态检查
[root@server6 ~]# beegfs-check-servers 
Management
==========
server5 [ID: 1]: reachable at 172.16.8.55:8008 (protocol: TCP)

Metadata
==========
server4 [ID: 54]: reachable at 172.16.8.54:8005 (protocol: RDMA)
server5 [ID: 55]: reachable at 172.16.8.55:8005 (protocol: RDMA)

Storage
==========
server4 [ID: 540]: reachable at 172.16.8.54:8003 (protocol: RDMA)
server5 [ID: 550]: reachable at 172.16.8.55:8003 (protocol: RDMA)

[root@server6 ~]# beegfs-df
METADATA SERVERS:
TargetID   Cap. Pool        Total         Free    %      ITotal       IFree    %
========   =========        =====         ====    =      ======       =====    =
      54         low      48.9GiB      48.7GiB  99%        3.3M        3.2M  98%
      55         low      48.9GiB      48.7GiB  99%        3.3M        3.2M  98%

STORAGE TARGETS:
TargetID   Cap. Pool        Total         Free    %      ITotal       IFree    %
========   =========        =====         ====    =      ======       =====    =
    5401         low     499.8GiB     464.2GiB  93%      262.1M      262.1M 100%
    5501         low     499.8GiB     464.2GiB  93%      262.1M      262.1M 100%
[root@server6 ~]# beegfs-ctl --listnodes --nodetype=meta --nicdetails
server4 [ID: 54]
   Ports: UDP: 8005; TCP: 8005
   Interfaces: 
   + enp1s0f0[ip addr: 172.16.8.54; type: RDMA]
   + enp1s0f0[ip addr: 172.16.8.54; type: TCP]
server5 [ID: 55]
   Ports: UDP: 8005; TCP: 8005
   Interfaces: 
   + enp1s0f0[ip addr: 172.16.8.55; type: RDMA]
   + enp1s0f0[ip addr: 172.16.8.55; type: TCP]

Number of nodes: 2
Root: 55
[root@server6 ~]# beegfs-ctl --listnodes --nodetype=storage --nicdetails
server4 [ID: 540]
   Ports: UDP: 8003; TCP: 8003
   Interfaces: 
   + enp1s0f0[ip addr: 172.16.8.54; type: RDMA]
   + enp1s0f0[ip addr: 172.16.8.54; type: TCP]
server5 [ID: 550]
   Ports: UDP: 8003; TCP: 8003
   Interfaces: 
   + enp1s0f0[ip addr: 172.16.8.55; type: RDMA]
   + enp1s0f0[ip addr: 172.16.8.55; type: TCP]

Number of nodes: 2
[root@server6 ~]# beegfs-ctl --listnodes --nodetype=client --nicdetails
5751-649AC71D-server6 [ID: 8]
   Ports: UDP: 8004; TCP: 0
   Interfaces: 
   + enp7s0[ip addr: 172.16.8.56; type: TCP]
   + enp7s0[ip addr: 172.16.8.56; type: RDMA]

Number of nodes: 1
[root@server6 ~]# beegfs-net 

mgmt_nodes
=============
server5 [ID: 1]
   Connections: TCP: 1 (172.16.8.55:8008); 

meta_nodes
=============
server4 [ID: 54]
   Connections: RDMA: 4 (172.16.8.54:8005); 
server5 [ID: 55]
   Connections: RDMA: 4 (172.16.8.55:8005); 

storage_nodes
=============
server4 [ID: 540]
   Connections: RDMA: 4 (172.16.8.54:8003); 
server5 [ID: 550]
   Connections: RDMA: 4 (172.16.8.55:8003); 

[root@server6 ~]# 

5.1.4 挂载测试

[root@server6 ~]# df -h
文件系统                容量  已用  可用 已用% 挂载点
devtmpfs                1.8G     0  1.8G    0% /dev
tmpfs                   1.8G  4.0K  1.8G    1% /dev/shm
tmpfs                   1.8G  8.7M  1.8G    1% /run
tmpfs                   1.8G     0  1.8G    0% /sys/fs/cgroup
/dev/mapper/rocky-root  9.0G  6.8G  2.2G   76% /
/dev/vda2               994M  431M  564M   44% /boot
/dev/vda1                99M  5.8M   94M    6% /boot/efi
tmpfs                   367M     0  367M    0% /run/user/0
beegfs_nodev           1000G   72G  929G    8% /mnt/beegfs
[root@server6 ~]# 

5.1.5 安装IO500(IOR&mdtest)

安装OpenMPI。

[root@server6 ~]# mkdir iobench_tools
# 下载源码包
[root@server6 iobench_tools]# wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.1.tar.gz
[root@server6 iobench_tools]# tar xvf openmpi-4.1.1.tar.gz
[root@server6 iobench_tools]# cd openmpi-4.1.1
# 编译安装
[root@server6 openmpi-4.1.1]# yum install automake gcc gcc-c++ gcc-gfortran
[root@server6 openmpi-4.1.1]# mkdir /usr/local/openmpi
[root@server6 openmpi-4.1.1]# ./configure --prefix=/usr/local/openmpi/
[root@server6 openmpi-4.1.1]# make
[root@server6 openmpi-4.1.1]# make install
# 配置环境变量
[root@server6 openmpi-4.1.1]# export PATH=$PATH:/usr/local/openmpi/bin
[root@server6 openmpi-4.1.1]# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/openmpi/lib
# 安装结果验证
[root@server6 openmpi-4.1.1]# mpirun --version
mpirun (Open MPI) 4.1.1

Report bugs to http://www.open-mpi.org/community/help/
# 运行测试
[root@server6 openmpi-4.1.1]# cd ..
[root@server6 iobench_tools]# echo '#include <mpi.h>
#include <stdio.h>

int main(int argc, char** argv) {
    MPI_Init(&argc, &argv);
    int world_rank;
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
    printf("Hello from process %d\n", world_rank);
    MPI_Finalize();
    return 0;
}' > mpi_hello.c
[root@server6 iobench_tools]# mpicc mpi_hello.c -o mpi_hello
[root@server6 iobench_tools]# mpirun --allow-run-as-root -mca btl ^openib -n 2 ./mpi_hello
Hello from process 0
Hello from process 1
[root@server6 iobench_tools]# 
# 添加环境变量到用户的bashrc文件
[root@server6 iobench_tools]# tail ~/.bashrc
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

export PATH=$PATH:/usr/local/openmpi/bin:/usr/local/ior/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/openmpi/lib:/usr/local/ior/lib
export MPI_CC=mpicc

export OMPI_ALLOW_RUN_AS_ROOT=1
export OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1
[root@server6 iobench_tools]# source ~/.bashrc

安装IOR(mdtest)。

# 下载源代码
[root@server6 iobench_tools]# yum install git
[root@server6 iobench_tools]# git clone https://github.com/hpc/ior.git
[root@server6 iobench_tools]# cd ior/
# 编译安装
[root@server6 ior]# ./bootstrap 
[root@server6 ior]# mkdir /usr/local/ior
[root@server6 ior]# ./configure --prefix=/usr/local/ior/
[root@server6 ior]# make
[root@server6 ior]# make install
# 添加环境变量到用户的bashrc文件
[root@server6 ior]# tail ~/.bashrc
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

export PATH=$PATH:/usr/local/openmpi/bin:/usr/local/ior/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/openmpi/lib:/usr/local/ior/lib
export MPI_CC=mpicc

export OMPI_ALLOW_RUN_AS_ROOT=1
export OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1
[root@server6 ior]# source ~/.bashrc 

安装IO500。

# 下载源码
[root@server6 iobench_tools]# git clone https://github.com/IO500/io500.git
[root@server6 iobench_tools]# cd io500
# 编译安装
[root@server6 io500]# ./prepare.sh
# 获取所有配置项
[root@server6 io500]# ./io500 --list > config-all.ini
# 自定义测试配置
[root@server6 io500]# cat config-beegfs.ini 
[global]
datadir = /mnt/beegfs/io500
timestamp-datadir = TRUE
resultdir = ./results
timestamp-resultdir = TRUE
api = POSIX
drop-caches = FALSE
drop-caches-cmd = sudo -n bash -c "echo 3 > /proc/sys/vm/drop_caches"
io-buffers-on-gpu = FALSE
verbosity = 1
scc = TRUE
dataPacketType = timestamp

[debug]
stonewall-time = 30

[ior-easy]
API = 
transferSize = 1m
blockSize = 204800m
filePerProc = TRUE
uniqueDir = FALSE
run = TRUE
verbosity = 

[ior-easy-write]
API = 
run = TRUE

[mdtest-easy]
API = 
n = 500000
run = TRUE

[mdtest-easy-write]
API = 
run = TRUE

[find-easy]
external-script = 
external-mpi-args = 
external-extra-args = 
nproc = 
run = TRUE
pfind-queue-length = 10000
pfind-steal-next = FALSE
pfind-parallelize-single-dir-access-using-hashing = FALSE

[ior-hard]
API = 
segmentCount = 500000
collective = 
run = TRUE
verbosity = 

[ior-hard-write]
API = 
collective = 
run = TRUE

[mdtest-hard]
API = 
n = 500000
files-per-dir = 
run = TRUE

[mdtest-hard-write]
API = 
run = TRUE

[find]
external-script = 
external-mpi-args = 
external-extra-args = 
nproc = 
run = TRUE
pfind-queue-length = 10000
pfind-steal-next = FALSE
pfind-parallelize-single-dir-access-using-hashing = FALSE

[find-hard]
external-script = 
external-mpi-args = 
external-extra-args = 
nproc = 
run = FALSE
pfind-queue-length = 10000
pfind-steal-next = FALSE
pfind-parallelize-single-dir-access-using-hashing = FALSE

[mdworkbench-bench]
run = FALSE

[ior-easy-read]
API = 
run = TRUE

[mdtest-easy-stat]
API = 
run = TRUE

[ior-hard-read]
API = 
collective = 
run = TRUE

[mdtest-hard-stat]
API = 
run = TRUE

[mdtest-easy-delete]
API = 
run = TRUE

[mdtest-hard-read]
API = 
run = TRUE

[mdtest-hard-delete]
API = 
run = TRUE

[root@server6 io500]# 

5.1.6 安装dbench

[root@server6 iobench_tools]# yum install dbench

5.2 交换机

5.2.1 CX532P-N的配置结果

532# show running-config 
!
class-map ecn_map
 match cos 3 4
!
vlan 456
!
policy-map ecn
 class ecn_map
  wred default_ecn
!
interface ethernet 0/16
 breakout 4x25G[10G]
 service-policy ecn
 switchport access vlan 456
exit
!
interface ethernet 0/17
 service-policy ecn
 switchport access vlan 456
exit
!
interface ethernet 0/18
 service-policy ecn
 switchport access vlan 456
exit
!
interface ethernet 0/19
 service-policy ecn
 switchport access vlan 456
exit
!
ip route 0.0.0.0/0 10.230.1.1 200
!
end

532# show interface priority-flow-control 
       Port    PFC0    PFC1    PFC2    PFC3    PFC4    PFC5    PFC6    PFC7
-----------  ------  ------  ------  ------  ------  ------  ------  ------
        0/0       -       -       -  enable  enable       -       -       -
        0/4       -       -       -  enable  enable       -       -       -
        0/8       -       -       -  enable  enable       -       -       -
       0/12       -       -       -  enable  enable       -       -       -
       0/16       -       -       -  enable  enable       -       -       -
       0/17       -       -       -  enable  enable       -       -       -
       0/18       -       -       -  enable  enable       -       -       -
       0/19       -       -       -  enable  enable       -       -       -
       0/20       -       -       -  enable  enable       -       -       -
       0/24       -       -       -  enable  enable       -       -       -
       0/28       -       -       -  enable  enable       -       -       -
       0/32       -       -       -  enable  enable       -       -       -
       0/36       -       -       -  enable  enable       -       -       -
       0/40       -       -       -  enable  enable       -       -       -
       0/44       -       -       -  enable  enable       -       -       -
       0/48       -       -       -  enable  enable       -       -       -
       0/52       -       -       -  enable  enable       -       -       -
       0/56       -       -       -  enable  enable       -       -       -
       0/60       -       -       -  enable  enable       -       -       -
       0/64       -       -       -  enable  enable       -       -       -
       0/68       -       -       -  enable  enable       -       -       -
       0/72       -       -       -  enable  enable       -       -       -
       0/76       -       -       -  enable  enable       -       -       -
       0/80       -       -       -  enable  enable       -       -       -
       0/84       -       -       -  enable  enable       -       -       -
       0/88       -       -       -  enable  enable       -       -       -
       0/92       -       -       -  enable  enable       -       -       -
       0/96       -       -       -  enable  enable       -       -       -
      0/100       -       -       -  enable  enable       -       -       -
      0/104       -       -       -  enable  enable       -       -       -
      0/108       -       -       -  enable  enable       -       -       -
      0/112       -       -       -  enable  enable       -       -       -
      0/116       -       -       -  enable  enable       -       -       -
      0/120       -       -       -  enable  enable       -       -       -
      0/124       -       -       -  enable  enable       -       -       -
 
532# show interface ecn
       Port    ECN0    ECN1    ECN2    ECN3    ECN4    ECN5    ECN6    ECN7
-----------  ------  ------  ------  ------  ------  ------  ------  ------
        0/0       -       -       -       -       -       -       -       -
        0/4       -       -       -       -       -       -       -       -
        0/8       -       -       -       -       -       -       -       -
       0/12       -       -       -       -       -       -       -       -
       0/16       -       -       -  enable  enable       -       -       -
       0/17       -       -       -  enable  enable       -       -       -
       0/18       -       -       -  enable  enable       -       -       -
       0/19       -       -       -  enable  enable       -       -       -
       0/20       -       -       -       -       -       -       -       -
       0/24       -       -       -       -       -       -       -       -
       0/28       -       -       -       -       -       -       -       -
       0/32       -       -       -       -       -       -       -       -
       0/36       -       -       -       -       -       -       -       -
       0/40       -       -       -       -       -       -       -       -
       0/44       -       -       -       -       -       -       -       -
       0/48       -       -       -       -       -       -       -       -
       0/52       -       -       -       -       -       -       -       -
       0/56       -       -       -       -       -       -       -       -
       0/60       -       -       -       -       -       -       -       -
       0/64       -       -       -       -       -       -       -       -
       0/68       -       -       -       -       -       -       -       -
       0/72       -       -       -       -       -       -       -       -
       0/76       -       -       -       -       -       -       -       -
       0/80       -       -       -       -       -       -       -       -
       0/84       -       -       -       -       -       -       -       -
       0/88       -       -       -       -       -       -       -       -
       0/92       -       -       -       -       -       -       -       -
       0/96       -       -       -       -       -       -       -       -
      0/100       -       -       -       -       -       -       -       -
      0/104       -       -       -       -       -       -       -       -
      0/108       -       -       -       -       -       -       -       -
      0/112       -       -       -       -       -       -       -       -
      0/116       -       -       -       -       -       -       -       -
      0/120       -       -       -       -       -       -       -       -
      0/124       -       -       -       -       -       -       -       -

532# 

6 参考资料

【1】BeeGFS Documentation 7.3.3 – Architecture、Quick Start Guide、RDMA Support
【2】高性能计算IO 500存储优化:实践与经验
【3】Github:open-mpi/ompi
【4】Github:IO500/io500
【5】AWS FSx Lustre 并行文件系统在 HPC 中的应用和性能评估

配置指导:使用OpenWrt制作出口设备

1 目标概述

本文主要描述如何使用OpenWrt镜像在X86服务器上制作出口设备。

2 适用场景

  • 需要搭建模拟测试环境对接防火墙或BGP设备。
  • 需要输出带防火墙等相关的验证解决方案的材料。

注意:OpenWrt不支持VRF。

3 获取软件

下载地址:openwrt-22.03.5-x86-64-generic-ext4-combined.img.gz
https://downloads.openwrt.org/releases/22.03.5/targets/x86/64/openwrt-22.03.5-x86-64-generic-ext4-combined.img.gz

4 硬件与软件环境

4.1 硬件环境

名称型号硬件指标备注
服务器或台式机X86CPU大于4核
内存大于4G
安装的centos7
表1:硬件环境

4.2 软件环境

软件版本备注
OpenWrtopenwrt-22.03.5-x86-64-generic-ext4-combined.img/
vncviewerVncviewer-4.2.9/
表2:软件环境

5 KVM安装OpenWrt

5.1 KVM安装

关闭selinux:

临时关闭:setenforce 0
永久关闭:
vim /etc/sysconfig/selinux 
打开文件设置 SELINUX=disabled

安装KVM相关软件包:

yum install qemu-kvm qemu-img virt-manager libvirt libvirt-python virt-manager libvirt-client virt-install virt-viewer -y

启动libvirt并设置开机自启动:

systemctl start libvirtd
systemctl enable libvirtd

5.2 安装OpenWrt

下载组件
OpenWrt官网地址: https://openwrt.org/zh/downloads
固件下载地址: https://downloads.openwrt.org/releases/
找到最新版的固件, 我这里选择的是:
https://downloads.openwrt.org/releases/22.03.5/targets/x86/64/openwrt-22.03.5-x86-64-generic-ext4-combined.img.gz

#下载后先解压缩:
#wget https://downloads.openwrt.org/releases/22.03.5/targets/x86/64/openwrt-22.03.5-x86-64-generic-ext4-combined.img.gz
#gzip -d openwrt-22.03.5-x86-64-generic-ext4-combined.img.gz

安装命令

#先创建服务器上的网桥br0,给网桥br0配置IP,挂载物理网口。
[root@computer1 opt]#brctl addbr br0
[root@computer1 opt]#brctl addif eno2
[root@computer1 opt]# ip address add 10.240.4.223 dev br0 
#如果要把配置固化下来,可以写到配置文件里面。
[root@computer1 opt]#vi /etc/sysconfig/network-scripts/ifcfg-bro
TYPE=bridge
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=no
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=10.240.4.223
PREFIX=24
GATEWAY=10.240.4.1
[root@computer1 opt]#vi /etc/sysconfig/network-scripts/ifcfg-eno2
TYPE=Ethernet
BOOTPROTO=none
NM_CONTROLLED=no
NAME=eno2
DEVICE=eno2
ONBOOT=yes
BRIDGE=br0

virt-install --name openwrt --ram 1024 --vcpus 2 --disk path=/opt/openwrt-22.03.5-x86-64-generic-ext4-combined.img --network bridge=br0,model=e1000  --force --import --autostart  --vnc --vncport=5911  --vnclisten=0.0.0.0
命令行

可以通过vncviewr访问

连接信息

也可以直接在服务器通过virsh console openwrt访问

命令行

如果想重新创建,先删除
[root@computer1 opt]# virsh undefine openwrt
Domain openwrt has been undefined
[root@computer1 opt]# virsh destroy openwrt
Domain openwrt destroyed

#给OpenWrt虚拟机配置业务IP

#OpenWrt默认会创建网桥br-lan,并且该网桥绑定eth0

命令行

6 高可用方案

创建另一台 OpenWrt虚机
复制镜像

cp  openwrt-22.03.5-x86-64-generic-ext4-combined.img  openwrt-22.03.5-x86-64-generic-ext4-combined-2.img

启动第二台OpenWrt(主要修改name、镜像名字、vncport)

virt-install --name openwrt2 --ram 1024 --vcpus 2 --disk path=/opt/openwrt-22.03.5-x86-64-generic-ext4-combined-2.img --network bridge=br0,model=e1000  --force --import --autostart  --vnc --vncport=5912  --vnclisten=0.0.0.0

登陆后修改第二台OpenWrt的IP为10.240.4.225

root@OpenWrt:~# vi /etc/config/network
config interface 'loopback'
        option device 'lo'
        option proto 'static'
        option ipaddr '127.0.0.1'
        option netmask '255.0.0.0'

config globals 'globals'
        option ula_prefix 'fd0a:d001:29bb::/48'

config device
        option name 'br-lan'
        option type 'bridge'
        list ports 'eth0'

config interface 'lan'
        option device 'br-lan'
        option proto 'static'
        option ipaddr '10.240.4.225'
        option netmask '255.255.255.0'
        option ip6assign '60'

给两台OpenWrt添加默认路由

修改DNS

两台OpenWrt,安装keepalived

配置keepalived
两台虚机修改/etc/config/keepalived

修改/etc/keepalived/keepalived.conf

重新启动服务:

在主路由上面 ip a 命令可以看到 vip 地址已经有了,电脑ping 这个地址可以通了
主机IP 10.240.4.224/24,备机IP 10.240.4.225/24
主机关闭该服务后IP只有10.240.4.224/24,虚拟IP丢失。

root@OpenWrt:/# /etc/init.d/keepalived stop

查看备机加载了虚拟IP:10.240.4.226/24

root@OpenWrt:/# ip a|grep br-lan
br-lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
inet 10.240.4.225/24 brd 10.240.4.255 scope global br-lan
inet 10.240.4.226/24 scope global secondary br-lan

主机重启该服务后虚拟IP重新加载

root@OpenWrt:/# /etc/init.d/keepalived restart
备机同时则虚拟IP丢失
root@OpenWrt:/# ip a|grep br-lan
br-lan: mtu 1500 qdisc noqueue state UP group default
inet 10.240.4.225/24 brd 10.240.4.255 scope global br-lan

说明:
直接方法就是断开任意一个路由(10.240.4.224或者10.240.4.225),看虚拟路由VIP:10.240.4.226是否ping通。
有需要对wan口配置vrrp,可以参考官网配置:https://openwrt.org/docs/guide-user/network/high-availability

7 防火墙功能

OpenWrt 内置防火墙介绍

Openwrt 的防火墙实现与Linux的防火墙是通过netfilter内核模块,加上用户空间的iptables管理工具;同样是五链四张表、五元素的管理框架。
OpenWRT开发了一套与iptables同地位的netfilter管理工具fw3,这个工具侧重于从uci格式的配置文件中获取过滤信息下发到内核的netfilter中去。防火墙文件总会在/etc/init.d/firewall 启动的时候由 UCI 解码并且生成 iptables规则生效。
OpenWrt 关于 NAT、 DMZ、防火墙规则等等都是由配置文件 /etc/config/firewall 文件控制。

防火墙的修改生效,需要重启防火墙执行以下指令:

查看当前 iptables 的已启用策略语法为:

root@OpenWrt:/# iptables –L

防火墙内容解析

我们打开防火墙文件查看一下:

第一部分 默认参数

这里是防火墙默认的参数表,其内容和相应的动作可以有如下选择:
防火墙文件这方面的内容为:
syn_flood 1 表示: 是否启用防泛洪攻击。可选值: 0 关闭,1 启用。

input ACCEPT 表示: 设置 INPUT 链(chain)的过滤策略,可选值: ACCEPT 允许, REJECT拒绝。
output ACCEPT 表示: 设置 OUTPUT 链(chain)的过滤策略,可选值: ACCEPT 允许,REJECT 拒绝。
forward REJECT 是 设置 FORWARD 链(chain)的过滤策略,可选值: ACCEPT 允许,REJECT 拒绝。
disable_ipv6 1 表示: 设置关闭掉 IPv6 的防火墙策略,可选值: 0 忽略,1 关闭
这部分参考值既是系统默认的即可,无需修改。

第二部分 域 :

config zone
option name 'lan'
list network 'lan'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'ACCEPT'

config zone
option name 'wan'
list network 'wan'
list network 'wan6'
option input 'REJECT'
option output 'ACCEPT'
option forward 'REJECT'
option masq '1' #NAT转换使能
option mtu_fix '1'

config 后面是表示配置项的名称,这里”zone”为域的意思。
name 表示域的名字,必须是唯一值,可选值: wan, lan
network 表示网络列表,用来指示哪些接口被捆绑到这个域中,可选接口的名称,比如: lan,
wan, wan6
input ACCEP 允许 INPUT 链(chain)的过滤策略
output ACCEPT 允许 OUTPUT 链(chain)的过滤策略
forward ACCEPT 允许 FORWARD 链(chain)的过滤策略
masq 1 表示: 设置传输伪装,如果是 WAN 口必须为 1,实现NAT转换使能
mtu_fix 1 表示: 设置 MTU 的 MSS Clamping,如果是 WAN 口设为 1

简单来说:
mtu 是网络传输最大报文包。
mss 是网络传输数据最大值。
mss 加包头数据就等于 mtu.

这部分的设置作用如下:
zone将一个或多个接口分组,并用作forwardings, rules and redirects的源或目的地。传出流量的Masquerading(NAT)是在每个zone的基础上进行控制的。

第三部分 转发

config forwarding
option src 'lan'
option dest 'wan'

src lan 是设置转发来源
dest wan 是设置转发目标
这部分作用描述如下:
Forwarding部分控制zones之间的业务流,并且可以实现特定方向的MSS Clamping。转发规则只涵盖一个方向。为了允许两个zone之间的双向流量,需要两个转发,其中src和dest分别反向。

第四部分 规则

config rule
option name ‘Allow-DHCP-Renew’
option src ‘wan’
option proto ‘udp’
option dest_port ’68’
option target ‘ACCEPT’
option family ‘ipv4’

config rule
option name ‘Allow-Ping’
option src ‘wan’
option proto ‘icmp’
option icmp_type ‘echo-request’
option family ‘ipv4’
option target ‘ACCEPT’

config rule
option name ‘Allow-IGMP’
option src ‘wan’
option proto ‘igmp’
option family ‘ipv4’
option target ‘ACCEPT’

这里只是罗列出了几个防火墙的规则,其实防火墙规则在/etc/config/firewall 中可以有任意数量的规则,这些规则定义了数据传输的动作和行为是被允许还是拒绝。

对于防火墙规则的作用描述如下:
规则可用于定义基本的接受或拒绝规则,以允许或限制对特定端口或主机的访问。像重定向,规则被绑定到给定的source zone,并与传入的流量相匹配。

防火墙规则的相应选项的意思:

name 表示:设置当前这个 rule 的名称
target 表示:设置防火墙动作,可选值: ACCEPT 许可, REJECT 拒绝, DROP 抛弃
src 表示: 数据源的 zone 域是哪个。可选值: wan / lan
src_ip 表示:数据源的 IP 地址是哪个。
src_mac 表示:数据源的 MAC 地址是哪个。
src_port 表示:数据源的端口,可以是一个端口,或一个端口范围,但是必须

同时指定了协议类型
proto 表示: 数据源的协议类型, 可选值: tcp, udp, tcpudp, udplit, icmp, esp, ah, sctp,
或 all 表示全部
dest 表示:数据目标的 zone 域是哪个。可选值: wan / lan
dest_ip 表示:数据目标的 IP 地址。
dest_port 表示:数据目标的端口,可以是一个端口,或一个端口范围,但是必须同时指定了协议类型
family 表示:数据的协议族,可选值: ipv4, ipv6, any
rule 规则设置可以灵活,比如允许来自 WAN 口的 ping,

例:

第五部分内容 端口转发、重定向

OpenWrt 防火墙允许使用者通过 WAN 口访问特定的端口重定向给局域网的一台电脑设备(比如 WAN 口访问 80 端口(HTTP)将重定向给局域网某台网站服务器)。 端口重定向是在防火墙配置/etc/config/firewall 中定义 redirect 段策略实现的。所有匹配的来源数据将根据目标设置转发到目标主机上。 firewall 配置中可以有多个 redirect 策略,默认是没有开放任何重定向的,如果需要重定向请使用 vi 或 UCI 进行配置。
name 表示:设置当前这个 redirect 的名称
src 表示:转发源的 zone 域,一般转发都是转发从 wan 过来的访问
src_ip 表示:转发源的 IP 地址指定
src_mac 表示:转发源的 MAC 地址指定
src_port 表示:转发源的端口指定
proto 表示: 转发源的协议类型, 可选值: tcp, udp, tcpudp, udplit, icmp, esp, ah, sctp, 或
all 表示全部
dest 表示:转发目标的 zone 域
dest_ip 表示:转发目标的 IP 地址指定
dest_mac 表示:转发目标的 MAC 地址指定
dest_port 表示:转发目标的端口指定
端口重定向的可配置性很灵活。比如我们将 8080 这个端口转发给内网一台服务器的 18080 端口。

第六部分内容 IPV6

第七部分 IPSec

允许 IPSec tunnel 通过防火墙,分别 IKA SA 、IPSec SA 放行。

第八部分 扩展内容

DMZ 介绍

DMZ 是英文“ demilitarized zone”的缩写,中文名称为“隔离区”。它是为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间的缓冲区,这个缓冲区位于企业内部网络和外部网络之间的小网络区域内,在这个小网络区域内可以放置一些必须公开的服务器设施,如企业 Web 服务器、FTP 服务器和论坛等。另一方面,通过这样一个 DMZ 区域,更加有效地保护了内部网络,因为这种网络部署,比起一般的防火墙方案,对攻击者来说又多了一道关卡。端口映射与 DMZ 的区别在于:端口映射只是映射指定的端口,DMZ 相当于映射所有的端口,并且直接把主机暴露在网关中,比端口映射方便但是不安全。
下面是关于 DMZ的一个示意图:

DMZ

结合之前简单的规则部分,这里我们给出一个将电脑 192.168.1.2 设置 DMZ 隔离区的例子:

Simple DMZ rule
The following rule redirects all WAN ports for all protocols to the internal host
192.168.1.2.
config redirect
option src wan
option proto all
option dest_ip 192.168.1.2

iptables 命令
DNAT 目的地址、目的端口的转换

iptables -t nat -A zone_wan_prerouting -p tcp \
-s 192.168.9.20/255.255.255.255\
-d 192.168.8.20/255.255.255.255\
-m tcp --sport 3333 --dport 2222\
-m comment --comment "@redirect[0]"\
-j DNAT --to-destination 192.168.10.20:22

如果遇到“源地址192.168.8.20,目的地址192.168.8.20,源端口3333,目的端口2222”的数据包,修改成“源地址192.168.168.8.20,目的地址192.168.10.20,源端口3333,目的端口22”的数据包。

iptables -t nat -A zone_wan_prerouting -p tcp\
-d 192.168.8.20/255.255.255.255\
-m tcp --dport 2222 -m comment\
--comment "@redirect[0]" -j REDIRECT --to-ports 22

如果遇到“目的地址192.168.8.20,目的端口2222,协议为tcp”的数据包,修改成“源地址保持,目的地址192.168.10.20,源端口保持,目的端口22,协议为tcp”的数据包。

SNAT 数据包的源地址转换

iptables -t nat -A zone_lan_postrouting -p tcp\
-s 192.168.9.20/255.255.255.255\
-d 192.168.10.20/255.255.255.255\
-m tcp --sport 3333 --dport 22\
-m comment --comment "@redirect[0]" \
-j SNAT --to-source 192.168.8.20:2222

当遇到“源地址192.168.9.20,目的地址192.168.10.20,源端口3333,目的端口22,协议为TCP”的数据包时,将其源地址和源端口修改为(192.168.8.20,2222)

查看 NAT 表,区别 uci 配置与 iptables 配置的关系

root@ixeCloud:/etc/config# iptables -t nat -L |tail -n 5
prerouting_wan_rule all -- anywhere anywhere /* !fw3: Custom wan prerouting rule chain */
DNAT tcp -- anywhere anywhere tcp dpt:8080 /* !fw3: port-redirect */ to:192.168.40.2:18080
REDIRECT tcp -- anywhere anywhere tcp dpt:2000 /* !fw3: port-2000 */ redir ports 22
DNAT tcp -- 192.168.9.20 192.168.8.20 tcp spt:3333 dpt:2222 /* @redirect[0] */ to:192.168.10.20:22
REDIRECT tcp -- anywhere 192.168.8.20 tcp dpt:2222 /* @redirect[0] */ redir ports 22

通过 uci 命令修改的 firewall 的内容,需要加载 firewall reload 后,防火墙参数才可以生效;而 iptables 命令修改后直接生效。
注意: 在 OpenWRT 的 web 配置页面不显示 iptables 配置的NAT内容。

8 BGP功能

BGP Routing on OpenWrt with Quagga
Quagga Routing Suite是一个开源软件套件,为 Unix 平台提供稳定的 BGPv4 实现。它由一个核心 zebra 守护进程和支持各种路由协议(包括 RIP、OSPF 和 BGP)的守护进程组成。
在 OpenWrt 上安装组件

9 端口聚合功能

重新创建虚机,添加两个接口

virt-install --name openwrt --ram 1024 --vcpus 2 --disk path=/opt/openwrt-22.03.5-x86-64-generic-ext4-combined.img --network bridge=br0,model=e1000 --network bridge=br0,model=e1000 --force --import --autostart  --vnc --vncport=5911  --vnclisten=0.0.0.0

给OpenWRT安装必要软件包,以启用bond的支持

opkg update
opkg install kmod-bonding luci-proto-bonding proto-bonding

接着从br-lan中移除eth0

brctl delif br-lan eth0
ifconfig br-lan down

在自动启动脚本中增加如下配置,以便在开机时自动创建bond网卡
需要添加的内容如下(添加至 exit 0之前),需要根据实际情况修改网卡名称(即下方的eth0和eth1为你要聚合的两个网口)

modprobe bonding mode=balance-rr miimon=100
#添加 bond 类型的虚拟接口 名称为 bond-wan
ip link add bond-wan type bond mode balance-rr 
#将eth0添加到聚合接口
ifconfig eth0 down 
ip link set eth0 master bond-wan
#将eth1添加到聚合接口
ifconfig eth1 down
ip link set eth1 master bond-wan 
ip link set bond-wan up #启动该网卡

修改 wan 接口的网卡为 bond-wan 。
同理,如果要对lan接口做聚合,可以配置bond-lan,然后修改 lan接口的网卡为 bond-lan。
如果不想用命令行添加,也可以在界面luci上添加。
网络 -> 接口 -> 添加新接口-> 新接口的协议 -> 链路聚合(通道绑定)
之后在 高级设置->从属接口 选择网卡,其他参数默认即可
配置IP和路由:

ifconfig bond-wan 10.240.4.224 netmask 255.255.255.0
route add default gw 10.240.4.1

10 创建VLAN

1) 在 “接口” 页面,切换至 “设备” 选项卡,点击左下角的 “添加设备配置”,添加一 “网桥设备”。如果是新安装的OpenWrt,也可直接编辑网桥设备 “br-lan”,在名为 “br-lan” 设备的右侧,点击 “配置” 按钮。
2) 在“常规设备选项”中,将“网桥端口”更改为eth0,此时所有eth0端口的数据将经过该网桥。

创建VLAN

3) 切换至 “网桥VLAN过滤” 选项卡,启用VLAN过滤,并新增VLAN 101、1000。eth0作为他们俩已标记的出口。设置完毕后点击“保存”按钮。这样,网桥内VLAN ID为101、1000的数据,将会被打上VLAN Tag后,从eth0端口发送。

网桥VLAN过滤

4) 在“设备”界面,可见自动新增了两个软件VLAN设备。通过eth0进入网桥“br-lan”的数据,将根据VLAN ID标签,将其转发至虚拟的br-lan.1000和br-lan.101设备。同时,br-lan.1000和br-lan.101设备发送的数据,进入网桥br-lan后,将根据设定的VLAN过滤规则,决定是否加上VLAN Tag从对应的实际硬件设备进行转发。

新增设备

基于CX-M的PXE环境部署验证 —以UEFI启动为例

1 目的

该文档旨在以CX-M设备完成PXE预启动执行环境的搭建,从而进行计算终端操作系统的自动化部署安装工作。

2 PXE介绍

PXE(Pre-boot Execution Environment)预启动执行环境是一种网络引导协议,它规范描述了一种标准化的Client/Server环境,允许终端在没有本地存储设备(如硬盘)或操作系统的情况下,通过网络连接到服务器并获取所需的启动文件来启动操作系统。

2.1 工作原理

  • PXE启动:当终端进入网卡启动时,会发送一个特殊的PXE启动请求到本地网络上的DHCP服务器。
  • DHCP服务:DHCP服务器收到PXE启动请求后,会向计算机发送DHCP响应,DHCP响应包含了计算的网络配置信息,以及PXE引导服务器的IP地址——TFTP Server(Trivial File Transfer Protocol)。
  • TFTP传输:计算机收到DHCP相应后,会使用TFTP从Server下载引导文件——pxelinux.0或者bootx64.efi。
  • 加载引导文件:计算机加载并执行从TFTP下载的引导文件。引导文件通常是一个小型的Linux内核,能够连接到PXE服务器并获取操作系统镜像。
  • 获取配置信息:引导文件连接到PXE服务器后,会通过TFTP发送请求以获取更多的配置信息。
  • 获取操作系统镜像:PXE服务器根据计算机的请求,将系统镜像发送给计算机。
  • 操作系统加载:一旦操作系统镜像文件下载完成,计算机会加载并执行该镜像文件。此时,计算机将完全从网络上运行操作系统,而无需本地硬盘上的安装。
图片1.1PXE启动流程

图1.1:PXE启动流程

注:

  1. 网卡支持PXE,目前新出的网卡基本都支持,同时需要完成BIOS的启动项配置。
  2. 传统启动模式(Legacy)下,PXE客户端会请求pxelinux.0;UEFI启动会请求bootx64.efi。
  3. 也可以采用nfsboot方式,该流程采用的时ISO镜像下载再安装的方式。

具体配置

PXE Server所需的组件全部部署在CX-M上,即一台CX-M设备即可满足PXE的需求。

3.1 安装配置TFTP

mkdir /home/admin/tftp
sudo apt install tftpd-hpa

sudo vi /etc/default/tftpd-hpa
TFTP_USERNAME=”tftp”
TFTP_DIRECTORY=”/home/admin/tftp”
TFTP_ADDRESS=”0.0.0.0:69”
TFTP_OPTIONS=”—secure -c”

admin@ASW-06:~$ sudo systemctl restart tftpd-hpa

注:如果上传下载TFTP报权限相关问题,需要通过chown tftp:tftp /home/admin/tftp/以及在配置文件中的TFTP_OPTIONS加入 -c后重启服务来解决。

测试输出如下信息即可用:

C:\Users\honghao>TFTP host 10.110.0.10 get /install.log install.log
传输成功: 1 秒 9090 字节,9090 字节/秒

3.2 准备启动文件

完整目录结构如下所示:

/home/admin/tftp/
├── boot
│   └── live-server
│       ├── initrd
│       └── vmlinuz
├── grub
│   ├── bootx64.efi
│   ├── font.pf2
│   └── grub.cfg
└── grubx64.efi

3.2.1 创建目录

mkdir /home/admin/tftp/grub
mkdir /home/admin/tftp/boot
mkdir /home/admin/tftp/boot/live-server

3.2.2 获取引导文件

apt-get download shim.signed
apt-get download grub-efi-amd64-signed
dpkg -x shim.signed shim
dpkg -x grub-efi-amd64-signed grub
cp ./grub/usr/lib/grub/x86_64-efi-signed/grubnetx64.efi.signed  /home/admin/tftp/grubx64.efi
cp ./shim/usr/lib/shim/shimx64.efi.signed  /home/admin/tftp/grub/bootx64.efi

注:

  • 如果报文件不存在错误,可通过shim.signed以及grub-efi-amd64-signed来手动下载。
  • bootx64.efi文件是UEFI系统的启动管理器,它会在计算机启动时被加载到内存中,然后启动操作系统的安装程序或引导管理器。这个文件通常位于Linux ISO image的EFI目录下,它可以被用来启动UEFI系统安装程序或启动其他操作系统的引导管理器。
  • grubx64.efi是GNU GRUB(GRand Unified Bootloader)引导管理器的UEFI版本,它是一种常用的引导程序,被广泛应用于Linux系统中。当计算机使用UEFI启动时,UEFI固件会查找EFI目录下的grubx64.efi文件,并将其加载到内存中。然后,grubx64.efi将会显示一个菜单,列出可用的操作系统和内核,允许用户选择要启动的操作系统或内核。在Linux ISO image中,grubx64.efi文件通常被用作引导管理器,用于启动Linux操作系统的安装程序。

3.2.3 获取内核镜像文件

3.2.3.1 下载镜像文件

直接从官网进行下载,以ubuntu-20.04.6-live-server-amd64.iso为例。只有live版镜像支持subiquity——Ubuntu Server安装程序,使用cloud-init进行自动安装。

3.2.3.2 复制镜像文件

sudo mount ubuntu-20.04.6-live-server-amd64.iso /media
cp /media/casper/initrd       /home/admin/tftp/boot/live-server
cp /media/casper/vmlinuz      /home/admin/tftp/boot/live-server

注:vmlinuz(可引导的、压缩的内核),initrd(系统引导过程中挂载的一个临时根文件系统)。

3.2.3.3 复制配置文件

cp /media/grub/font.pf2       /home/admin/tftp/grub
cp /media/grub/grub.cfg       /home/admin/tftp/grub

注:font.p2为grub字体文件,grub.cfg为启动配置文件。

3.3 配置HTTP Server

mkdir -p /home/admin/http/autoinstall
mkdir -p /home/admin/http/iso
touch / home/admin/http/autoinstall/user-data
touch / home/admin/http/autoinstall/meta-data
mv ubuntu-20.04.6-live-server-amd64.iso /home/admin/http/iso/
sudo nohup python -m SimpleHTTPServer 8000  &

注:

  • autoinstall 目录存放参数自动配置文件,user-data、meta-data 是cloud-init 要求的文件名。
  • iso 目录存放操作系统镜像文件。

3.4 配置启动文件

3.4.1 配置grub.cfg

vi /home/admin/tftp/grub/grub.cfg
if loadfont /boot/grub/font.pf2 ; then
	set gfxmode=auto
	insmod efi_gop
	insmod efi_uga
	insmod gfxterm
	terminal_output gfxterm
fi

set menu_color_normal=white/black
set menu_color_highlight=black/light-gray

set timeout=5
menuentry "Install Ubuntu Server" {
	set gfxpayload=keep
	linux  /boot/live-server/vmlinuz root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url='http://10.230.2.200:8000/iso/ubuntu-20.04.6-live-server-amd64.iso' autoinstall ds=nocloud-net\;s=http://10.230.2.200:8000/autoinstall/ ---
	initrd	/boot/live-server/initrd
}
  1. 指定镜像文件相对于tftp根目录的路径 /boot/live-server/initrd。
  2. ip=dhcp指定内核镜像挂载后使用DHCP获取IP地址。
  3. url=指定ISO文件的网络存放路径。
  4. autoinstall ds=nocloud-net\;s=http://10.230.2.200:8000/autoinstall/ — 该配置指明参数自动填写,并指明配置文件所在路径。

3.4.2 配置cloud-init

在准备cloud.init config前。建议先手动安装一次ubuntu 20.04.6,在/var/log/installer/目录下会生成一个autoinstall-user-data,这是基于当前的系统的应答文件,我们可以以它作为基础,根据实际情况进行修改。

vi /home/admin/http/autoinstall/user-data
#cloud-config
autoinstall:
  apt:
    mirror-selection:
      primary:
      - country-mirror
      - arches: &id001
        - amd64
        - i386
        uri: http://archive.ubuntu.com/ubuntu/
      - arches: &id002
        - s390x
        - arm64
        - armhf
        - powerpc
        - ppc64el
        - riscv64
        uri: http://ports.ubuntu.com/ubuntu-ports
    preserve_sources_list: false
    security:
    - arches: *id001
      uri: http://security.ubuntu.com/ubuntu/
    - arches: *id002
      uri: http://ports.ubuntu.com/ubuntu-ports
  identity:
    hostname: ubuntu_server
    password: $6$wbUXmGdjvH5WdLtl$kF0FOfiYaAJgo1uHMH.7pcsR8VEYgeaO6F6ORn2QRVMnnBws18DbBRbDgv6uWrBrO7oGTgI7EWiznJM4osSpy1
    realname: honghao
    username: howie
  kernel:
    package: linux-generic
  keyboard:
    layout: us
    toggle: null
    variant: ''
  locale: en_US.UTF-8
  network:
    ethernets:
      enp3s0:
        dhcp4: true
    version: 2
    wifis: {}
  oem:
    install: auto
  source:
    id: ubuntu-server
    search_drivers: false
  ssh:
    allow-pw: true
    authorized-keys: []
    install-server: true
  storage:
    config:
    - ptable: gpt
      path: /dev/nvme0n1
      wipe: superblock-recursive
      preserve: false
      name: ''
      grub_device: false
      id: disk-nvme0n1
      type: disk
    - device: disk-nvme0n1
      size: 1127219200
      wipe: superblock
      flag: boot
      number: 1
      preserve: false
      grub_device: true
      offset: 1048576
      path: /dev/nvme0n1p1
      id: partition-0
      type: partition
    - fstype: fat32
      volume: partition-0
      preserve: false
      id: format-0
      type: format
    - device: disk-nvme0n1
      size: 2147483648
      wipe: superblock
      number: 2
      preserve: false
      grub_device: false
      offset: 1128267776
      path: /dev/nvme0n1p2
      id: partition-1
      type: partition
    - fstype: ext4
      volume: partition-1
      preserve: false
      id: format-1
      type: format
    - device: disk-nvme0n1
      size: 252783362048
      wipe: superblock
      number: 3
      preserve: false
      grub_device: false
      offset: 3275751424
      path: /dev/nvme0n1p3
      id: partition-2
      type: partition
    - name: ubuntu-vg
      devices:
      - partition-2
      preserve: false
      id: lvm_volgroup-0
      type: lvm_volgroup
    - name: ubuntu-lv
      volgroup: lvm_volgroup-0
      size: 107374182400B
      wipe: superblock
      preserve: false
      path: /dev/ubuntu-vg/ubuntu-lv
      id: lvm_partition-0
      type: lvm_partition
    - fstype: ext4
      volume: lvm_partition-0
      preserve: false
      id: format-2
      type: format
    - path: /
      device: format-2
      id: mount-2
      type: mount
    - path: /boot
      device: format-1
      id: mount-1
      type: mount
    - path: /boot/efi
      device: format-0
      id: mount-0
      type: mount
  updates: security
  version: 1

注:

  1. 密码需要加密,可以先用工具对密码进行加密后填入。
  2. 磁盘分区配置要注意,配置不对会导致自动安装走不下去,提示 crash。
  3. 安装过程日志在 /var/log/installer/。

3.5 安装配置DHCP Server

3.5.1 配置CX-M接口IP

ASW-06# configure terminal
ASW-06(config)# interface ethernet 1
ASW-06(config-if-1)# ip address 10.230.2.200/24

3.5.2 配置DHCP

sudo apt install isc-dhcp-server

sudo vi /etc/default/isc-dhcp-server
INTERFACEsv4=”Ethernet1”
#INTERFACESv6=””

sudo vi /etc/dhcp/dhcpd.conf
subnet 10.230.2.0  netmask 255.255.255.0 {
range 10.230.2.202  10.230.2.210;
option routers 10.230.2.200;
option broadcast-address 10.230.2.255;
default-lease-time 21600;
max-lease-time 43200;
allow leasequery;
next-server 10.230.2.200;
filename "bootx64.efi";
}
sudo systemctl restart isc-dhcp-server

验证

本次验证以DELL笔记本终端作为验证设备。

  • 配置PXE启动

启动logo界面按F12进入启动项,选择Onboard NIC启动。

图4.1:PXE启动

图4.1:PXE启动

  • 显示执行过程

PXE自动化安装过程如下所示:

图4.2:PXE启动-2.

图4.2:PXE启动-2

图4.3:PXE启动-3

图4.3:PXE启动-3

图4.4:PXE启动-4

图4.4:PXE启动-4

最终安装完成后,计算机会自动重启。

对星融元产品感兴趣?

立即联系!

返回顶部

© 星融元数据技术(苏州)有限公司 苏ICP备17070048号-2