集群IB网络扫描
集群IB网络扫描
- 一.背景介绍
- 二.方案介绍
- 三.参考链接
- 四.操作步骤
- 1. 准备host.txt文件(示例)
- 2. 编写服务启动脚本
- 3. 编写服务停止脚本
- 4. 编写服务启动管理脚本
- 5. 编写初始化脚本
- 6. 编写扫描脚本
- 7. 编写执行扫描步骤脚本
- 8. 部署Docker容器
- 五.注意事项
一.背景介绍
在高性能计算(HPC)集群中,InfiniBand(简称IB)网络因其高带宽和低延迟的特性,成为节点间通信的首选。然而,随着集群规模的扩大,监控和优化IB网络的性能变得尤为重要。本文将介绍如何通过编写和部署一系列脚本,结合Docker容器,实现对集群IB网络的自动化扫描与带宽测试。
二.方案介绍
- 将需要测试的主机信息放在host.txt文件中
- 所有的主机挂载相同的存储,目录一致
- 采用pdsh批量部署
- 采用docker服务的方式在每个节点上部署IB接收端;每张网卡一个ib_send_bw进程,监听的端口不一样;pdsh并发数为1
- pdsh并发数为1,依次启动每个节点上的扫描程序,分别测试每张IB网卡和host.txt中所有节点之间的带宽,保存到文件,测试结束后,重命名文件,加上done标识
三.参考链接
- 集群内SSH免密登录及批处理
四.操作步骤
1. 准备host.txt文件(示例)
echo "10.24.64.101" > /home/host.txt
echo "10.24.64.102" >> /home/host.txt
2. 编写服务启动脚本
首先,创建一个名为 start_ib_srv.sh
的脚本,用于持续运行 ib_send_bw
命令,测试指定设备和端口的带宽。
因为第次客户测试后ib_send_bw
都会退出,所以放在循环里
cat > /home/start_ib_srv.sh <<-'EOF'
#!/bin/bash
dev=$1
port=$2
while [ 1 ];
do
ib_send_bw -d $dev -p $port > /dev/null 2>&1
done
EOF
3. 编写服务停止脚本
接下来,创建 stop_srv.sh
脚本,用于终止所有与IB相关的进程。
cat > /home/stop_srv.sh <<-'EOF'
#!/bin/bash
processes=$(ps aux | grep "ib" | grep -v grep | awk '{print $2}')
if [ -z "$processes" ]; then
exit 0
fi
for pid in $processes; do
kill -9 "$pid"
done
EOF
4. 编写服务启动管理脚本
创建 start_srv.sh
脚本,负责先停止现有服务,然后启动新的IB服务实例。
系里有4张网卡,可以通过ibv_devices
获取,每张网卡设置一个不同的监听端口,需与下面的扫描程序保持一致
cat > /home/start_srv.sh <<-'EOF'
bash /home/stop_srv.sh
sleep 1
setsid bash /home/start_ib_srv.sh mlx5_0 18515 &
setsid bash /home/start_ib_srv.sh mlx5_1 18516 &
setsid bash /home/start_ib_srv.sh mlx5_2 18517 &
setsid bash /home/start_ib_srv.sh mlx5_3 18518 &
EOF
5. 编写初始化脚本
step0.sh
脚本用于启动服务并保持脚本运行状态。
这个阶段,是以docker后台服务的方式启动,不能退出,不然别的节点不能通信
cat > step0.sh <<-'EOF'
#!/bin/bash
bash /home/start_srv.sh
while [ 1 ];
do
sleep 30
done
EOF
6. 编写扫描脚本
scan.sh
脚本负责读取主机文件,执行带宽测试,并将结果输出到指定文件中。
要求IP的编址方式一致,只是网段不一样;每个IB网张仅与其它节点对应网卡通信
通过ibdev2netdev
获取到网卡名,再用ifconfig
获取IP地址,目标IP的规则是约定好的
ib_send_bw
没有超时,因此采用timeout
程序做超时
测试完毕后,重命名文件,加上done标识,方便统计所有的扫描是否都已完成
cat > /home/scan.sh <<-'EOF'
#!/bin/bash
HOST_FILE="/home/host.txt"
OUT_FILE=/home/ib_bw_`hostname`".txt"
rm -f $OUT_FILE
while read -r ip; do
node=`echo $ip | awk -F. '{print $4}'`
#echo $ip,$node
name0=`ibdev2netdev | grep "mlx5_0" | awk '{print $6}'`
ip0=`ifconfig $name0 | grep -w "inet" | awk '{print $2}'`
bw=`timeout 3 ib_send_bw -d mlx5_0 10.24.64.$node -p 18515 2>&1 | tail -n 2 | tail -n 2 | head -n 1 | awk '{print $3}' | sed 's/[[:space:]]//g' | sed 's/to/0/g'`
msg="$ip0,10.24.64.$node,$bw"
echo $msg >> $OUT_FILE
name0=`ibdev2netdev | grep "mlx5_1" | awk '{print $6}'`
ip0=`ifconfig $name0 | grep -w "inet" | awk '{print $2}'`
bw=`timeout 3 ib_send_bw -d mlx5_1 10.24.65.$node -p 18516 2>&1 | tail -n 2 | tail -n 2 | head -n 1 | awk '{print $3}' | sed 's/[[:space:]]//g' | sed 's/to/0/g'`
msg="$ip0,10.24.65.$node,$bw"
echo $msg >> $OUT_FILE
name0=`ibdev2netdev | grep "mlx5_2" | awk '{print $6}'`
ip0=`ifconfig $name0 | grep -w "inet" | awk '{print $2}'`
bw=`timeout 3 ib_send_bw -d mlx5_2 10.24.66.$node -p 18517 2>&1 | tail -n 2 | tail -n 2 | head -n 1 | awk '{print $3}' | sed 's/[[:space:]]//g' | sed 's/to/0/g'`
msg="$ip0,10.24.66.$node,$bw"
echo $msg >> $OUT_FILE
name0=`ibdev2netdev | grep "mlx5_3" | awk '{print $6}'`
ip0=`ifconfig $name0 | grep -w "inet" | awk '{print $2}'`
bw=`timeout 3 ib_send_bw -d mlx5_3 10.24.67.$node -p 18518 2>&1 | tail -n 2 | tail -n 2 | head -n 1 | awk '{print $3}' | sed 's/[[:space:]]//g' | sed 's/to/0/g'`
msg="$ip0,10.24.67.$node,$bw"
echo $msg >> $OUT_FILE
done < "$HOST_FILE"
mv $OUT_FILE $OUT_FILE-done
EOF
7. 编写执行扫描步骤脚本
创建 step1.sh
脚本,用于执行扫描操作。
cat > step1.sh <<-'EOF'
#!/bin/bash
bash /home/scan.sh
EOF
8. 部署Docker容器
使用 pdsh
工具在所有节点上停止并移除现有的 net_scan
容器,拉取最新的Docker镜像,并运行新的容器。
pdsh -a "docker stop net_scan"
pdsh -a "docker rm net_scan"
pdsh -a "docker pull <docker image>"
pdsh -f 1 -a "docker run -d --name net_scan --net=host --privileged=true -v /data/net_scan:/home -w /home <docker image> /home/step0.sh"
pdsh -f 1 -a "docker run -i --rm --net=host --privileged=true -v /data/net_scan:/home -w /home <docker image> /home/step1.sh"
说明:
<docker image>
请替换为实际的Docker镜像名称。pdsh
是用于并行在多台主机上执行命令的工具,需要提前安装和配置好主机清单。
五.注意事项
-
权限管理:上述脚本中涉及到进程管理和网络配置操作,建议以具有足够权限的用户(如root)执行。此外,Docker容器运行时需要
--privileged=true
权限,确保安全性。 -
脚本路径:脚本中提到的路径如
/home/start_srv.sh
和/data/net_scan
等,需要确保在Docker镜像和宿主机中正确映射和存在。 -
进程终止:
stop_srv.sh
使用kill -9
强制终止相关进程,可能导致数据丢失或其他不可预见的问题。建议在生产环境中谨慎使用,并考虑使用更温和的终止方式。 -
Docker镜像更新:在更新Docker镜像后,确保新镜像中包含所需的所有依赖和脚本,否则可能导致服务无法正常启动。
-
网络配置:
scan.sh
脚本中使用了固定的IP地址段(如10.24.64.x
),根据实际网络环境进行调整,避免IP冲突。 -
日志管理:带宽测试结果输出到
/home/ib_bw_<hostname>.txt-done
文件中,建议定期备份或清理,以防磁盘空间不足。 -
工具安装:确保所有节点上已安装
ib_send_bw
、ibdev2netdev
、pdsh
等工具,否则脚本将无法正常运行。 -
错误处理:当前脚本对错误的处理较为简单,如
scan.sh
中对ib_send_bw
超时仅进行简单处理,建议根据实际需求增加更完善的错误处理机制。
通过以上步骤和注意事项,可以在集群环境中实现高效的IB网络带宽监控,帮助运维人员及时发现并解决网络瓶颈,提高整体集群性能。