Appearance
通用网卡吞吐量优化方案
本文面向千兆、万兆及更高速率网卡的吞吐量优化,适用于 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 内存紧张,应避免盲目增大。
推荐调优流程
- 建立基线:记录默认配置下 TCP/UDP 发送、接收吞吐、CPU 占用、丢包和重传。
- 发送优先优化:开启 TSO/GSO,增大 TCP 窗口,观察发送吞吐和网络线程 CPU。
- 接收优先优化:开启 xgro,调整聚合个数和接收窗口,观察接收吞吐和丢包。
- 缓冲与描述符优化:根据断流、丢包、重传情况调整缓冲区和 TX/RX 描述符。
- 中断策略优化:根据 CPU 占用和延迟要求调整中断聚合。
- 回归低延迟指标:吞吐优化后必须复测通信延迟,避免聚合和缓冲过大影响业务实时性。
验证指标
建议至少记录以下指标:
| 指标 | 工具/方法 | 说明 |
|---|---|---|
| TCP 吞吐 | iperf / 业务压测 | 发送和接收分别测试 |
| UDP 吞吐与丢包 | iperf -u / 业务压测 | 关注丢包率和抖动 |
| CPU 占用 | 系统监控 | 重点关注网络协议栈线程和网卡中断相关线程 |
| 重传 | iperf Retr 或抓包分析 | 判断链路、时序和窗口是否合理 |
| 延迟 | ping、业务 RTT、硬件测量 | 避免吞吐优化牺牲实时性 |
经验结论
在万兆场景中,开启 TSO/GSO、启用 GRO、增大 TCP 窗口并合理配置描述符后,通常可以显著提升 TCP/UDP 吞吐,并降低网络协议栈线程 CPU 占用。核心原则是匹配 BDP、减少 CPU 介入,并让网卡硬件持续保持足够的数据供给。