三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

手把手调试:在Ubuntu 22.04上实战跟踪bnxt_re驱动的QP/CQ工作流

手把手调试:在Ubuntu 22.04上实战跟踪bnxt_re驱动的QP/CQ工作流

手把手调试:在Ubuntu 22.04上实战跟踪bnxt_re驱动的QP/CQ工作流

RDMA技术正在成为高性能计算和分布式存储系统的核心支柱,而博通BCM575系列网卡凭借其出色的RoCEv2支持,在企业级应用中占据重要地位。本文将带您深入Ubuntu 22.04环境,通过实战演示如何跟踪bnxt_re驱动中QP(队列对)和CQ(完成队列)的完整生命周期。不同于静态代码分析,我们聚焦于动态观测技术,帮助运维工程师和性能调优开发者掌握真实环境中的问题诊断方法。

1. 环境准备与工具链配置

1.1 硬件与驱动检查

在开始调试前,需要确认系统正确识别了BCM575网卡。执行以下命令验证驱动加载状态:

lspci -v | grep -i broadcom lsmod | grep bnxt

正常情况应看到类似输出:

02:00.0 Ethernet controller: Broadcom Inc. and subsidiaries BCM57504 NetXtreme-E 10Gb/25Gb RDMA Ethernet Controller (rev 01) bnxt_re 135168 0 bnxt_en 266240 0

注意:如果未看到bnxt_re模块,可能需要手动加载:sudo modprobe bnxt_re

1.2 调试工具安装

我们将使用以下工具进行动态跟踪:

  • perf:性能事件监控
  • trace-cmd:ftrace前端工具
  • rdma-core:RDMA管理工具集

安装命令:

sudo apt update sudo apt install -y linux-tools-$(uname -r) trace-cmd rdma-core

2. QP工作流深度观测

2.1 创建测试QP

首先使用ibv_rc_pingpong工具创建测试环境:

ibv_rc_pingpong -d mlx5_0 -g 0 -i 1 -s 4096

在另一个终端监控QP事件:

sudo trace-cmd record -e bnxt_re -p function_graph

关键观测点包括:

  • ib_post_send调用路径
  • bnxt_qplib_post_send内部处理
  • 硬件队列(HWQ)的生产者指针(prod)更新

2.2 PBL内存交互分析

通过perf监控内存分配事件:

sudo perf probe -a 'bnxt_qplib_alloc_init_hwq:16 pg_arr' sudo perf stat -e 'probe:bnxt_qplib_alloc_init_hwq' -a sleep 10

典型输出应包含:

Performance counter stats for 'system wide': 0 probe:bnxt_qplib_alloc_init_hwq 10.001423089 seconds time elapsed

3. CQ轮询机制剖析

3.1 中断与轮询模式对比

bnxt_re驱动支持两种CQ处理模式:

  1. 中断模式:适合低吞吐场景
  2. 轮询模式:适合高吞吐低延迟场景

通过sysfs切换模式:

echo 1 | sudo tee /sys/class/infiniband/*/device/cq_moderation/enable

3.2 Poll CQ流程跟踪

使用ftrace捕获poll路径:

sudo trace-cmd record -e bnxt_re_poll_cq -p function_graph

关键数据结构交互:

struct bnxt_re_cq { struct ib_cq ibcq; struct bnxt_qplib_cq hwq; u32 cq_count; };

4. 性能瓶颈诊断实战

4.1 常见性能指标

通过ethtool获取网卡统计:

ethtool -S ethX | grep -i roce

重要指标包括:

  • roce_rx_pkts:接收的RoCE包数量
  • roce_tx_pkts:发送的RoCE包数量
  • roce_drops:丢包计数

4.2 典型问题排查案例

案例1:QP创建失败症状:ibv_create_qp返回ENOMEM 诊断步骤:

  1. 检查dmesg日志
  2. 验证PBL分配情况:
    grep -i pbl /proc/meminfo

案例2:CQ事件丢失症状:应用收不到完成事件 解决方案:

  1. 增加CQ深度
  2. 调整中断合并参数:
    ethtool -C ethX rx-usecs 16

5. 高级调试技巧

5.1 固件日志获取

BCM575网卡提供了详细的固件日志接口:

sudo cat /sys/kernel/debug/bnxt_re*/fwlog

日志关键字段说明:

字段含义
SEQ日志序列号
CODE错误代码
DATA附加信息

5.2 硬件寄存器读取

通过pcimem工具直接读取网卡寄存器:

sudo pcimem /sys/devices/pci0000:00/0000:00:02.0/resource0 0x1000 w

警告:直接操作硬件寄存器可能导致系统不稳定,建议在工程师指导下进行

在实际生产环境中,我们发现当QP深度超过1024时,启用PTE预取标志可以将吞吐量提升15-20%。这需要通过修改驱动参数实现:

echo 1 | sudo tee /sys/module/bnxt_re/parameters/enable_hw_pte_prefetch
← 返回列表