InfiniBand 网络带宽监控脚本使用说明
InfiniBand 网络带宽监控脚本使用说明
原文:https://github.com/ForceInjection/AI-fundermentals/blob/main/ops/IB/ib_bandwidth_monitor_usage.md
脚本:https://github.com/ForceInjection/AI-fundermentals/blob/main/ops/IB/ib_bandwidth_monitor.sh
相关文章:
1. 概述与功能特性
ib_bandwidth_monitor.sh 是一个专门用于监控和计算 InfiniBand 网络实际传输速率的脚本。它通过读取 InfiniBand 设备的性能计数器,实时计算网络的发送和接收速率,并以 SAR 风格格式输出。
1.1 核心功能
• 实时速率监控: 计算实际的发送/接收速率 (MB/s) • 链路利用率: 显示当前速率相对于链路最大速率的利用率 • 性能计数器: 监控数据包统计和传输速率 • SAR 风格输出: 固定使用 SAR 格式输出,便于系统监控集成 • 多端口支持: 同时监控多个端口或端口范围 • 多设备支持: 支持同时监控多个设备的多个端口 • 端口发现: 自动列出所有可监控的 InfiniBand 端口 • 自动设备检测: 自动发现可用的 InfiniBand 设备 • 时间控制监控: 支持指定监控时长或无限监控模式 • 智能错误处理: 多种 perfquery 调用方式,提高兼容性 • 彩色日志输出: 支持彩色日志和静默模式
1.2 监控指标
• 实时传输速率 (发送/接收 MB/s) • 数据包速率 (发送/接收 包/秒) • 链路利用率百分比 • 累积数据传输量 • 数据包统计
2. 安装要求与依赖
2.1 系统要求
• Linux 操作系统 • InfiniBand 硬件和驱动 • 管理员权限 (用于重置计数器)
2.2 依赖软件安装
# Ubuntu/Debian
sudo apt install infiniband-diags perftest bc
# RHEL/CentOS/Rocky Linux
sudo yum install infiniband-diags perftest bc2.3 必要命令
• perfquery: 查询性能计数器• ibstat: 查询设备状态• ibv_devinfo: 设备信息 (可选,用于设备发现)• bc: 数学计算• timeout: 命令超时控制 (通常系统自带)
3. 使用方法与示例
3.1 基本语法
./ib_bandwidth_monitor.sh [选项]3.2 命令行选项
-h | --help | ||
-v | --version | ||
-d | --device | ||
-p | --port | ||
--ports | |||
--multi-devices | |||
--list-ports | |||
-i | --interval | ||
-t | --time | ||
-q | --quiet |
3.3 使用示例
3.3.1 端口发现和基本监控
# 列出所有可监控的端口
./ib_bandwidth_monitor.sh --list-ports
# 自动检测设备并监控(无限监控)
./ib_bandwidth_monitor.sh
# 指定设备和端口监控
./ib_bandwidth_monitor.sh -d mlx5_0 -p 1
# 监控指定时长
./ib_bandwidth_monitor.sh -d mlx5_0 -p 1 -t 603.3.2 多端口监控
# 同时监控多个指定端口
./ib_bandwidth_monitor.sh -d mlx5_0 --ports 1,2,3
# 监控端口范围
./ib_bandwidth_monitor.sh -d mlx5_0 --ports 1-4
# 混合指定端口和范围
./ib_bandwidth_monitor.sh -d mlx5_0 --ports 1,3-5,83.3.3 多设备多端口监控
# 监控多个设备的多个端口
./ib_bandwidth_monitor.sh --multi-devices "mlx5_0:1,2;mlx5_1:1,3"
# 复杂的多设备配置
./ib_bandwidth_monitor.sh --multi-devices "mlx5_0:1-3;mlx5_1:2,4;mlx5_2:1"
# 多设备监控指定时长
./ib_bandwidth_monitor.sh --multi-devices "mlx5_0:1,2;mlx5_1:1" -t 3003.3.4 自定义监控参数
# 监控 2 分钟,每 10 秒采样一次
./ib_bandwidth_monitor.sh -d mlx5_0 -i 10 -t 120
# 高频率监控(1秒间隔)
./ib_bandwidth_monitor.sh -d mlx5_0 -i 1 -t 60
# 静默模式输出(仅数据)
./ib_bandwidth_monitor.sh -d mlx5_0 -q3.3.5 数据收集和分析
# 长时间监控并保存数据
./ib_bandwidth_monitor.sh -d mlx5_0 -q -t 3600 > bandwidth_data.txt
# 短间隔高精度监控
./ib_bandwidth_monitor.sh -i 1 -t 300 -q
# 多端口数据收集
./ib_bandwidth_monitor.sh -d mlx5_0 --ports 1-4 -q -t 1800 > multi_port_data.txt4. 输出格式与性能计算
4.1 SAR 格式输出
脚本固定使用 SAR 风格的输出格式,便于与系统监控工具集成:
时间 接口 rxpck/s txpck/s rxMB/s txMB/s %ifutil
14:30:25 mlx5_0:1 1234 1098 5654.32 4765.43 45.23
14:30:30 mlx5_0:1 1245 1109 5765.43 4876.54 46.12
14:30:35 mlx5_0:1 1256 1120 5876.54 4987.65 47.014.2 输出字段说明
4.3 多设备输出示例
时间 接口 rxpck/s txpck/s rxMB/s txMB/s %ifutil
14:30:25 mlx5_0:1 1234 1098 5654.32 4765.43 45.23
14:30:25 mlx5_0:2 987 876 4321.10 3654.21 35.67
14:30:25 mlx5_1:1 1567 1432 6789.45 5432.10 52.34
14:30:30 mlx5_0:1 1245 1109 5765.43 4876.54 46.12
14:30:30 mlx5_0:2 998 887 4432.21 3765.32 36.45
14:30:30 mlx5_1:1 1578 1443 6890.56 5543.21 53.124.4 性能计算原理
4.4.1 带宽计算公式
实际速率 (MB/s) = (当前计数器 - 前次计数器) × 4字节 / 时间差 / (1024 * 1024)4.4.2 包速率计算
包速率 (包/s) = (当前包计数器 - 前次包计数器) / 时间差4.4.3 利用率计算
利用率 (%) = max(发送速率, 接收速率) / 链路最大速率 × 100
链路最大速率 (MB/s) = 链路速率 (Gbps) × 1254.4.4 关键计数器说明
• PortXmitData: 发送的数据量 (4字节单位) • PortRcvData: 接收的数据量 (4字节单位) • PortXmitPkts: 发送的数据包数量 • PortRcvPkts: 接收的数据包数量
4.4.5 计数器回绕处理
脚本支持32位和64位计数器的回绕处理:
• 首先尝试64位回绕检测 • 如果64位回绕无效,则使用32位回绕 • 确保计数器溢出时数据的连续性
5. 故障排除与优化
5.1 常见错误及解决方法
5.1.1 未检测到 InfiniBand 设备
[ERROR] 未检测到 InfiniBand 设备解决方法:
• 检查 InfiniBand 硬件是否正确安装 • 确认驱动程序已加载: lsmod | grep ib• 检查设备状态: ibstat -l• 加载驱动: sudo modprobe mlx5_ib
5.1.2 端口状态不是 Active
[ERROR] 端口 mlx5_0:1 状态不是 Active (当前: Down)解决方法:
• 检查网络连接 • 确认对端设备状态 • 检查端口配置: ibstat mlx5_0 1• 检查子网管理器是否运行
5.1.3 无法获取性能计数器
[ERROR] 无法获取性能计数器解决方法:
脚本会自动尝试多种 perfquery 调用方式:
1. 使用 CA 名称和端口: perfquery -C device -P port2. 使用 LID: perfquery lid port
如果所有方式都失败:
• 确认有足够权限 (尝试使用 sudo) • 检查 perfquery 命令可用性 • 确认设备和端口参数正确 • 检查 InfiniBand 子网管理器状态
5.1.4 缺少必要命令
[ERROR] 缺少必要的命令: perfquery ibstat解决方法:
• 安装 InfiniBand 工具包 • Ubuntu/Debian: sudo apt install infiniband-diags bc• RHEL/CentOS: sudo yum install infiniband-diags bc
5.1.5 权限问题
[ERROR] Permission denied解决方法:
• 使用 sudo 运行脚本: sudo ./ib_bandwidth_monitor.sh• 将用户添加到 rdma 组: sudo usermod -a -G rdma $USER• 重新登录以使组权限生效
5.1.6 多设备配置错误
[ERROR] 无效的设备配置格式解决方法:
• 检查配置格式: device1:port1,port2;device2:port3,port4• 确保设备名称正确 • 确保端口号在有效范围内 • 使用 --list-ports查看可用端口
5.2 信号处理和清理
脚本支持优雅的信号处理机制:
• Ctrl+C (SIGINT): 优雅停止监控,显示停止信息 • SIGTERM: 终止信号处理,用于系统关闭或进程管理 • 自动清理: 监控停止时自动清理资源和显示状态
# 正常停止示例
$ ./ib_bandwidth_monitor.sh -d mlx5_0
^C
监控已停止5.3 性能优化建议
5.3.1 监控间隔选择
• 高精度监控: 1-2 秒间隔 (短期测试) • 常规监控: 5-10 秒间隔 (日常监控) • 长期监控: 30-60 秒间隔 (趋势分析)
5.3.2 时间控制
• 使用 -t选项指定监控时长,避免无限监控占用资源• 对于长期监控,建议使用较大的间隔值 • 使用静默模式 ( -q) 减少输出开销
5.3.3 多设备监控
• 合理配置多设备监控,避免过多端口同时监控 • 考虑系统负载,适当调整监控间隔 • 使用静默模式输出到文件进行数据分析
6. 集成和自动化
6.1 与监控系统集成
# 数据收集示例 - 输出到文件
./ib_bandwidth_monitor.sh -d mlx5_0 -q -t 300 > /var/log/ib_bandwidth.log
# 实时监控集成
./ib_bandwidth_monitor.sh -d mlx5_0 -q -i 10 | \
whileread line; do
echo"$(date): $line" >> /var/log/ib_monitoring.log
done6.2 定时监控
# 添加到 crontab
# 每5分钟记录一次带宽数据(监控1分钟)
*/5 * * * * /path/to/ib_bandwidth_monitor.sh -d mlx5_0 -q -t 60 >> /var/log/ib_bandwidth.log6.3 告警脚本
#!/bin/bash
# 带宽告警脚本示例
THRESHOLD=80 # 利用率阈值 80%
./ib_bandwidth_monitor.sh -d mlx5_0 -q -t 30 | \
tail -n +2 | \ # 跳过表头
whileread timestamp interface rxpps txpps rxkbps txkbps util; do
if (( $(echo "$util > $THRESHOLD" | bc -l) )); then
echo"WARNING: High bandwidth utilization on $interface: ${util}%"
# 发送告警通知
fi
done6.4 多设备监控脚本
#!/bin/bash
# 多设备监控脚本
DEVICES_CONFIG="mlx5_0:1,2;mlx5_1:1,3;mlx5_2:1"
LOG_FILE="/var/log/multi_device_ib.log"
./ib_bandwidth_monitor.sh --multi-devices "$DEVICES_CONFIG" -q -t 3600 >> "$LOG_FILE"