3、硬件卸载基础:网卡硬件卸载能力概述、TSO/GRO/LRO/RSS概念

现代高速网络(10GbE/25GbE/40GbE+)中,CPU 已无法承受逐包中断与协议栈处理的巨大开销。硬件卸载(Hardware Offload)技术将部分 TCP/IP 处理任务从 CPU 转移到网卡硬件,是提升网络吞吐、降低延迟与 CPU 占用率的核心手段。本章系统梳理网卡硬件卸载能力全景,并深入解析 TSO、GRO、LRO、RSS 四大基础卸载机制。

3.1 网卡硬件卸载能力全景

网卡卸载能力可分为 发送卸载、接收卸载、流分发卸载 和 协议卸载 四大类。下表列出主流卸载特性及其作用层次:

分类卸载特性全称作用层次核心收益
发送卸载TSOTCP Segmentation Offload传输层 → 链路层减少 CPU 分段开销,提升大块发送吞吐
发送卸载GSOGeneric Segmentation Offload传输层 → 链路层协议无关分段,兼容非 TCP 协议
发送卸载UFOUDP Fragmentation Offload网络层减少 UDP 大包分片 CPU 开销
接收卸载GROGeneric Receive Offload链路层 → 传输层合并小包为大包,减少协议栈处理次数
接收卸载LROLarge Receive Offload链路层 → 传输层硬件级大包合并,降低接收路径 CPU 负载
接收卸载RSCReceive Segment Coalescing链路层Windows 等效 LRO,合并 TCP 分段
流分发卸载RSSReceive Side Scaling网络层/传输层多队列负载均衡,提升多核并行性
流分发卸载XPSTransmit Packet Steering发送队列发送端多队列绑定,减少锁竞争
协议卸载TCP ChimneyTCP Offload Engine全协议栈完整 TCP 处理下沉到网卡,CPU 零拷贝
协议卸载RDMARemote Direct Memory Access传输层/应用层内核旁路,极低延迟与零拷贝
选型提示: 在通用云原生场景中,TSO/GRO/RSS 是性价比最高的卸载组合;RDMA 和 TCP Chimney 需要特定硬件与应用适配,通常用于高性能计算(HPC)和存储网络。

3.2 TSO(TCP 分段卸载)

TSO 允许 TCP 层将最大 64KB(甚至更大)的数据段直接下发给网卡,由网卡硬件按 MSS(通常 1460 字节)完成 TCP 分段、IP 头部填充和校验和计算。CPU 只需处理一次协议栈入口和出口,大幅降低发送路径负载。

TSO 工作流程(发送路径):
  1. 应用调用 send() 写入大块数据(如 64KB)。
  2. TCP 层不执行分段,直接构造一个超级 SKB(sk_buff),设置 GSO 类型为 TCP。
  3. 网卡驱动识别 SKB 的 GSO 标记,将超级 SKB 送入硬件发送描述符。
  4. 网卡硬件按 MSS 切分、添加 TCP/IP 头部、计算校验和,逐段发送到线路。
  5. 接收端正常收到多个标准 TCP 分段,无需特殊处理。

TSO 的使能与关闭通过 ethtool 控制:

# 查看当前 TSO 状态
ethtool -k eth0 | grep tcp-segmentation-offload

# 开启 TSO
ethtool -K eth0 tso on

# 关闭 TSO(常用于排查分段相关丢包)
ethtool -K eth0 tso off
注意: TSO 依赖硬件校验和卸载(tx-checksumming)。如果关闭校验和卸载,TSO 也会自动失效。排查性能问题时,建议先确认 tx-checksum-ip-generic 和 tx-checksum-tcp 均为 on。

3.3 GRO(通用接收卸载)

GRO 是 Linux 内核在接收路径实现的软件合并机制,将多个连续到达的 TCP/UDP 小包合并为一个超级 SKB,再交给协议栈上层处理。合并条件包括:相同的 IP 五元组、相同的 TCP 标志(如 PSH/ACK)、连续序列号、时间窗口内到达。

GRO 与 LRO 的核心区别在于:GRO 是内核软件实现,协议感知更强(支持 TCP/UDP/IPv4/IPv6),且不会破坏 TCP 拥塞控制;LRO 是硬件实现,合并策略更激进,可能引入 ACK 压缩问题。

GRO 合并效果示例(接收路径):
  • 网卡收到 10 个 1460 字节的 TCP 数据段。
  • GRO 模块检查五元组与序列号连续性,将 10 个段合并为一个 14600 字节的超级 SKB。
  • 协议栈只处理一次 TCP 接收,减少 9 次不必要的协议栈遍历。
  • 应用层通过一次 recv() 即可读取全部数据。

GRO 的配置与监控:

# 查看 GRO 状态
ethtool -k eth0 | grep generic-receive-offload

# 开启 GRO
ethtool -K eth0 gro on

# 关闭 GRO(用于测试或兼容老旧驱动)
ethtool -K eth0 gro off

# 查看 GRO 合并统计(需要内核支持)
cat /sys/class/net/eth0/statistics/gro_packets
cat /sys/class/net/eth0/statistics/gro_dropped

3.4 LRO(大接收卸载)

LRO 是网卡硬件直接完成的接收合并技术。网卡在 DMA 写入内存前,将多个 TCP 分段合并为一个大的接收缓冲区,减少 PCIe 传输次数和中断数量。LRO 通常由网卡固件或专用 ASIC 实现,对 CPU 完全透明。

LRO 的主要风险:

  • ACK 压缩: 合并后的超级包只携带一个 ACK 序号,可能掩盖接收端真实的 ACK 频率,导致发送端拥塞控制误判。
  • 协议兼容性: 某些 LRO 实现无法正确处理 TCP 时间戳选项或 SACK 块,可能触发接收端乱序重传。
  • 虚拟化场景: LRO 在虚拟机热迁移或网络桥接场景下可能导致数据包丢失。
推荐实践: 在 Linux 通用服务器上,优先使用 GRO 而非 LRO。GRO 提供与 LRO 相近的 CPU 节省效果,但协议兼容性和拥塞控制友好度显著更优。如果网卡同时支持 LRO 和 GRO,建议关闭 LRO,仅启用 GRO。

LRO 的配置:

# 查看 LRO 状态(部分网卡驱动使用 lro 或 large-receive-offload)
ethtool -k eth0 | grep large-receive-offload

# 关闭 LRO(推荐)
ethtool -K eth0 lro off

3.5 RSS(接收端缩放)

RSS 是网卡多队列技术的核心,它通过哈希函数将入站数据流分散到多个接收队列,每个队列绑定独立的 CPU 核心,实现接收路径的并行处理。哈希输入通常为 IP 五元组(源 IP、目的 IP、源端口、目的端口、协议号),确保同一 TCP 连接的所有数据包始终路由到同一个队列和 CPU。

RSS 的关键参数:

参数说明典型值
队列数(queues)网卡支持的接收队列数量4/8/16/32(取决于网卡型号)
哈希类型决定哪些字段参与哈希计算IPv4/TCP、IPv4/UDP、IPv6/TCP
哈希密钥(key)用于计算哈希值的对称密钥40 字节随机数
间接表(indirection table)哈希值到队列号的映射表大小通常为 128 或 512 条目

RSS 的配置与调优:

# 查看 RSS 队列数
ethtool -l eth0

# 设置 RSS 队列数(需要驱动支持)
ethtool -L eth0 combined 8

# 查看 RSS 哈希配置
ethtool -x eth0

# 设置 RSS 哈希密钥(自定义)
ethtool -X eth0 hkey 00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99:aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77

# 设置 RSS 哈希类型(仅对 TCP/IPv4 做哈希)
ethtool -N eth0 rx-flow-hash tcp4 sdfn
调优要点:
  • RSS 队列数不应超过 CPU 物理核心数,否则产生无谓的上下文切换。
  • 哈希密钥应随机生成,避免对称哈希导致队列负载不均。
  • 使用 irqbalance 或手动绑定中断亲和性,确保每个队列的中断处理程序运行在对应 CPU 上。
  • 监控 /proc/interrupts 中各队列的中断分布,验证负载均衡效果。

3.6 卸载技术协同关系图

下图展示 TSO、GRO、RSS 在 Linux 网络协议栈中的位置与协同关系:

TSO/GRO/RSS 在协议栈中的协同关系 TSO / GRO / RSS 在协议栈中的协同关系 应用层(Socket / send / recv) 传输层(TCP/UDP) TSO 分段卸载 网络层(IP / 路由 / Netfilter) 链路层发送(GSO/TSO 驱动) 链路层接收(GRO/LRO 合并) 网卡硬件发送 硬件 TCP 分段 + 校验和 网卡硬件接收 RSS 哈希分发 + 多队列 DMA RSS 多队列分发 物理介质(以太网 / 光纤 / 背板) 应用层 传输层 网络层 发送路径 接收路径 网卡硬件 卸载标注

3.7 卸载技术对比总结

特性TSOGROLRORSS
实现位置网卡硬件内核软件网卡硬件网卡硬件
作用方向发送接收接收接收
核心机制大包分段小包合并小包合并多队列分发
协议支持TCPTCP/UDP/IPv4/IPv6TCPTCP/UDP/IPv4/IPv6
CPU 节省高(发送路径)高(接收路径)高(接收路径)中(中断均衡)
拥塞控制影响无无有(ACK 压缩)无
虚拟化兼容好好差好
推荐配置默认开启默认开启关闭按 CPU 核数配置
性能测试基线建议: 在对比测试中,建议设置以下三组基线:
1. 全卸载关闭: tso off gro off lro off rss 1 queue —— 模拟纯软件协议栈。
2. 标准卸载: tso on gro on lro off rss N queues —— 生产推荐配置。
3. 激进卸载: tso on gro on lro on rss N queues —— 测试硬件极限,注意拥塞控制风险。