在 NVIDIA DGX Spark 平台上对 NVIDIA ConnectX-7 200G 网卡进行配置时,会遇到“4 个逻辑端口”现象。理解背后的真相是后续所有配置的基础。本文将从此现象入手,逐步解析其原理,并提供从基础配置到深度性能验证的完整流程。
1理解“4 个逻辑端口”的真相
目前,在 DGX Spark 系统上配置 ConnectX-7(CX7)网卡时,会遇到一个常见问题:DGX Spark 只有两个物理端口,但在使用 ip-br a 或 ibdev2netdev 命令查看时, ConnectX-7 网卡显示为四个端口:
rocep1s0f0 port 1 ==> enp1s0f0np0 (Up) 物理端口1/路径A rocep1s0f1 port 1 ==> enp1s0f1np1 (Up) 物理端口2/路径A roceP2p1s0f0 port 1 ==> enP2p1s0f0np0 (Up) 物理端口1/路径B roceP2p1s0f1 port 1 ==> enP2p1s0f1np1 (Up) 物理端口2/路径B
答案在于 GB10 芯片的 PCIe 限制与 Socket Direct 模式。
简单理解为:其无法为单个设备提供超过 x4 宽度的 PCIe 通道。因此为了实现 200 Gbps 的传输速率,将启用 ConnectX-7 的 socket 直通,把两条独立的 x4 PCIe 链路聚合起来,从而共同达到 200 Gbps 的带宽。
而 ConnectX-7 网卡在 Socket Direct 模式下,分别由 GB10 SoC 的两条独立 PCle x4 链路(我们称之为路径 A 和路径 B)驱动,所以会把每一个物理接口识别成两个 PCle 设备,进而对应两个逻辑接口。经由每个 PCle x4 的连接,只有 100 Gbps,无法满足 200 Gbps 的传输需求,所以对应下图中,在配置网络和构建流量时,要实现完整的 200 Gbps 带宽必须同时使用这两条链路(路径 A 和路径 B)——即使只用一个物理接口,也需确保两路流量都被激活。

▲ 逻辑端口示意图
2025 丽台(上海)信息科技有限公司
本图片由丽台科技制作,如果您有任何疑问或需要使用此图片,请联系丽台科技(下同)
具体表现为:
路径 A -> 访问物理端口 1 (enp1s0f0np0)
路径 A -> 访问物理端口 2 (enp1s0f1np1)
路径 B -> 访问物理端口 1 (enP2p1s0f0np0)
路径 B -> 访问物理端口 2 (enP2p1s0f1np1)
这不是四个独立的物理网口,而是两个物理网口在操作系统层面被“镜像”为四条 PCIe 路径。为了充分利用硬件性能,必须正确配置并测试这四条路径。
2网络配置:连接两台 DGX Spark
下面将重点介绍连接两台 DGX Spark 时的手动静态 IP 分配。
2.1 确保两个系统上的用户名相同
此步骤旨在确保两台 DGX Spark 设备使用相同的用户名,以便后续操作(尤其是 SSH 免密登录和分布式任务调度)能够无缝进行。
注:用户可根据实际情况自行配置,无需严格遵循以下步骤。
2.1.1 检查当前用户名
在两台机器上分别运行:
whoami
如果两台都已经是 leadtek_dgx1,则无需操作,直接继续后续步骤。
如果任一系统用户名不同,请按以下步骤创建统一用户。
2.1.2 在两台系统上创建 leadtek_dgx1 用户(如不存在)
# 创建用户并设置主目录 sudo useradd -m leadtek_dgx1 # 将用户加入 sudo 组 sudo usermod -aG sudo leadtek_dgx1 # 设置密码 sudo passwd leadtek_dgx1 #切换到该用户 su - leadtek_dgx1
完成后,两台系统均以相同用户名 leadtek_dgx1 登录,便于后续 SSH 免密操作。
2.2 确认接口状态
确定所有网络端口均已连接(Up 状态):
leadtek_dgx1@spark-a83f:~$ ibdev2netdev rocep1s0f0 port 1 ==> enp1s0f0np0 (Up) rocep1s0f1 port 1 ==> enp1s0f1np1 (Up) roceP2p1s0f0 port 1 ==> enP2p1s0f0np0 (Up) roceP2p1s0f1 port 1 ==> enP2p1s0f1np1 (Up)
2.3 IP 地址规划
我们为 node1 和 node2 上的四个逻辑接口分别规划独立的子网,用于后续网络性能测试。

▲ IP 地址规划
2.4 执行配置命令
在 node1 上执行:
# 物理端口1 / 路径A (192.168.10.0/24)/enp1s0f0np0 sudo ip addr add 192.168.10.10/24 dev enp1s0f0np0 sudo ip link set enp1s0f0np0 up # 物理端口2 / 路径A (192.168.11.0/24)/enp1s0f1np1 sudo ip addr add 192.168.11.10/24 dev enp1s0f1np1 sudo ip link set enp1s0f1np1 up # 物理端口1 / 路径B (192.168.12.0/24)/enP2p1s0f0np0 sudo ip addr add 192.168.12.10/24 dev enP2p1s0f0np0 sudo ip link set enP2p1s0f0np0 up # 物理端口2 / 路径B (192.168.13.0/24)/enP2p1s0f1np1 sudo ip addr add 192.168.13.10/24 dev enP2p1s0f1np1 sudo ip link set enP2p1s0f1np1 up #ip -br a enp1s0f0np0 UP 192.168.10.10/24 enp1s0f1np1 UP 192.168.11.10/24 enP2p1s0f0np0 UP 192.168.12.10/24 enP2p1s0f1np1 UP 192.168.13.10/24
在 node2 上执行:
# 物理端口1 / 路径A (192.168.10.0/24)/enp1s0f0np0 sudo ip addr add 192.168.10.11/24 dev enp1s0f0np0 sudo ip link set enp1s0f0np0 up # 物理端口1 / 路径A (192.168.11.0/24)/enp1s0f1np1 sudo ip addr add 192.168.11.11/24 dev enp1s0f1np1 sudo ip link set enp1s0f1np1 up # 物理端口2 / 路径B (192.168.12.0/24)/enP2p1s0f0np0 sudo ip addr add 192.168.12.11/24 dev enP2p1s0f0np0 sudo ip link set enP2p1s0f0np0 up # 物理端口2 / 路径B (192.168.13.0/24)/enP2p1s0f1np1 sudo ip addr add 192.168.13.11/24 dev enP2p1s0f1np1 sudo ip link set enP2p1s0f1np1 up #ip -br a enp1s0f0np0 UP 192.168.10.11/24 enp1s0f1np1 UP 192.168.11.11/24 enP2p1s0f0np0 UP 192.168.12.11/24 enP2p1s0f1np1 UP 192.168.13.11/24
2.5 设置无密码 SSH 身份验证
需要找到已启动的 ConnectX-7 接口的 IP 地址。在两个节点上,分别运行 ip addr show enp1s0f0np0:
#ip addr show enp1s0f0np0 3: enp1s0f0np0:mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 4c47:7d40 brd ffffff:ff inet 192.168.10.10/24 scope global enp1s0f0np0 valid_lft forever preferred_lft forever #ip addr show enp1s0f0np0 3: enp1s0f0np0: mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 4c47:7d8f brd ffffff:ff inet 192.168.10.11/24 scope global enp1s0f0np0 valid_lft forever preferred_lft forever
确定 node1 和 node2 IP:
node1: 192.168.10.10 node2: 192.168.10.11
在两个节点上分别运行以下命令以启用无密码 SSH:
ssh-copy-id -i ~/.ssh/id_rsa.pub leadtek_dgx1@192.168.10.10 ssh-copy-id -i ~/.ssh/id_rsa.pub leadtek_dgx1@192.168.10.11 ssh 192.168.10.10 hostname ssh 192.168.10.11 hostname
3RDMA 带宽性能测试
配置完成后,我们使用 ib_write_bw 工具(来自 perftest-tools 包)来验证聚合带宽是否能达到 200 Gbps 的物理极限。
3.1 测试一:单物理端口聚合带宽(物理端口 1)
此测试的目标是验证单个物理端口(使用其对应的两条 PCIe 路径)是否能跑满 200 Gbps。
测试步骤:我们需要在两个节点上同时启动两个 ib_write_bw 实例,一个跑在物理端口 1/ 路径 A (192.168.10.x),一个跑在物理端口 1/ 路径 B(192.168.12.x)。
3.1.1 启动物理端口 1/ 路径 A (192.168.10.x)测试
在 node2 (服务端))终端 1 中运行:
ib_write_bw -d rocep1s0f0 -p 18511 --bind_source_ip=192.168.10.11 --report_gbits --run_infinitely -D 5
在 node1 (客户端) 终端 1 中运行:
ib_write_bw -d rocep1s0f0 -p 18511 --report_gbits --run_infinitely -D 5 192.168.10.11
观察到带宽结果:约 97 Gbit/s。

▲ 测试结果截图
2025 丽台(上海)信息科技有限公司
本文所有测试结果均由丽台科技实测得出,如果您有任何疑问或需要使用此测试结果,请联系丽台科技(下同)
3.1.2 保持物理端口 1/ 路径 A 通信,启动物理端口 1/ 路径 B (192.168.12.x)测试
在 node2 (服务端) 终端 2 中运行:
ib_write_bw -d roceP2p1s0f0 -p 18512 --bind_source_ip=192.168.12.11 --report_gbits --run_infinitely -D 5
在 node1 (客户端) 终端 2 中运行:
ib_write_bw -d roceP2p1s0f0 -p 18512 --report_gbits --run_infinitely -D 5 192.168.12.11
观察到带宽结果:约 92 Gbit/s。

▲ 测试结果截图
测试结果(物理端口 1):

▲ 测试结果截图
总带宽 = 路径 A 平均带宽 + 路径 B 平均带宽
总带宽 ≈ 92.5 + 92.5 = 185 Gbit/s
结论:测试结果验证了单个物理端口可以通过聚合其背后的两条 PCIe 路径,提供接近 200 Gbit/s 的理论带宽。
3.2 测试二:双物理端口带宽
此测试的目标是验证当两个物理端口(即所有四条 PCIe 路径)同时工作时,网卡的总吞吐能力。
测试步骤:保持 3.1 中的两个测试(物理端口 1 的 A、B 两条路径)持续运行,在两个节点上额外再启动两个 ib_write_bw 实例,分别对应物理端口 2 的两条路径。
3.2.1 启动物理端口 2/ 路径 A(192.168.11.x)
在 node2(服务端)终端 3 中运行:
ib_write_bw -d rocep1s0f1 -p 18513 --bind_source_ip=192.168.11.11 --report_gbits --run_infinitely -D 5
在 node1(客户端)终端 3 中运行:
ib_write_bw -d rocep1s0f1 -p 18513 --report_gbits --run_infinitely -D 5 192.168.11.11
3.2.2 启动物理端口 2/ 路径 B(192.168.13.x)
在 node2(服务端)终端 4 中运行:
ib_write_bw -d roceP2p1s0f1 -p 18514 --bind_source_ip=192.168.13.11 --report_gbits --run_infinitely -D 5
在 node1(客户端)终端 4 中运行:
ib_write_bw -d roceP2p1s0f1 -p 18514 --report_gbits --run_infinitely -D 5 192.168.13.11

▲ 测试结果截图
测试结果:当所有四条链路并发运行时,观察到每条链路的带宽被平均分配。
每条路径带宽 ≈ 49 Gbit/s
总带宽 = ~49 + ~49 + ~49 + ~49 = 196 Gbit/s
结论:表明 ConnectX-7 网卡的总带宽约为 196 Gbit/s(接近 200G 目标)。无论流量是集中在单个物理端口(如测试 3.1),还是分散到两个物理端口(如测试 3.2),总吞吐量保持一致。
4NCCL 通信性能测试
在深度学习场景中,NCCL 是多机通信的关键。我们按照官方文档编译 nccl-tests 并进行 all_gather 和 all_reduce 测试。
4.1 安装依赖项并构建 NCCL
#安装依赖项并构建NCCL sudo apt-get update && sudo apt-get install -y libopenmpi-dev git clone -b v2.28.3-1 https://github.com/NVIDIA/nccl.git ~/nccl/ cd ~/nccl/ make -j src.build NVCC_GENCODE="-gencode=arch=compute_121,code=sm_121" #设置环境变量 export CUDA_HOME="/usr/local/cuda" export MPI_HOME="/usr/lib/aarch64-linux-gnu/openmpi" export NCCL_HOME="$HOME/nccl/build/" export LD_LIBRARY_PATH="$NCCL_HOME/lib:$CUDA_HOME/lib64/:$MPI_HOME/lib:$LD_LIBRARY_PATH"
4.2 构建 NCCL 测试套件
git clone https://github.com/NVIDIA/nccl-tests.git ~/nccl-tests/ cd ~/nccl-tests/ make MPI=1
4.3 All-Gather 带宽测试(单路径)
注意:此步骤仅选择物理端口 1 的一条路径(路径Aenp1s0f0np0)作为通信接口,以建立一个单路径基准。
# 仅指定物理端口1/路径A enp1s0f0np0 作为通信接口 export UCX_NET_DEVICES=enp1s0f0np0 export NCCL_SOCKET_IFNAME=enp1s0f0np0 export OMPI_MCA_btl_tcp_if_include=enp1s0f0np0 #指定物理端口1/路径A的设备标识 export NCCL_IB_HCA=rocep1s0f0
运行 all_gather 测试(单路径):
mpirun -np 2 -H 192.168.10.10:1,192.168.10.11:1 --mca plm_rsh_agent "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" -x LD_LIBRARY_PATH -x NCCL_IB_HCA $HOME/nccl-tests/build/all_gather_perf -b 16G -e 16G -f 2
-x NCCL_DEBUG=INFO 可以加上此命令以查看详细日志。
测试结果:单路径下,All-Gather 操作的平均总线带宽达到 12.04 GB/s。

▲ 测试结果截图
4.4 All-Gather 带宽测试(双路径)
注意: 此步骤选择物理端口 1 的两条路径作为通信接口,以建立双链路。
#指定物理端口1/路径A和路径B enp1s0f0np0,enP2p1s0f0np0 作为通信接口 export UCX_NET_DEVICES=enp1s0f0np0,enP2p1s0f0np0 export NCCL_SOCKET_IFNAME=enp1s0f0np0,enP2p1s0f0np0 export OMPI_MCA_btl_tcp_if_include=enp1s0f0np0,enP2p1s0f0np0 #指定两个路径的设备标识 export NCCL_IB_HCA=rocep1s0f0,roceP2p1s0f0 mpirun -np 2 -H 192.168.10.10:1,192.168.10.11:1 --mca plm_rsh_agent "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" -x LD_LIBRARY_PATH -x NCCL_IB_HCA $HOME/nccl-tests/build/all_gather_perf -b 16G -e 16G -f 2
测试结果:双路径下,All-Gather 操作的平均总线带宽达到 22.68 GB/s。

▲ 测试结果截图
4.5 All-reduce 带宽测试(单路径)
注意:切换终端时,请勿忘记重新导入 4.1 节中设置的环境变量。
# 仅指定物理端口1/路径A enp1s0f0np0 作为通信接口 export UCX_NET_DEVICES=enp1s0f0np0 export NCCL_SOCKET_IFNAME=enp1s0f0np0 export OMPI_MCA_btl_tcp_if_include=enp1s0f0np0 #指定物理端口1/路径A的设备标识 export NCCL_IB_HCA=rocep1s0f0 mpirun -np 2 -host 192.168.10.10:1,192.168.10.11:1 -x LD_LIBRARY_PATH -x NCCL_IB_HCA $HOME/nccl-tests/build/all_reduce_perf -b 1M -e 512M -f 2 -g 1
测试结果:在单路径 All-Reduce 测试中,512MB 大消息量下达到的 12.08 GB/s 总线带宽。

▲ 测试结果截图
4.6 All-reduce 带宽测试(双路径)
# 指定物理端口1/路径A和路径B enp1s0f0np0,enP2p1s0f0np0 作为通信接口 export UCX_NET_DEVICES=enp1s0f0np0,enP2p1s0f0np0 export NCCL_SOCKET_IFNAME=enp1s0f0np0,enP2p1s0f0np0 export OMPI_MCA_btl_tcp_if_include=enp1s0f0np0,enP2p1s0f0np0 #指定两个路径的设备标识 export NCCL_IB_HCA=rocep1s0f0,roceP2p1s0f0 mpirun -np 2 -host 192.168.10.10:1,192.168.10.11:1 -x LD_LIBRARY_PATH -x NCCL_IB_HCA $HOME/nccl-tests/build/all_reduce_perf -b 1M -e 512M -f 2 -g 1
测试结果:在双路径 All-Reduce 测试中,512MB 大消息量下达到的 18.02 GB/s 总线带宽。

▲ 测试结果截图
5测试总结与分析
根据以上测试,可以得出以下关键结论:
配置确认: DGX Spark 上的 ConnectX-7 网卡确实因 socket 直通呈现为 4 个逻辑接口。
硬件能力验证(ib_write_bw):原始带宽测试(ib_write_bw)结果(185-196 Gbit/s)表明,无论是通过单物理端口还是双物理端口,该网卡均能提供接近 200 Gbps 的聚合吞吐能力,符合硬件设计预期。
NCCL 性能分析:在单物理端口(双路径)上运行时,All-Gather 操作针对超大消息量实现了 22.68 GB/s 的平均总线带宽,展现了其在高并行通信场景下出色的数据聚合与分发吞吐能力。All-Reduce 测试中,512MB 大消息量下达到的 18.02 GB/s 总线带宽,是当前系统通信性能的真实峰值,反映了 NCCL 算法与硬件互联在高负载下的真实吞吐能力。
更多关于 DGX Spark 的使用指南、测试报告等,将在丽台科技公众号持续发布,敬请保持关注!
全部0条评论
快来发表一下你的评论吧 !