3、硬件卸载基础:网卡硬件卸载能力概述、TSO/GRO/LRO/RSS概念
现代高速网络(10GbE/25GbE/40GbE+)中,CPU 已无法承受逐包中断与协议栈处理的巨大开销。硬件卸载(Hardware Offload)技术将部分 TCP/IP 处理任务从 CPU 转移到网卡硬件,是提升网络吞吐、降低延迟与 CPU 占用率的核心手段。本章系统梳理网卡硬件卸载能力全景,并深入解析 TSO、GRO、LRO、RSS 四大基础卸载机制。
3.1 网卡硬件卸载能力全景
网卡卸载能力可分为 发送卸载、接收卸载、流分发卸载 和 协议卸载 四大类。下表列出主流卸载特性及其作用层次:
| 分类 | 卸载特性 | 全称 | 作用层次 | 核心收益 |
|---|---|---|---|---|
| 发送卸载 | TSO | TCP Segmentation Offload | 传输层 → 链路层 | 减少 CPU 分段开销,提升大块发送吞吐 |
| 发送卸载 | GSO | Generic Segmentation Offload | 传输层 → 链路层 | 协议无关分段,兼容非 TCP 协议 |
| 发送卸载 | UFO | UDP Fragmentation Offload | 网络层 | 减少 UDP 大包分片 CPU 开销 |
| 接收卸载 | GRO | Generic Receive Offload | 链路层 → 传输层 | 合并小包为大包,减少协议栈处理次数 |
| 接收卸载 | LRO | Large Receive Offload | 链路层 → 传输层 | 硬件级大包合并,降低接收路径 CPU 负载 |
| 接收卸载 | RSC | Receive Segment Coalescing | 链路层 | Windows 等效 LRO,合并 TCP 分段 |
| 流分发卸载 | RSS | Receive Side Scaling | 网络层/传输层 | 多队列负载均衡,提升多核并行性 |
| 流分发卸载 | XPS | Transmit Packet Steering | 发送队列 | 发送端多队列绑定,减少锁竞争 |
| 协议卸载 | TCP Chimney | TCP Offload Engine | 全协议栈 | 完整 TCP 处理下沉到网卡,CPU 零拷贝 |
| 协议卸载 | RDMA | Remote Direct Memory Access | 传输层/应用层 | 内核旁路,极低延迟与零拷贝 |
3.2 TSO(TCP 分段卸载)
TSO 允许 TCP 层将最大 64KB(甚至更大)的数据段直接下发给网卡,由网卡硬件按 MSS(通常 1460 字节)完成 TCP 分段、IP 头部填充和校验和计算。CPU 只需处理一次协议栈入口和出口,大幅降低发送路径负载。
- 应用调用
send()写入大块数据(如 64KB)。 - TCP 层不执行分段,直接构造一个超级 SKB(sk_buff),设置 GSO 类型为 TCP。
- 网卡驱动识别 SKB 的 GSO 标记,将超级 SKB 送入硬件发送描述符。
- 网卡硬件按 MSS 切分、添加 TCP/IP 头部、计算校验和,逐段发送到线路。
- 接收端正常收到多个标准 TCP 分段,无需特殊处理。
TSO 的使能与关闭通过 ethtool 控制:
# 查看当前 TSO 状态
ethtool -k eth0 | grep tcp-segmentation-offload
# 开启 TSO
ethtool -K eth0 tso on
# 关闭 TSO(常用于排查分段相关丢包)
ethtool -K eth0 tso off
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 压缩问题。
- 网卡收到 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 在虚拟机热迁移或网络桥接场景下可能导致数据包丢失。
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 网络协议栈中的位置与协同关系:
3.7 卸载技术对比总结
| 特性 | TSO | GRO | LRO | RSS |
|---|---|---|---|---|
| 实现位置 | 网卡硬件 | 内核软件 | 网卡硬件 | 网卡硬件 |
| 作用方向 | 发送 | 接收 | 接收 | 接收 |
| 核心机制 | 大包分段 | 小包合并 | 小包合并 | 多队列分发 |
| 协议支持 | TCP | TCP/UDP/IPv4/IPv6 | TCP | TCP/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 —— 测试硬件极限,注意拥塞控制风险。