11#! /usr/bin/env bash
2- # ib.sh - launch a perftest benchmark between two hosts via mpirun .
2+ # ib.sh - launch a perftest benchmark between two hosts via Slurm (srun) .
33#
44# Usage:
55# ./ib.sh <host1> <host2> [perftest_binary]
66# host1 -> rank 0 -> perftest server
77# host2 -> rank 1 -> perftest client (connects to host1)
88# perftest_binary defaults to ib_write_bw
9+ # host1/host2 must be Slurm NodeNames (e.g. `sinfo -N -h -o %N`)
910#
1011# Env overrides:
1112# IB_DEV RDMA device (default: mlx5_1)
1415# IB_DURATION perftest -D seconds (default: 30)
1516# IB_QPS perftest -q queue pairs (default: 1)
1617# IB_EXTRA extra args appended verbatim (default: empty)
17- # MPI_EXTRA extra args passed to mpirun (default: empty)
18- #
19- # Examples:
20- # ./ib.sh amd0 amd1
21- # ./ib.sh amd0 amd1 ib_read_bw
22- # IB_DURATION=30 IB_QPS=4 ./ib.sh amd0 amd1 ib_write_bw
23- # IB_DEV=mlx5_0 IB_NETDEV=enp49s0f0np0 ./ib.sh amd0 amd1
18+ # SRUN_EXTRA extra args passed to srun (default: empty)
2419
2520set -euo pipefail
2621
@@ -29,28 +24,10 @@ IB_NETDEV=${IB_NETDEV:-enp49s0f1np1}
2924IB_DURATION=${IB_DURATION:- 30}
3025IB_QPS=${IB_QPS:- 1}
3126IB_EXTRA=${IB_EXTRA:- }
32- MPI_EXTRA=${MPI_EXTRA:- }
33-
34- # Worker mode: mpirun re-invokes this script on each host with a rank set.
35- rank=${OMPI_COMM_WORLD_RANK:- ${PMI_RANK:- ${PMIX_RANK:- } } }
36- if [[ -n " ${rank} " ]]; then
37- test_bin=$1
38- peer_ip=$2
39- common=(-d " $IB_DEV " -F -D " $IB_DURATION " -q " $IB_QPS " $IB_EXTRA )
40- if [[ " $rank " == " 0" ]]; then
41- echo " [$( hostname) ] rank 0: $test_bin ${common[*]} (server)"
42- exec " $test_bin " " ${common[@]} "
43- else
44- # Tiny delay so the server's TCP listener is up before we dial.
45- sleep 1
46- echo " [$( hostname) ] rank 1: $test_bin ${common[*]} $peer_ip (client)"
47- exec " $test_bin " " ${common[@]} " " $peer_ip "
48- fi
49- fi
27+ SRUN_EXTRA=${SRUN_EXTRA:- }
5028
51- # Launcher mode
5229if [[ $# -lt 2 ]]; then
53- sed -n ' 2,25p ' " $0 "
30+ sed -n ' 2,19p ' " $0 "
5431 exit 2
5532fi
5633
@@ -59,26 +36,49 @@ host2=$2
5936test_bin=${3:- ib_write_bw}
6037
6138# Resolve host1's IP on the RDMA-adjacent netdev so host2 can connect to it.
62- peer_ip=$( ssh -o BatchMode=yes " $host1 " \
63- " ip -br -4 addr show $IB_NETDEV 2>/dev/null | awk '{print \$ 3}' | cut -d/ -f1" )
39+ peer_ip=$( srun --nodelist=" $host1 " --nodes=1 --ntasks=1 \
40+ bash -c " ip -br -4 addr show $IB_NETDEV 2>/dev/null | awk '{print \$ 3}' | cut -d/ -f1" \
41+ 2> /dev/null | tr -d ' [:space:]' )
6442if [[ -z " $peer_ip " ]]; then
6543 echo " ERROR: could not resolve IPv4 on $IB_NETDEV at $host1 " >&2
6644 echo " set IB_NETDEV to a netdev that has an IP on both hosts." >&2
6745 exit 1
6846fi
6947
70- script=$( readlink -f " $0 " )
71- echo " === ib.sh ==="
48+ echo " === ib.sh (slurm) ==="
7249echo " test : $test_bin "
7350echo " hosts : $host1 (server) -> $host2 (client)"
7451echo " device : $IB_DEV via netdev $IB_NETDEV "
7552echo " peer ip : $peer_ip "
7653echo " duration : ${IB_DURATION} s qps=${IB_QPS} "
77- [[ -n " $IB_EXTRA " ]] && echo " extra : $IB_EXTRA "
78- [[ -n " $MPI_EXTRA " ]] && echo " mpi extra: $MPI_EXTRA "
54+ [[ -n " $IB_EXTRA " ]] && echo " extra : $IB_EXTRA "
55+ [[ -n " $SRUN_EXTRA " ]] && echo " srun extra: $SRUN_EXTRA "
7956echo
8057
81- exec mpirun --host " $host1 ,$host2 " -np 2 \
82- --tag-output \
83- $MPI_EXTRA \
84- " $script " " $test_bin " " $peer_ip "
58+ # Pin rank 0 -> host1, rank 1 -> host2 via SLURM_HOSTFILE + arbitrary distribution.
59+ hostfile=$( mktemp)
60+ trap ' rm -f "$hostfile"' EXIT
61+ printf ' %s\n%s\n' " $host1 " " $host2 " > " $hostfile "
62+ export SLURM_HOSTFILE=" $hostfile "
63+
64+ export PERF_BIN=" $test_bin "
65+ export PEER_IP=" $peer_ip "
66+ export IB_DEV IB_DURATION IB_QPS IB_EXTRA
67+
68+ exec srun \
69+ --ntasks=2 \
70+ --distribution=arbitrary \
71+ --label \
72+ $SRUN_EXTRA \
73+ bash -c '
74+ common=(-d "$IB_DEV" -F -D "$IB_DURATION" -q "$IB_QPS" $IB_EXTRA)
75+ if [[ "$SLURM_PROCID" == "0" ]]; then
76+ echo "[$(hostname)] rank 0 server: $PERF_BIN ${common[*]}"
77+ exec "$PERF_BIN" "${common[@]}"
78+ else
79+ # Tiny delay so the server' \' ' s listener is up before we dial.
80+ sleep 1
81+ echo "[$(hostname)] rank 1 client: $PERF_BIN ${common[*]} $PEER_IP"
82+ exec "$PERF_BIN" "${common[@]}" "$PEER_IP"
83+ fi
84+ '
0 commit comments