2. 使用DPU进行硬件卸载的TCP流量卸载

任务目标

在BlueField-3 DPU上启用硬件TCP卸载(校验和计算与TCP分段卸载TSO),使主机侧网络栈将相关计算任务交给DPU处理,并通过对比卸载前后主机CPU占用率验证卸载效果。

环境依赖

  • BlueField-3 DPU(DOCA 2.x及以上版本)
  • 主机侧已安装mlnx-tools与ethtool
  • DPU已配置为独立模式(Separated Host),使用rshim或SSH访问DPU

实现步骤与代码

TCP卸载配置涉及主机侧网卡(PF)与DPU侧代表口(Representor)两个平面。以下操作均在主机侧执行(通过mlx5_ib或mlx5_core驱动暴露的PF接口)。

#!/bin/bash
# 文件: tcp_offload_setup.sh
# 用法: sudo ./tcp_offload_setup.sh <PF接口名>
# 示例: sudo ./tcp_offload_setup.sh enp3s0f0

PF_IF=${1:?请指定PF接口名,如 enp3s0f0}

# 1. 查看当前卸载状态(卸载前基线)
echo "=== 卸载前状态 ==="
ethtool -k $PF_IF | grep -E "tcp-segmentation-offload|tx-checksum-ipv4|tx-checksum-tcp"

# 2. 启用TCP校验和卸载(tx-checksum-ipv4/tcp 由同一开关控制)
ethtool -K $PF_IF tx on

# 3. 启用TCP分段卸载(TSO)
ethtool -K $PF_IF tso on

# 4. 确认卸载已生效
echo "=== 卸载后状态 ==="
ethtool -k $PF_IF | grep -E "tcp-segmentation-offload|tx-checksum-ipv4|tx-checksum-tcp"

# 5. 输出当前队列与中断配置(供CPU占用对比参考)
echo "=== 队列信息 ==="
ethtool -l $PF_IF | head -20

若需关闭卸载以做对比测试,执行:

ethtool -K $PF_IF tx off tso off

验证方法

验证路径:在主机侧使用iperf3产生TCP流量,分别记录卸载开启与关闭时的主机CPU占用率。

# 终端1:启动服务端(卸载开启状态)
iperf3 -s -i 1

# 终端2:启动客户端,持续60秒
iperf3 -c 127.0.0.1 -t 60 -i 1

# 终端3:另开窗口,用top或pidstat监控CPU
top -d 1 | grep -E "iperf|%Cpu"

通过条件:

  1. ethtool -k输出中tcp-segmentation-offload: on且tx-checksum-tcp: on;
  2. 卸载开启时,iperf3传输速率不低于关闭时的90%(避免卸载引入性能回退);
  3. 在相同流量速率(例如均达到5Gbps)下,卸载开启时主机CPU占用率较关闭时下降至少15%。
TCP卸载前后数据路径对比 卸载关闭 主机CPU TCP校验和+分段 网卡(透传) 高CPU负载 软件处理 DPU硬件卸载 主机CPU 轻量封装 (无校验和计算) DPU(硬件卸载) 校验和+TSO 低CPU负载 硬件加速 数据路径:主机CPU → 网络栈 → 网卡/DPU → 物理链路

常见问题

  • 卸载不生效:确认PF接口绑定的是mlx5_core驱动(ethtool -i $PF_IF查看),且DPU固件版本支持硬件卸载。
  • TSO开启失败:部分虚拟化环境需先在DPU侧开启对应VF的卸载能力,检查DPU上ip link show中代表口状态。
  • CPU占用未下降:确认流量确实经过DPU硬件路径(而非loopback),建议使用两个物理主机或DPU上的VF与PF对打流量。