1 背景和目的
高性能计算(HPC, High Performance Computing)往往依赖RDMA(Remote Direct Memory Access)网卡和IB(InfiniBand)网络来实现高带宽和低时延的通信。为了惠及大量部署在大型数据中心和云计算环境中的高性能计算业务,RDMA协议被应用到以太网,衍变为RoCE(RDMA over Converged Ethernet),目前比较广泛部署的是RoCEv2协议。大部分高性能计算应用基于MPI(Message Passing Interface)接口开发,而OpenMPI是最流行的实现MPI接口的开源软件库。本文描述如何部署一个基于RoCE网络的OpenMPI环境,方便基于OpenMPI的高性能应用的开发和测试。
2 环境构建详述
本章详细描述基于RoCE的OpenMPI的环境部署步骤及其背后逻辑。
2.1 硬件环境
硬件环境要求如下:
1) 至少两台配备RoCE网卡的服务器,RoCE网卡之间IP网络联通。RDMA原生IB网络是一个无损(lossless)网络,不易丢包,而以太网是一个有损(lossy)网络,易发生丢包重传。RDMA的go-back-N重传机制会导致性能的急剧下降且收敛较慢,所以RoCE网卡和以太网交换机往往配置PFC(Priority Flow Control),DCQCN(Data Center Quantized Congestion Notification)等流量控制机制以达到最佳效果。
2.2 系统环境
系统环境要求如下:
1) 安装Linux发行版,比如ctyunos 2.0.1。
2) 安装RoCE网卡驱动。使用perftest工具比如ib_send_bw测试RoCE网卡驱动是否工作正常。
3) 配置SSH免密。因为mpi控制器需要无密码访问所有的服务器以启动mpi进程,所以每台服务器需要创建密钥对并同步公钥到其他服务器:
# ssh-keygen -t rsa
# ssh-copy-id root@<peer_ip>
4) 配置网络文件系统(NFS, Network File System)。为了达到软件部署一次,到处使用的效果,也为了测试文件IO相关的MPI接口,我们可以部署如下:
每台机器上安装nfs相关软件
# yum install nfs-utils
并创建共享目录
# mkdir /mnt/share
一台机器作为服务器,配置/etc/exports文件内容如下
/mnt/share *(rw,no_root_squash)
启动服务
# systemctl start nfs-server
其余机器作为客户端,挂载目录
# mount –t nfs <server_ip>:/mnt/share /mnt/share
2.3 软件环境
本文采用openmpi-4.1.6版本,为了简单部署,直接对接RDMA驱动,而不必额外部署UCX(Unified Communication X, 。另外,部署IMB(Intel MPI Benchmarks)简单测试MPI接口。软件环境的要求如下:
1) Openmpi-4.1.6的编译依赖automake-1.15。如果没有automake-1.15,从任意一台服务器下载ftp.gnu.org/gnu/automake/automake-1.15.tar.gz到/mnt/share
# tar zxvf automake-1.15.tar.gz
# cd automake-1.15;./configure;make;make install
2) 从任意一台服务器下载
download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.6.tar.gz到/mnt/share:
# tar zxvf openmpi-4.1.6.tar.gz
# cd openmpi-4.1.6;mkdir build; cd build
# ../configure \
--prefix=/mnt/share \
--enable-debug \
--with-verbs=<rdma-core root directory> \
--with-verbs-libdir=<rdma-core library directory> \
--without-ucx
# make -j; make install
3) 任意一台服务器下载
github.com/intel/mpi-benchmarks/archive/refs/tags/IMB-v2021.8.tar.gz到/mnt/share:
# tar zxvf IMB-v2021.8.tar.gz
# cd mpi-benchmarks-IMB-v2021.8
# CC=/mnt/share/bin/mpicc CXX=/mnt/share/bin/mpicxx CXXFLAGS=-fopenmp make
3 简单测试
在任一服务器上执行PingPong测试用例:
/mnt/share/bin/mpirun \
--allow-run-as-root \
--mca btl openib \
--mca btl_openib_receive_queues P,65536,1024,1008,64 \
--host <host1_ip>,<host2_ip>,... \
/mnt/share/mpi-benchmarks-IMB-v2021.8/IMB-P2P PingPong -iter 1000
mpirun会在每台参与的服务器上启动MPI应用。其中MPI参数包括
1) --allow-run-as-root表示允许以root身份运行,默认不允许以root身份运行。
2) --mca btl openib表示OpenMPI库底层传输使用ibv接口,即RDMA网络。
3) --mca btl_openib_receive_queues表示RDMA队列的配置信息。
4) --host表示参与的主机列表。
/mnt/share/mpi-benchmarks-IMB-v2021.8/IMB-P2P表示MPI应用,这里是IMB-P2P测试套件。以下是IMB-P2P的参数:
1) PingPong表示执行套件中的用例PingPong。
2) -iter表示用例通信不同长度的消息的条数。
执行结果示例如下:
#----------------------------------------------------------------
# Benchmarking PingPong
# #processes = 2
#----------------------------------------------------------------
#bytes #repetitions t[usec] Mbytes/sec Msg/sec
0 1000 10.20 0.00 98012
1 1000 10.22 0.10 97847
2 1000 10.21 0.20 97867
4 1000 10.22 0.39 97756
8 1000 10.23 0.78 97725
16 1000 10.24 1.56 97639
32 1000 10.26 3.12 97393
64 1000 10.30 6.21 97017
128 1000 10.45 12.25 95682
256 1000 10.63 24.08 94066
512 1000 10.89 46.98 91748
1024 1000 11.31 90.50 88375
2048 1000 12.24 167.24 81660
4096 1000 14.90 274.79 67088
8192 1000 16.68 490.79 59911
16384 1000 36.35 450.73 27510
32768 1000 41.31 793.08 24203
65536 1000 53.68 1220.75 18627
131072 1000 78.73 1664.82 12702
262144 1000 129.58 2022.95 7717
524288 1000 231.24 2267.28 4324
1048576 800 438.93 2388.92 2278
2097152 400 852.02 2461.27 1174
4194304 200 1677.19 2500.57 596
结果第1列表示消息的长度。
结果第2列表示消息的条数。
结果第3列表示平均每条消息的单程耗时,单位微妙。
结果第4,5列表示测试期间的带宽,分别的单位为每秒多少MB和每秒多少条消息。