当前位置: 首页 > article >正文

集群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 是用于并行在多台主机上执行命令的工具,需要提前安装和配置好主机清单。

五.注意事项

  1. 权限管理:上述脚本中涉及到进程管理和网络配置操作,建议以具有足够权限的用户(如root)执行。此外,Docker容器运行时需要 --privileged=true 权限,确保安全性。

  2. 脚本路径:脚本中提到的路径如 /home/start_srv.sh/data/net_scan 等,需要确保在Docker镜像和宿主机中正确映射和存在。

  3. 进程终止stop_srv.sh 使用 kill -9 强制终止相关进程,可能导致数据丢失或其他不可预见的问题。建议在生产环境中谨慎使用,并考虑使用更温和的终止方式。

  4. Docker镜像更新:在更新Docker镜像后,确保新镜像中包含所需的所有依赖和脚本,否则可能导致服务无法正常启动。

  5. 网络配置scan.sh 脚本中使用了固定的IP地址段(如 10.24.64.x),根据实际网络环境进行调整,避免IP冲突。

  6. 日志管理:带宽测试结果输出到 /home/ib_bw_<hostname>.txt-done 文件中,建议定期备份或清理,以防磁盘空间不足。

  7. 工具安装:确保所有节点上已安装 ib_send_bwibdev2netdevpdsh 等工具,否则脚本将无法正常运行。

  8. 错误处理:当前脚本对错误的处理较为简单,如 scan.sh 中对 ib_send_bw 超时仅进行简单处理,建议根据实际需求增加更完善的错误处理机制。

通过以上步骤和注意事项,可以在集群环境中实现高效的IB网络带宽监控,帮助运维人员及时发现并解决网络瓶颈,提高整体集群性能。


http://www.kler.cn/a/519278.html

相关文章:

  • 为什么IDEA提示不推荐@Autowired❓️如果使用@Resource呢❓️
  • 第13章 深入volatile关键字(Java高并发编程详解:多线程与系统设计)
  • 计算机的错误计算(二百二十二)
  • Kubectl 与 Helm 详解
  • 开始步入达梦中级dba
  • 【python】四帧差法实现运动目标检测
  • 使用 Docker 运行 Oracle Database 23ai Free 容器镜像并配置密码与数据持久化
  • 【架构面试】二、消息队列和MySQL和Redis
  • 批量提取多个 Excel 文件内指定单元格的数据
  • linux如何定位外部攻击并进行防御处理
  • Visual Studio Code修改terminal字体
  • 【pytorch】norm的使用
  • 9【如何面对他人学习和生活中的刁难】
  • 破解浏览器渲染“死锁”:CSS与JS如何影响页面加载速度?
  • GCC之编译(8)AR打包命令
  • 【初阶数据结构】逆流的回环链桥:双链表
  • 【单链表算法实战】解锁数据结构核心谜题——相交链表
  • 解决使用Selenium时ChromeDriver版本不匹配问题
  • [b01lers2020]Life on Mars1
  • 计算机视觉:撕裂时空的视觉算法革命狂潮
  • 落地级分类模型训练框架搭建(1):resnet18/50和mobilenetv2在CIFAR10上测试结果
  • 高级java每日一道面试题-2025年01月24日-框架篇[SpringBoot篇]-如何理解 Spring Boot 中的 Starters(启动器) ?
  • three.js+WebGL踩坑经验合集(4.1):THREE.Line2的射线检测问题(注意本篇说的是Line2,同样也不是阈值方面的问题)
  • 多模态论文笔记——ViViT
  • OpenAI-Edge-TTS的使用
  • 深入解析Gradle项目发布配置:从构建到仓库部署