轉載請注明出處:小鋒學長生活大爆炸[xfxuezhagn.cn]
如果本文幫助到了你,歡迎[點贊、收藏、關注]哦~
目錄
檢查硬件和驅動狀態
測試RDMA通信
報錯修復
對于交換機的配置,可以看這篇:
【教程】詳解配置多臺主機通過交換機實現互聯通信_通過交換機鏈接多臺設備-CSDN博客
檢查硬件和驅動狀態
1、查看是否識別到網卡(PCI 層)
lspci | grep -i mellanox
如果輸出類似以下內容,說明系統已經識別到了硬件設備。
40:00.0 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5]
40:00.1 Ethernet controller: Mellanox Technologies MT27800 Family [ConnectX-5]
2. 查看驅動是否加載成功(內核模塊)
lsmod | grep mlx5
mlx5_ib? ? ? ? ? ? ? ? 466944 ?0
ib_uverbs ? ? ? ? ? ?163840 ?2 rdma_ucm,mlx5_ib
ib_core? ? ? ? ? ? ? ? ?417792 ?8?
mlx5_core ? ? ? ? ? ?2191360 ?1 mlx5_ib
mlx_compat? ? ? ? ? 69632 ?12?
上述輸出說明:
模塊名 說明 mlx5_core
Mellanox 網卡核心驅動,控制數據面 mlx5_ib
用于 RDMA(InfiniBand verbs)的支持 ib_uverbs
用戶態 Verbs 接口(userspace RDMA 程序會依賴) ib_core
RDMA 核心抽象層(通用 InfiniBand 子系統) mlx_compat
Mellanox 向后兼容層(用于 OFED 內核兼容性)
如果沒加載,可嘗試手動加載:
sudo modprobe mlx5_ib
還可以查看所有與 RDMA 相關模塊:
lsmod | grep rdma
ib_uverbs
rdma_ucm
mlx5_ib
3. 查看網卡驅動和狀態
ethtool -i ens1f1np1 # 替換為你的網卡名,ifconfig可查看
driver: mlx5_core
version: 24.10-2.1.8
firmware-version: 16.35.4506 (MT_0000000012)
expansion-rom-version:
bus-info: 0000:1a:00.1
supports-statistics: yes
supports-test: yes
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: yes
4. 查看 RDMA 設備信息(核心)
ibv_devinfo
hca_id: mlx5_0
? ? ? ? transport: ? ? ? ? ? ? ? ? ? ? ?InfiniBand (0)
? ? ? ? fw_ver: ? ? ? ? ? ? ? ? ? ? ? ? 16.35.4506
? ? ? ? node_guid: ? ? ? ? ? ? ? ? ? ? ?043f:7203:00dc:00d4
? ? ? ? sys_image_guid: ? ? ? ? ? ? ? ? 043f:7203:00dc:00d4
? ? ? ? vendor_id: ? ? ? ? ? ? ? ? ? ? ?0x02c9
? ? ? ? vendor_part_id: ? ? ? ? ? ? ? ? 4119
? ? ? ? hw_ver: ? ? ? ? ? ? ? ? ? ? ? ? 0x0
? ? ? ? board_id: ? ? ? ? ? ? ? ? ? ? ? MT_0000000012
? ? ? ? phys_port_cnt: ? ? ? ? ? ? ? ? ?1
? ? ? ? ? ? ? ? port: ? 1
? ? ? ? ? ? ? ? ? ? ? ? state: ? ? ? ? ? ? ? ? ?PORT_ACTIVE (4)
? ? ? ? ? ? ? ? ? ? ? ? max_mtu: ? ? ? ? ? ? ? ?4096 (5)
? ? ? ? ? ? ? ? ? ? ? ? active_mtu: ? ? ? ? ? ? 1024 (3)
? ? ? ? ? ? ? ? ? ? ? ? sm_lid: ? ? ? ? ? ? ? ? 0
? ? ? ? ? ? ? ? ? ? ? ? port_lid: ? ? ? ? ? ? ? 0
? ? ? ? ? ? ? ? ? ? ? ? port_lmc: ? ? ? ? ? ? ? 0x00
? ? ? ? ? ? ? ? ? ? ? ? link_layer: ? ? ? ? ? ? Ethernet
這表示 RDMA 核心層已經注冊并初始化成功。
5. 查看 RDMA 子系統
rdma link show
link mlx5_0/1 state ACTIVE physical_state LINK_UP netdev ens1f0np0
link mlx5_1/1 state ACTIVE physical_state LINK_UP netdev ens1f1np1
說明 RDMA 子系統已加載并綁定到對應網卡。
6. 檢查 OFED 安裝狀態
如果你使用 Mellanox OFED(不是內核默認驅動),可以運行:
ofed_info -s
MLNX_OFED_LINUX-24.10-2.1.8.0:
確認你裝的是 Mellanox 官方驅動棧。
測試RDMA通信
1、在兩臺服務器上新建以下腳本,命名為:rdma_test.sh 。
#!/bin/bash# ===============================================
# Script: rdma_test.sh
# Author: 小鋒學長
# Description:
# 一鍵運行 RDMA 帶寬測試(ib_write_bw)工具,自動完成:
# - 自動檢測 GID index
# - 切換 CPU governor 為 performance
# - 支持 server/client 模式
# - 支持 read / write / send 操作類型(默認 read)
# - 支持傳入設備名、端口號
# - 測試后自動恢復 CPU governor
#
# Requirements:
# - ib_write_bw 工具(來自 perftest 包)
# - Mellanox 驅動已正確加載
# - RDMA 設備支持 RoCE 并已配置 IP + GID
#
# Usage:
# Server 模式:
# bash rdma_test.sh server
# bash rdma_test.sh server [device] [port] [mode_type]
#
# Client 模式:
# bash rdma_test.sh client <server_ip>
# bash rdma_test.sh client <server_ip> [device] [port] [mode_type]
#
# Examples:
# bash rdma_test.sh server mlx5_1 1 read
# bash rdma_test.sh client 192.168.5.228 mlx5_1 1 read
#
# Note:
# - 默認設備為 mlx5_1,默認物理端口為 1
# - GID index 會根據本地 IP 自動選擇
# - 支持異常退出自動清理 CPU governor 設置
# ===============================================# CONFIGURATION (默認值)
MODE="" # 第一個參數為運行模式,server 或 client
PEER_IP="" # 第二個參數作為 Server IP(僅 client 模式使用)
DEVICE="mlx5_1" # 第三個參數為設備名,默認值為 mlx5_1
PORT=1 # 第四個參數為物理端口,默認 1
MODE_TYPE="read" # 第五個參數為傳輸模式,read/write/send(默認 read)
GID_INDEX=-1 # 自動檢測# 解析參數
ARGS=$(getopt -o m:i:d:p:t: \-l mode:,peer_ip:,device:,port:,mode_type: \-n "$0" -- "$@")
if [ $? -ne 0 ]; thenecho "? 參數解析失敗"exit 1
fi
eval set -- "$ARGS"
while true; docase "$1" in-m|--mode) MODE="$2"; shift 2 ;;-i|--peer_ip) PEER_IP="$2"; shift 2 ;;-d|--device) DEVICE="$2"; shift 2 ;;-p|--port) PORT="$2"; shift 2 ;;-t|--mode_type) MODE_TYPE="$2"; shift 2 ;;--) shift; break ;;*) echo "? 未知參數: $1" >&2; exit 1 ;;esac
done# 確定實際運行的測試工具
case "$MODE_TYPE" inwrite) TEST_TOOL="ib_write_bw" ;;send) TEST_TOOL="ib_send_bw" ;;*) TEST_TOOL="ib_read_bw" ;;
esac
echo "==== RDMA 快速檢查和測試工具 ===="
echo "運行模式 : $MODE"
echo "操作類型 : $TEST_TOOL"
echo "網卡設備 : $DEVICE"
echo "物理端口 : $PORT"
[[ "$MODE" == "client" ]] && echo "目標Server: $PEER_IP"# === 1. 檢查 Mellanox 驅動加載狀態 ===
echo "[1] 檢查驅動模塊加載狀態"
lsmod | grep mlx5 || echo "? 未加載 Mellanox 驅動模塊"# === 2. 查看設備狀態 ===
echo -e "\n[2] 查看設備列表與狀態"
ibv_devinfo -d "$DEVICE" || { echo "? RDMA 設備不可用"; exit 1; }# === 3. 自動識別 GID index ===
echo -e "\n[3] 顯示端口 $PORT 的 GID 表:"
for i in {0..15}; doGID=$(cat /sys/class/infiniband/${DEVICE}/ports/${PORT}/gids/$i)echo "GID[$i] = $GID"if [[ "$GID" =~ .*c0a8.* ]]; then # 檢查是否含有192.168.5.x對應十六進制段GID_INDEX=$ifi
done
if [[ "$GID_INDEX" -eq "-1" ]]; thenecho "? 未能自動識別出 GID index,請手動設置 GID_INDEX"exit 1
elseecho "? 使用 GID index: $GID_INDEX"
fi# === 3.5 臨時將 CPU governor 切換為 performance,并注冊恢復 ===
echo -e "\n[3.5] 臨時切換 CPU governor 為 performance"
declare -A ORIGINAL_GOVERNORS
for cpu in /sys/devices/system/cpu/cpu[0-9]*; dogov_file="$cpu/cpufreq/scaling_governor"cpu_name=$(basename "$cpu")ORIGINAL_GOVERNORS[$cpu_name]=$(cat "$gov_file")echo performance | sudo tee "$gov_file" > /dev/null
done
sleep 1restore_governors() {echo -e "\n[清理] 恢復原有 CPU governor 設置..."for cpu in "${!ORIGINAL_GOVERNORS[@]}"; doecho "${ORIGINAL_GOVERNORS[$cpu]}" | sudo tee /sys/devices/system/cpu/$cpu/cpufreq/scaling_governor > /dev/nulldone
}
trap restore_governors EXIT# === 4. 啟動 RDMA 測試 ===
echo -e "\n[4] 啟動 ib_write_bw 測試"
COMMON_ARGS="-d $DEVICE -i $PORT -x $GID_INDEX -s 65536 -q 8 -n 500000 --noPeak --report_gbits"if [[ "$MODE" == "server" ]]; thenecho "🟢 正在啟動 server(設備=$DEVICE, 端口=$PORT, GID=$GID_INDEX, 模式=$TEST_TOOL)"# send 模式提示 + 參數處理if [[ "$MODE_TYPE" == "send" ]]; thenecho -e "\n📢 注意:當前為 send 模式,client需要主動發送數據"if [[ "$MODE" == "server" ]]; thenCOMMON_ARGS="$COMMON_ARGS --run_infinitely"fifiecho "🔧 實際執行命令:sudo $TEST_TOOL $COMMON_ARGS"while true; doecho -e "\n🟢 等待 client 連接..."sudo $TEST_TOOL $COMMON_ARGSecho -e "\n? 當前 client 測試完成,等待下一個連接...\n"sleep 1done
elif [[ "$MODE" == "client" ]]; thenif [[ -z "$PEER_IP" ]]; thenecho "? 錯誤:client 模式需要指定 server IP"echo "用法:$0 client <server_ip> [device] [port] [mode_type]"exit 1fiecho "🚀 正在連接到 server $PEER_IP(設備=$DEVICE, 端口=$PORT, GID=$GID_INDEX, 模式=$TEST_TOOL)"echo "🔧 實際執行命令:sudo $TEST_TOOL $COMMON_ARGS $PEER_IP"sudo $TEST_TOOL $COMMON_ARGS "$PEER_IP"
elseecho "? 錯誤:必須指定模式參數 server 或 client"echo "用法:$0 server [device] [port] [mode_type] 或 $0 client <server_ip> [device] [port] [mode_type]"exit 1
fi
2、在服務端運行(根據你的情況修改):
bash rdma_test.sh -m server -t read
3、在客戶端運行(根據你的情況修改):
bash test_rdma.sh -m client -i 192.168.5.228 -d mlx5_1 -p 1 -t read
4、測試結果:
字段解釋:
字段名 含義 #bytes
每個 RDMA 消息的 payload 大小(本例為 64 KiB) #iterations
總共發送了多少條消息(5000 次) BW peak [MiB/sec]
測試過程中的瞬時最大帶寬(本例為 10313.62 MiB/s) BW average [MiB/sec]
平均帶寬(本例為 10313.14 MiB/s) MsgRate [Mpps]
平均消息發送速率(每秒多少條消息,單位:百萬條)
(本例為 0.165 Mpps,也就是 165,010 條/秒)
5、結果解析:
平均帶寬換算為 Gbps(千兆位每秒):
1 MiB = 22? 字節 = 8.388608 Mbit
所以實際達到了?86.5 Gbps 的有效吞吐量:
10313.14 MiB/sec × 8.388608 = ≈ 86520.2 Mbit/sec ≈ 86.5 Gbps
由于是mlx5 RoCE 網卡(ConnectX-4 或以上),active_speed = 25 Gbps × 4x,因此理論帶寬為:25 × 4 = 100 Gbps(最大可用)。
-
實測:86.5 Gbps
-
達標率:≈ 86.5%
在真實環境下由于 PCIe 延遲、內存訪問、系統 jitter、未調優參數等因素,能達到 80~90% 的理論帶寬就已經非常理想。
6、進一步提升性能:
方法 | 效果 |
---|---|
增加 -q (Queue Pairs 數) | 提高并發度 |
增加 -s 消息大小(如 128KB) | 增加吞吐上限 |
使用 -F | 跳過 CPU 頻率校驗 |
使用 --report_gbits | 直接用 Gbps 輸出,避免換算 |
綁定 NUMA 節點 | 降低內存訪問延遲 |
使用 --duration 模式長期運行 | 穩定性更好 |
示例命令:
sudo ib_write_bw -d mlx5_1 -i 1 -x 5 -s 65536 -q 8 -F -n 1000000 --report_gbits
報錯修復
1、Unable to init the socket connection
把防火墻都關了。
sudo systemctl stop firewalld # 重啟會恢復
sudo systemctl disable firewalld # 禁用后重啟也不會恢復
sudo ufw disable
sudo iptables -F