---
title: 单平面双网口最佳实践
description: "1. Hyper MPI中HUCX实现了Multi-Rail特性，在数据量达到rndv协议的阈值，即数据传输走rndv协议时，一个传输层可以同时使用多条链路来传输数据。使用RDMA通信时，能够使能多网口。rndv协议的阈值是根据环境自动调整的，也可以通过环境变量UCX_RNDV_THRESH设置使用rndv协议的数据包阈值。默认情况下，使用RDMA通信，最多能够使能两个网口，也可以通过环境变量UCX_MAX_RNDV_RAILS配置可使用的最大网口数。"
url: https://www.hikunpeng.com/document/detail/zh/hpchistory/hpckit/develop2400/userg_huaweimpi_0046.html
sourcePath: /source/zh/hpchistory/hpckit/develop2400/userg_huaweimpi_0046.html
indexId: dcd17b3becf3e2fea4e3fe4939922ad840977014c3aa89805233178b02e9677f66
---
# 单平面双网口最佳实践

1. Hyper MPI中HUCX实现了Multi-Rail特性，在数据量达到rndv协议的阈值，即数据传输走rndv协议时，一个传输层可以同时使用多条链路来传输数据。使用RDMA通信时，能够使能多网口。rndv协议的阈值是根据环境自动调整的，也可以通过环境变量UCX_RNDV_THRESH设置使用rndv协议的数据包阈值。默认情况下，使用RDMA通信，最多能够使能两个网口，也可以通过环境变量UCX_MAX_RNDV_RAILS配置可使用的最大网口数。
  示例如下：

  mpirun -np 16 -x UCX_RNDV_THRESH=32k -x UCX_MAX_RNDV_RAILS=2 osu_bcast

2. Multi-Rail特性会根据网口的带宽和时延（与进程绑核位置、网卡传输时延等条件相关）选择最优的两条链路，传输时按带宽比例计算出每个通道的分包大小，并通过每个端口轮流发。
网口的MTU值在一定程度上会影响网口的带宽，MTU的默认值可以通过ibv_devinfo -d <网口名>|grep active_mtu命令查询，示例如下：
ibv_devinfo -d mlx5_0|grep active_mtu
回显示例如下：

```
active_mtu:		1024 (3)
```

默认值也可以通过UCX_RC_VERBS_PATH_MTU（板载网卡）或UCX_RC_MLX5_PATH_MTU（Mellanox网卡）进行修改。示例如下：
mpirun -np 16 -x UCX_NET_DEVICES=hns_0:1 -x UCX_RC_VERBS_PATH_MTU=1024 osu_bcast
mpirun -np 16 -x UCX_NET_DEVICES=mlx5_1:1 -x UCX_RC_MLX5_PATH_MTU=1024 osu_bcast

  a. 进程排布：建议将不同节点的进程绑定至每个节点的同一个NUMA（如numa0，进程数较少场景）或同一个Socket（如socket0，进程数较多场景）上，方便指定距离进程较近的网卡，以降低跨Die访问网卡的时延。
    假设1个Socket有2个NUMA node，1个NUMA node有32个CPU，示例如下：

    mpirun -np 16 --map-by core -x UCX_NET_DEVICES=hns_0:1 osu_bcast（16个进程绑定在numa0上，并指定numa0上的网卡）

  b. 网卡选择：

    - 如果数据量较小，即默认使用eager协议，单个网口的带宽都无法满载。

      - 网口类型不同，建议指定协议传输时延较低的网口，比如IB和RoCE中选择IB网口。
      - 网口类型相同，考虑NUMA亲和性，建议指定进程所在的IO Die的网口或按照HUCX的默认策略选择单网口通信。
    - 如果数据量较大，即默认使用rndv协议。

      - 单平面有2个网口，默认会使能这两个网口。
      - 单平面有至少3个网口，如果切分的数据包无法将每个网口的带宽打满，建议指定进程所在的CPU Die或者所在Socket的网口；如果切分的数据包较大，首先考虑带宽较大的网口。HUCX会根据带宽和时延默认选择最优的2个网口。
