InfiniBand 网络带宽监控脚本使用说明
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 bc
2.3 必要命令
perfquery: 查询性能计数器ibstat: 查询设备状态ibv_devinfo: 设备信息 (可选,用于设备发现)bc: 数学计算timeout: 命令超时控制 (通常系统自带)
3. 使用方法与示例
3.1 基本语法
./ib_bandwidth_monitor.sh [选项]
3.2 命令行选项
| 选项 | 长选项 | 参数 | 说明 |
|---|---|---|---|
-h |
--help |
- | 显示帮助信息 |
-v |
--version |
- | 显示版本信息 |
-d |
--device |
DEVICE | 指定设备名称 (如: mlx5_0) |
-p |
--port |
PORT | 指定端口号 (默认: 1) |
--ports |
PORTS | 指定多个端口 (如: 1,2,3 或 1-4) | |
--multi-devices |
CONFIG | 指定多设备多端口配置 (如: mlx5_0:1,2;mlx5_1:1,3) | |
--list-ports |
- | 列出所有可监控的端口 | |
-i |
--interval |
SECONDS | 监控间隔秒数 (默认: 5) |
-t |
--time |
SECONDS | 监控总时长秒数 (默认: 0,表示无限监控) |
-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 60
3.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,8
3.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 300
3.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 -q
3.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.txt
4. 输出格式与性能计算
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.01
4.2 输出字段说明
| 字段 | 说明 |
|---|---|
| 时间 | 采样时间戳 (HH:MM:SS) |
| 接口 | 设备名:端口号 (如: mlx5_0:1) |
| rxpck/s | 接收包速率 (包/秒) |
| txpck/s | 发送包速率 (包/秒) |
| rxMB/s | 接收数据速率 (MB/秒) |
| txMB/s | 发送数据速率 (MB/秒) |
| %ifutil | 链路利用率百分比 |
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.12
4.4 性能计算原理
4.4.1 带宽计算公式
实际速率 (MB/s) = (当前计数器 - 前次计数器) × 4字节 / 时间差 / (1024 * 1024)
4.4.2 包速率计算
包速率 (包/s) = (当前包计数器 - 前次包计数器) / 时间差
4.4.3 利用率计算
利用率 (%) = max(发送速率, 接收速率) / 链路最大速率 × 100
链路最大速率 (MB/s) = 链路速率 (Gbps) × 125
4.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 调用方式:
- 使用 CA 名称和端口:
perfquery -C device -P port - 使用 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 | \
while read line; do
echo "$(date): $line" >> /var/log/ib_monitoring.log
done
6.2 定时监控
# 添加到 crontab
# 每5分钟记录一次带宽数据(监控1分钟)
*/5 * * * * /path/to/ib_bandwidth_monitor.sh -d mlx5_0 -q -t 60 >> /var/log/ib_bandwidth.log
6.3 告警脚本
#!/bin/bash
# 带宽告警脚本示例
THRESHOLD=80 # 利用率阈值 80%
./ib_bandwidth_monitor.sh -d mlx5_0 -q -t 30 | \
tail -n +2 | \ # 跳过表头
while read timestamp interface rxpps txpps rxkbps txkbps util; do
if (( $(echo "$util > $THRESHOLD" | bc -l) )); then
echo "WARNING: High bandwidth utilization on $interface: ${util}%"
# 发送告警通知
fi
done
6.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"