Skip to content

通用网卡吞吐量优化方案 ​

本文面向千兆、万兆及更高速率网卡的吞吐量优化,适用于 SylixOS 上使用 ifethtool、xgro、iftcpwnd 等工具对网卡、协议栈和应用收发路径进行调优的场景。

吞吐量优化的核心目标是:减少 CPU 参与、降低协议栈分片和拷贝开销、扩大合适的缓冲窗口,并让网卡硬件持续保持有数据可收发。

优化思路 ​

吞吐量瓶颈通常来自以下几个方面:

瓶颈表现优化方向
CPU 负载高网络线程占用高、发包速率上不去开启硬件卸载、软件聚合、减少中断频率
协议栈分片开销大大包发送被软件拆分,CPU 消耗高开启 TSO / GSO / UFO,合理增大 MTU
TCP 窗口不足发送或接收出现断流,吞吐波动调整 iftcpwnd,匹配带宽时延积(BDP)
缓冲区不足UDP 丢包、应用读写阻塞增大发送/接收缓冲区
描述符不足突发流量丢包或网卡供包不足增大 TX/RX ring 描述符数量
中断策略不合适CPU 频繁上下文切换或收包延迟高配置中断聚合或动态中断调节

发送方向优化 ​

开启硬件卸载 ​

硬件卸载将校验和计算、TCP 大包分段、UDP 分片等高开销任务交给网卡硬件处理,从而降低协议栈 CPU 负载。

常用配置:

bash
# 开启 GSO / TSO
ifethtool -K en1 gso on tso on

# 查看硬件卸载配置
ifethtool -k en1

如果驱动支持 UDP 分片卸载,也可按实际能力开启 UFO。是否支持具体能力,以 ifethtool -k 输出和驱动实现为准。

调整 MTU ​

MTU 决定链路层单帧最大载荷。适当增大 MTU 可以减少包头占比和协议栈处理次数,提升有效吞吐。

调优建议:

  • 全链路设备都支持时,可使用较大 MTU 提升吞吐。
  • MTU 不一致会导致丢包或分片,应确认对端、交换机和中间链路配置一致。
  • 更大的 MTU 可能增加单包排队延迟,不适合极低延迟场景。

调整 TCP 窗口 ​

TCP 窗口需要匹配链路带宽和往返时延。窗口过小会限制对端发送速率,导致吞吐无法跑满。

bash
# 示例:增大 TCP 窗口
iftcpwnd 5124280

经验策略:

  • 初始可按带宽时延积(BDP)估算窗口大小。
  • 高带宽、高 RTT 链路需要更大的窗口。
  • 窗口过大可能增加排队和重传成本,应结合丢包与时延观察调整。

增大发送缓冲区 ​

发送缓冲区过小会导致应用层写入频繁阻塞,出现“断流”或吞吐波动。吞吐优先场景可适当增大发送缓冲区,使协议栈与网卡之间有足够数据供应。

注意:缓冲区过大也会增加内存占用和排队延迟,不适合低延迟优先业务。

调整发送描述符 ​

TX 描述符过少时,网卡发送队列容易被填满,发送线程频繁休眠与唤醒,吞吐下降。吞吐优先场景可适当增大 TX ring,例如 1024 或 2048。

是否可调以及具体命令取决于驱动是否接入 ifethtool ring 配置能力。

接收方向优化 ​

开启软件 GRO ​

GRO 将多个连续小包在软件层聚合后再提交协议栈,减少协议栈处理次数,提高接收吞吐并降低 CPU 占用。

bash
# 开启 GRO
xgro en1 on

# 设置聚合包数
xgro en1 on cnt 32

# 查看 GRO 状态
xgro show en1

调优建议:

  • 聚合个数越大,吞吐越可能提升,但实时性下降。
  • 建议从 16、32、64 等值逐步测试,找到吞吐和延迟平衡点。
  • 低延迟业务不建议设置过大的聚合个数。

调整接收窗口 ​

接收窗口通过 ACK 告知对端“还能接收多少数据”,会直接影响对端发送速率。

bash
# 示例:增大 TCP 接收窗口
iftcpwnd 1048560

接收窗口建议略大于对端拥塞窗口,避免对端被接收窗口限制。但窗口过大也可能增加接收端排队延迟,并在网络波动时带来更多重传。

调整接收缓冲区 ​

接收缓冲区用于暂存网卡已接收、但应用尚未读取的数据,尤其影响 UDP 接收场景。

建议:

  • 万兆 UDP 接收可从 512K 到 1M 起步测试。
  • 若应用读包不及时且出现丢包,可继续增大。
  • 过大缓冲区会增加延迟和内存占用,应结合业务要求控制上限。

调整中断聚合 ​

中断过于频繁会导致 CPU 陷入上下文切换;中断过少又会导致数据在硬件 FIFO 中等待过久,增加延迟甚至溢出。

吞吐优先场景可适度提高中断聚合程度,降低 CPU 中断压力。若驱动支持动态中断调节,可根据实时包数、字节数动态调整触发频率,在吞吐和延迟之间取得平衡。

增大接收描述符 ​

RX 描述符是网卡接收数据的缓冲池。突发流量下,描述符不足会导致网卡无可用缓冲而丢包。

万兆场景建议:

  • RX 描述符可从 2048 或 4096 起步测试。
  • 增大描述符会占用更多 DMA 内存。
  • 如果 DMA 内存紧张,应避免盲目增大。

推荐调优流程 ​

  1. 建立基线:记录默认配置下 TCP/UDP 发送、接收吞吐、CPU 占用、丢包和重传。
  2. 发送优先优化:开启 TSO/GSO,增大 TCP 窗口,观察发送吞吐和网络线程 CPU。
  3. 接收优先优化:开启 xgro,调整聚合个数和接收窗口,观察接收吞吐和丢包。
  4. 缓冲与描述符优化:根据断流、丢包、重传情况调整缓冲区和 TX/RX 描述符。
  5. 中断策略优化:根据 CPU 占用和延迟要求调整中断聚合。
  6. 回归低延迟指标:吞吐优化后必须复测通信延迟,避免聚合和缓冲过大影响业务实时性。

验证指标 ​

建议至少记录以下指标:

指标工具/方法说明
TCP 吞吐iperf / 业务压测发送和接收分别测试
UDP 吞吐与丢包iperf -u / 业务压测关注丢包率和抖动
CPU 占用系统监控重点关注网络协议栈线程和网卡中断相关线程
重传iperf Retr 或抓包分析判断链路、时序和窗口是否合理
延迟ping、业务 RTT、硬件测量避免吞吐优化牺牲实时性

经验结论 ​

在万兆场景中,开启 TSO/GSO、启用 GRO、增大 TCP 窗口并合理配置描述符后,通常可以显著提升 TCP/UDP 吞吐,并降低网络协议栈线程 CPU 占用。核心原则是匹配 BDP、减少 CPU 介入,并让网卡硬件持续保持足够的数据供给。