微知-ib_write_bw的各种参数汇总?如何绑核?三种查看numa节点方式?(-d -q -s -R --run_infinitely,mr_per_qp

1. 背景

经常忘记使用ib_write_bw打流的一些参数,特此整理记录在这里方便快速查阅。尤其是run_infinitely这个参数容易写错。

2. 最简洁

ib_write_bw -d mlx5_0 # server
ib_write_bw -d mlx5_0 1.1.1.1 # client

3. 常用参数

3.1 非常常用

  • -d mlx5_0, --ib-dev= 指定ib设备,比如: -d mlx5_0表示用mlx5_0设备
  • -q 8 指定qp数量,比如8个qp, --qp=<num of qp’s> Num of qp’s(default 1)。服务器和client都需要指定
  • -R 使用rdma_cm建链, --rdma_cm 。服务器和client都需要指定
  • --run_infinitely 一直持续的运行,每间隔-D的参数秒打印
  • -s 1024指定size大小, --size=

3.2 一般常用

  • -D 10, --duration 指定打流时间 比如-D 10 指定10秒
  • -a 默认只会用65535的msgsize,这里会使用从2到2^23(8M)大小的size, --all
  • -c RC指定类型,默认RC。, --connection=<RC/XRC/UC/DC>
  • -i 1 指定IB的port。, --ib-port= Use port of IB device (default 1)
  • -m 4096 指定mtu, --mtu= MTU size : 256 - 4096 (default port mtu)
  • -p 18516 Listen on/connect to port (default 18515) 指定建链监听端口, --port=
  • -u 14 指定qp超时时间,默认, --qp-timeout= QP timeout, timeout value is 4 usec * 2 ^(timeout), default 14 ,约等于 65ms
  • --report_gbits使用Gbps的方式报告
  • --rate_limit=<rate> 设置最大限速Set the maximum rate of sent packages. default unit is [Gbps]. use --rate_units to change that.

3.3 高阶用法

3.3.1 perftest如何分配多个mr --mr_per_qp

  • --mr_per_qp 如果-q指定多个qp,默认用一个内存注册到网卡,该参数会根据每个qp创建内存以及注册多个mr

–mr_per_qp Create memory region for each qp. Relevant only for bandwidth

场景:有些场景要用perftest多个qp,默认是共用一个mr,用该参数可以一个qp对应一个mr,可以增加mr的数量,影响网卡上mkey cache、page cache等参数

3.3.2 如何绑核操作指定固定cpu和内存 numactl --physcpubind=0-3 --membind=0

两种方式绑核操作。taskset直接指定cpu,numactl指定cpu以及还可以指定membind
方法1:taskset仅能管理CPU的亲和性

taskset -c 0,1 ib_write_bw -d mlx5_0 -i 1 -x 3 -s 4096 --report_gbits 1.1.1.0
taskset -c 2,3 ib_write_bw -d mlx5_1 -i 1 -x 3 -s 4096 --report_gbits 1.1.1.0

将在CPUs 2,3运行

方法2:

server: numactl --physcpubind=0-3 --membind=0 ib_write_bw -d mlx5_0 -s 4096
client: numactl --physcpubind=0-3 --membind=0 ib_write_bw -d mlx5_1 1.1.1.0 -s 4096 --report_gbits

numactl 是为 NUMA 架构优化的工具,–physcpubind 仅是其功能之一。它的核心设计目标是 “协调 CPU 核心与内存节点的绑定”,确保进程使用的 CPU 核心和内存均来自同一 NUMA 节点,从而避免远程内存访问延迟。
例如:通过 numactl --physcpubind=0-3 --membind=0 ./app,可让进程同时绑定到 NUMA 节点 0 的核心 0-3,且仅使用节点 0 的本地内存。
在这里插入图片描述
在这里插入图片描述

其他:
numactl --membind指定的membind的id总的多少个怎么看?(三种numa节点查看方式)
通过lscpu可以查看,也可以通过numactl查看,也可以通过sys文件查看

  • lscpu查看 lscpu |grep "NUMA node"
    可以看到1个
    在这里插入图片描述
    另一台:
    在这里插入图片描述

  • numactl查看 numactl --hardware
    在这里插入图片描述
    另一台:
    在这里插入图片描述

  • sysfs查看: ls /sys/devices/system/node/
    是在

01:00.0 Ethernet controller: Mellanox Technologies MT2894 Family [ConnectX-6 Lx] Subsystem: Mellanox Technologies Device 0001 Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr+ Stepping- SERR+ FastB2B- DisINTx+ Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0, Cache Line Size: 32 bytes Interrupt: pin A routed to IRQ 77 NUMA node: 0 Region 0: Memory at 80002000000 (64-bit, prefetchable) [size=32M] Expansion ROM at e7a00000 [disabled] [size=1M] Capabilities: [60] Express (v2) Endpoint, MSI 00 DevCap: MaxPayload 512 bytes, PhantFunc 0, Latency L0s unlimited, L1 unlimited ExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset+ SlotPowerLimit 25.000W DevCtl: CorrErr+ NonFatalErr+ FatalErr+ UnsupReq- RlxdOrd+ ExtTag+ PhantFunc- AuxPwr- NoSnoop+ FLReset- MaxPayload 256 bytes, MaxReadReq 512 bytes DevSta: CorrErr- NonFatalErr- FatalErr- UnsupReq- AuxPwr- TransPend- LnkCap: Port #0, Speed 16GT/s, Width x8, ASPM not supported ClockPM- Surprise- LLActRep- BwNot- ASPMOptComp+ LnkCtl: ASPM Disabled; RCB 128 bytes Disabled- CommClk- ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt- LnkSta: Speed 16GT/s (ok), Width x8 (ok) TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt- DevCap2: Completion Timeout: Range ABC, TimeoutDis+, NROPrPrP-, LTR- 10BitTagComp+, 10BitTagReq-, OBFF Not Supported, ExtFmt-, EETLPPrefix- EmergencyPowerReduction Not Supported, EmergencyPowerReductionInit- FRS-, TPHComp-, ExtTPHComp- AtomicOpsCap: 32bit- 64bit- 128bitCAS- DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-, LTR-, OBFF Disabled AtomicOpsCtl: ReqEn+ LnkCtl2: Target Link Speed: 16GT/s, EnterCompliance- SpeedDis- Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS- Compliance De-emphasis: -6dB LnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete+, EqualizationPhase1+ EqualizationPhase2+, EqualizationPhase3+, LinkEqualizationRequest- Capabilities: [48] Vital Product Data Product Name: ConnectX-6 Lx EN adapter card, 25GbE, Dual-port SFP28, PCIe 4.0 x8, No Crypto Read-only fields: [PN] Part number: MCX631102AN-ADAT [EC] Engineering changes: AC [V2] Vendor specific: MCX631102AN-ADAT [SN] Serial number: MT24476013AM [V3] Vendor specific: 4451ddbdd4a9ef118000b8e924cea95a [VA] Vendor specific: MLX:MN=MLNX:CSKU=V2:UUID=V3:PCI=V0:MODL=CX631102A [V0] Vendor specific: PCIeGen4 x8 [VU] Vendor specific: MT24476013AMMLNXS0D0F0 [RV] Reserved: checksum good, 1 byte(s) reserved End Capabilities: [9c] MSI-X: Enable+ Count=64 Masked- Vector table: BAR=0 offset=00002000 PBA: BAR=0 offset=00003000 Capabilities: [c0] Vendor Specific Information: Len=18 <?> Capabilities: [40] Power Management version 3 Flags: PMEClk- DSI- D1- D2- AuxCurrent=375mA PME(D0-,D1-,D2-,D3hot-,D3cold+) Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME- Capabilities: [100 v1] Advanced Error Reporting UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol- UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq+ ACSViol- UESvrt: DLP+ SDES- TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol- CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr- CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr+ AERCap: First Error Pointer: 08, ECRCGenCap+ ECRCGenEn- ECRCChkCap+ ECRCChkEn- MultHdrRecCap- MultHdrRecEn- TLPPfxPres- HdrLogCap- HeaderLog: 00000000 00000000 00000000 00000000 Capabilities: [150 v1] Alternative Routing-ID Interpretation (ARI) ARICap: MFVC- ACS-, Next Function: 1 ARICtl: MFVC- ACS-, Function Group: 0 Capabilities: [180 v1] Single Root I/O Virtualization (SR-IOV) IOVCap: Migration-, Interrupt Message Number: 000 IOVCtl: Enable- Migration- Interrupt- MSE- ARIHierarchy+ IOVSta: Migration- Initial VFs: 8, Total VFs: 8, Number of VFs: 0, Function Dependency Link: 00 VF offset: 2, stride: 1, Device ID: 101e Supported Page Size: 000007ff, System Page Size: 00000010 Region 0: Memory at 0000080004800000 (64-bit, prefetchable) VF Migration: offset: 00000000, BIR: 0 Capabilities: [1c0 v1] Secondary PCI Express LnkCtl3: LnkEquIntrruptEn-, PerformEqu- LaneErrStat: 0 Capabilities: [230 v1] Access Control Services ACSCap: SrcValid- TransBlk- ReqRedir- CmpltRedir- UpstreamFwd- EgressCtrl- DirectTrans- ACSCtl: SrcValid- TransBlk- ReqRedir- CmpltRedir- UpstreamFwd- EgressCtrl- DirectTrans- Capabilities: [320 v1] Lane Margining at the Receiver <?> Capabilities: [370 v1] Physical Layer 16.0 GT/s <?> Capabilities: [420 v1] Data Link Feature <?> Kernel driver in use: mlx5_core Kernel modules: mlx5_core 以上信息含有:网卡型号解析、数量、ID、带宽、速率、驱动等信息吗
08-20
#!/bin/bash # Modified for CoreWeave IB_WRITE_BW_EXE_PATH=/usr/bin/ib_write_bw IB_WRITE_BW=basename $IB_WRITE_BW_EXE_PATH IB_WRITE_BW_DURATION=10 IB_WRITE_BW_ARGS="-s $(( 1 * 1024 * 1024 )) -S ${NCCL_IB_SL:-0} -D ${IB_WRITE_BW_DURATION} --report_gbits -F -x 0" SLEEP_TIME=5 # Eat array from environment, unless its null, if so fallback to static mapping if [ -z "$ib_array" ]; then array_ib=('ibp0' 'ibp1' 'ibp2' 'ibp3') else eval array_ib=$(printenv ib_array) fi if [ -z "$gpu_array" ]; then array_gpu=('1' '3' '5' '7') else eval array_gpu=$(printenv gpu_array) fi function check_ib_bw_gdr() { EXP_IB_BW=$1 HOSTNAME="localhost" # array index possitions pos=0 max=${#array_ib[@]};((max--)) while [ $pos -lt ${#array_ib[@]} ]; do device=${array_ib[$pos]} device_numa=cat /sys/class/infiniband/$device/device/numa_node cmd="numactl -N ${device_numa} -m ${device_numa} $IB_WRITE_BW_EXE_PATH $IB_WRITE_BW_ARGS -d ${device} --use_cuda=${array_gpu[$pos]}" dbg "$cmd" IB_WRITE_BW_OUT1=$(${cmd} > /dev/null &) IB_WRITE_BW_OUT1_RC=$? if [[ $IB_WRITE_BW_OUT1_RC != 0 ]]; then log "$IB_WRITE_BW_OUT1" die 1 "$FUNCNAME: $IB_WRITE_BW returned error code $IB_WRITE_BW_OUT1_RC" return 1 fi sleep $SLEEP_TIME device=${array_ib[$max]} device_numa=cat /sys/class/infiniband/$device/device/numa_node cmd="numactl -N ${device_numa} -m ${device_numa} $IB_WRITE_BW_EXE_PATH $IB_WRITE_BW_ARGS -d ${device} --use_cuda=${array_gpu[$max]} $HOSTNAME" dbg "$cmd" IB_WRITE_BW_OUT2=$(${cmd}) IB_WRITE_BW_OUT2_RC=$? if [[ $IB_WRITE_BW_OUT2_RC != 0 ]]; then log "$IB_WRITE_BW_OUT2" die 1 "$FUNCNAME: $IB_WRITE_BW returned error code $IB_WRITE_BW_OUT2_RC" return 1 fi IFS=$'\n' IB_WRITE_BW_OUT2_LINES=( $IB_WRITE_BW_OUT2 ) IFS=$' \t\n' for ((i=0; i<${#IB_WRITE_BW_OUT2_LINES[*]}; i++)) do dbg "${IB_WRITE_BW_OUT2_LINES[$i]}" if [[ "${IB_WRITE_BW_OUT2_LINES[$i]//1048576}" != "${IB_WRITE_BW_OUT2_LINES[$i]}" ]]; then LINE=( ${IB_WRITE_BW_OUT2_LINES[$i]} ) ib_bandwidth=${LINE[3]} dbg "GDR IB devices=${array_ib[$pos]}, ${array_ib[$max]}: numa domains=${HCA_NUMA[$pos]},${HCA_NUMA[$max]}, Measured IB BW $ib_bandwidth Gbps" break fi done if [[ $(echo "$ib_bandwidth < $EXP_IB_BW" | bc) -ne 0 ]]; then log "$IB_WRITE_BW_OUT2" die 1 "$FUNCNAME: $IB_WRITE_BW, IB=${array_ib[$pos]}, ${array_ib[$max]} IB BW (expected > $EXP_IB_BW Gbps, but measured $ib_bandwidth Gbps" return 1 fi ((max--)) ((pos++)) done return 0 } check_ib_bw_gdr 378.0
07-24
为了运行 InfiniBand 带宽测试并验证是否达到预期带宽,可以使用 `ib_write_bw` 工具进行测试。`ib_write_bw` 是 `perftest` 工具包中的一个基准测试工具,支持包括 RDMA 操作在内的多种 InfiniBand 传输模式。以下是一个完整的测试脚本示例,包含 GPU Direct RDMA 验证。 ### 1. 环境准备 确保系统中安装了必要的 InfiniBand 驱动和工具包,包括 `perftest` 和 `libibverbs`。如果使用 GPU Direct RDMA,则还需要安装支持 RDMA 的 CUDA 驱动和库(如 `libcuda.so` 和 `libnccl.so`)。 ```bash # 安装 InfiniBand 工具和 perftest 测试包 sudo apt-get install libibverbs-dev ibutils ibverbs-utils perftest ``` ### 2. 使用 `ib_write_bw` 进行带宽测试 #### 基本测试命令 以下命令用于运行基本的 `ib_write_bw` 测试: ```bash # 在服务器端运行 ib_write_bw --ib-dev=mlx5_0 --port=1 --mtu=4096 --size=131072 --qp=10 --cq=10 --iters=1000 --duplex --duration=10 # 在客户端运行 ib_write_bw --ib-dev=mlx5_0 --port=1 --mtu=4096 --size=131072 --qp=10 --cq=10 --iters=1000 --duplex --duration=10 <server_ip> ``` #### 参数说明: - `--ib-dev`: 指定使用的 InfiniBand 设备(如 `mlx5_0`)。 - `--port`: 指定 InfiniBand 端口(通常为 `1`)。 - `--mtu`: 设置 MTU(最大传输单元),通常设置为 `4096`。 - `--size`: 每次传输的数据大小(单位为字节),例如 `131072` 表示 128KB。 - `--qp`: 指定队列对(QP)数量。 - `--cq`: 指定完成队列(CQ)数量。 - `--iters`: 指定测试迭代次数。 - `--duplex`: 启用双向通信模式。 - `--duration`: 指定单次测试的持续时间(单位为秒)。 - `<server_ip>`: 替换为服务器的 IP 地址。 ### 3. 验证 GPU Direct RDMA 要验证 GPU Direct RDMA,可以使用 `ib_write_bw` 的 GPU 支持选项。确保系统中已安装支持 GPU Direct RDMA 的 CUDA 驱动和库。 ```bash # 在服务器端运行 GPU Direct RDMA 测试 ib_write_bw --ib-dev=mlx5_0 --port=1 --mtu=4096 --size=131072 --qp=10 --cq=10 --iters=1000 --duplex --use_cuda=0 --duration=10 # 在客户端运行 GPU Direct RDMA 测试 ib_write_bw --ib-dev=mlx5_0 --port=1 --mtu=4096 --size=131072 --qp=10 --cq=10 --iters=1000 --duplex --use_cuda=0 --duration=10 <server_ip> ``` #### 参数说明: - `--use_cuda`: 指定使用 GPU Direct RDMA参数值为 GPU 设备的索引号(例如 `0` 表示第一个 GPU)。 ### 4. 结果分析 测试完成后,`ib_write_bw` 会输出带宽和延迟等性能指标。重点关注以下内容: - **带宽 (Bandwidth)**:单位为 Gbps,用于衡量数据传输能力。 - **延迟 (Latency)**:单位为微秒(μs),用于衡量单次传输的时间开销。 - **稳定性**:确保测试过程中带宽波动较小,且无丢包现象。 通过比较预期带宽与实际测试结果,可以判断网络性能是否符合预期。 ### 5. 脚本示例 以下是一个完整的测试脚本示例: ```bash #!/bin/bash # 配置参数 IB_DEV="mlx5_0" PORT="1" MTU="4096" SIZE="131072" QP="10" CQ="10" ITERS="1000" DURATION="10" USE_CUDA="0" SERVER_IP="192.168.1.1" # 替换为服务器的 IP 地址 # 服务器端测试 echo "Starting server-side test..." ib_write_bw --ib-dev=$IB_DEV --port=$PORT --mtu=$MTU --size=$SIZE --qp=$QP --cq=$CQ --iters=$ITERS --duplex --use_cuda=$USE_CUDA --duration=$DURATION & # 等待服务器启动 sleep 5 # 客户端测试 echo "Starting client-side test..." ib_write_bw --ib-dev=$IB_DEV --port=$PORT --mtu=$MTU --size=$SIZE --qp=$QP --cq=$CQ --iters=$ITERS --duplex --use_cuda=$USE_CUDA --duration=$DURATION $SERVER_IP # 结束测试 echo "Test completed." ``` 保存为 `ib_bw_test.sh` 并赋予执行权限: ```bash chmod +x ib_bw_test.sh ``` 运行脚本: ```bash ./ib_bw_test.sh ``` ### 6. 常见问题排查 - **带宽未达预期**:检查网络链路状态、MTU 设置以及 InfiniBand 设备的固件版本。 - **GPU Direct RDMA 失败**:确认 CUDA 驱动版本与 GPU 兼容,并检查 `libcuda.so` 和 `libnccl.so` 是否正确安装。 - **测试中断**:检查防火墙设置,确保 InfiniBand 端口未被阻塞。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值