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"
通过条件:
ethtool -k输出中tcp-segmentation-offload: on且tx-checksum-tcp: on;- 卸载开启时,iperf3传输速率不低于关闭时的90%(避免卸载引入性能回退);
- 在相同流量速率(例如均达到5Gbps)下,卸载开启时主机CPU占用率较关闭时下降至少15%。
常见问题
- 卸载不生效:确认PF接口绑定的是
mlx5_core驱动(ethtool -i $PF_IF查看),且DPU固件版本支持硬件卸载。 - TSO开启失败:部分虚拟化环境需先在DPU侧开启对应VF的卸载能力,检查DPU上
ip link show中代表口状态。 - CPU占用未下降:确认流量确实经过DPU硬件路径(而非loopback),建议使用两个物理主机或DPU上的VF与PF对打流量。