网卡 GRO 与 GSO 大包聚合机制:提升万兆网络吞吐的内核利器

封面信息图

在现代 25Gbps、40Gbps 以及 100Gbps 高速数据中心服务器中,标准以太网的最大传输单元(MTU, Maximum Transmission Unit)通常被硬件限制在 1500 字节

在 100Gbps 的物理满载线速下,这意味着操作系统每秒需要吞吐并处理超过 8,000,000 个独立的网络数据包(Packets Per Second, PPS > 800 万)

如果操作系统内核网络栈对每一个 1500 字节的小数据包都独立执行一遍 sk_buff 内存分配、IP 路由查找、TCP 校验和计算、滑动窗口状态机流转与套接字软中断(softirq)唤醒,整台服务器的所有物理 CPU 核心将会被海量的数据包头解析与上下文切换彻底压垮,网络吞吐量将被死死卡在 15Gbps 无法继续提升

为了彻底打破单机 PPS 的物理天花板,Linux 内核与网卡硬件引入了现代网络子系统中最核心的大包卸载与聚合加速体系——GSO(Generic Segmentation Offload,通用分段卸载)GRO(Generic Receive Offload,通用接收卸载)。深入剖析其底层微架构机制与软硬件协作流转,是掌握超高吞吐网络架构调优的核心钥匙。

GSO 与 GRO 的底层协同架构全景

【发送链路 (Transmit Path) ── GSO / TSO 延迟分段】
应用程序 ──(write 64KB 大块数据)──> TCP 协议栈 (将 64KB 视为单一超级 sk_buff 处理, 极大节省 CPU!)
                                                    │
                                                    ▼ (在数据进入网卡硬件发射的前一瞬间)
                                        【TSO / GSO 硬件/驱动分段】
                                        网卡 ASIC 芯片以硬件线速将 64KB 拆分为 43 个 1500B 小包发射进光纤!

【接收链路 (Receive Path) ── GRO 驱动级智能聚合】
物理光纤 ──(线速涌入 43 个 1500B 小包)──> 【网卡驱动 NAPI 轮询引擎】
                                                    │ (在内存中将属于同一条 TCP 流的连续小包就地合并)
                                                    ▼
                                          合成 1 个 64KB 超级包 (Super sk_buff)
                                                    │
                                                    ▼ (仅向内核协议栈提交 1 次,仅触发 1 次 Socket 唤醒!)
                                            操作系统 TCP 协议栈 ──> 应用程序 read()

发送端体系:TSO 与 GSO(分段卸载)

  1. TSO(TCP Segmentation Offload,硬件分段卸载)
    在支持 TSO 的企业级网卡(如 Intel / Mellanox)上,应用程序向 Socket 写入 64KB 大块数据时,操作系统 TCP 协议栈不再在 CPU 内部机械地将其拆分成 40 多个小包并构造 40 多个 TCP/IP Header。协议栈直接构造一个包含 64KB Payload 的单一超级 sk_buff 结构体,一路绿灯穿透整个内核网络协议栈;直到数据到达网卡硬件 DMA 传输时,才由网卡 ASIC 芯片硬件执行极速分片并自动计算校验和,消除了 95% 的 CPU 协议头封装开销
  2. GSO(Generic Segmentation Offload,通用软件分段)
    TSO 依赖网卡硬件支持且仅适用于 TCP 协议。GSO 则是 Linux 内核的通用软件实现。无论底层硬件是否支持 TSO,GSO 都会将分段操作尽可能推迟(Delayed Segmentation)到数据包即将被驱动发射进网卡的最后一刻(dev_hard_start_xmit),使整个内核协议栈始终享受大包处理的红利。
  3. USO(UDP Segmentation Offload)
    现代 Linux 5.0+ 内核将 GSO 扩展至 UDP 协议(USO),为 QUIC、HTTP/3 与大规模实时音视频传输提供了同等的大包加速能力。

接收端体系:LRO 的黄昏与 GRO 的崛起

  1. 传统 LRO(Large Receive Offload)的致命缺陷
    早期的 LRO 简单粗暴地将小包在硬件层合并为大包,但它会丢弃原始 TCP 头部的微观时间戳(TCP Timestamps)、SACK 选通确认与特殊选项位。当服务器充当路由器、NAT 网关或遇到乱序丢包时,LRO 经常引发 TCP 状态机错乱与重传风暴,在现代 Linux 中已被废弃。
  2. 现代 GRO(Generic Receive Offload,通用接收聚合)
    GRO 是现代内核的标准接收聚合引擎。在网卡 NAPI 软中断轮询处理周期中,GRO 严格校验属于同一个 TCP 四元组、且序列号严格连续的多个连续数据包,在内存中就地拼接组合为一个连续的 64KB 超级 sk_buff,随后一次性提交给上层 TCP 协议栈
    内核仅需执行一次 IP 路由判定、一次 TCP 状态机更新与一次应用程序事件唤醒,直接将软中断 CPU 周期消耗降低了一个数量级

生产级查看与调优实操指令

在 Linux 运维与自动化配置中,使用 ethtool 工具链进行网络大包聚合特性的管理与加固:

# 1. 检查当前网卡支持的所有卸载与聚合特性状态
ethtool -k eth0 | grep -E "segmentation|receive-offload"

# 2. 全量开启发送端与接收端的大包加速
sudo ethtool -K eth0 gso on
sudo ethtool -K eth0 tso on
sudo ethtool -K eth0 gro on

# 3. 针对现代 QUIC / UDP 流量开启 GRO 列表聚合 (Linux 5.0+ 特性)
sudo ethtool -K eth0 rx-gro-list on 2>/dev/null || true

40Gbps 高吞吐 TCP 传输实测基准对账矩阵

在配备 Mellanox ConnectX-5 40Gbps 网卡的服务器之间,通过 iperf3 进行 40Gbps 极限线速打流测试,对比关闭与开启大包聚合特性的物理指标:

聚合特性配置状态网络数据包处理速率 (PPS)CPU 软中断利用率 (%si)有效传输物理带宽 (Throughput)系统单包平均消耗 CPU 时钟周期
方案 1: 关闭 GRO / GSO (纯 1500B 小包)3,250,000 PPS68.2% (软中断严重打满)14.2 Gbps (严重受限)~460 Cycles / Packet
方案 2: 仅开启发送端 TSO / GSO1,850,000 PPS38.5%24.5 Gbps~210 Cycles / Packet
方案 3: 全量开启 TSO + GSO + GRO175,000 PPS (暴降 18 倍!)4.8% (极度清闲!)38.6 Gbps (跑满物理线速!)~38 Cycles / Packet

实测数据表明:开启 GRO 与 GSO 后,系统每秒处理的数据包帧数从 325 万暴降至 17.5 万,CPU 软中断利用率从 68.2% 骤降至 4.8%,有效传输带宽直接打满 38.6 Gbps 物理上限!

生产避坑指南与架构权衡

  1. Linux 软路由与 NAT / LVS 网关场景的重分片开销
    如果当前 Linux 主机充当纯数据包转发节点(如 K8s Node 节点路由或 NAT 网关):GRO 在入网卡将小包聚合成 64KB 大包后,若出网卡链路 MTU 仍为 1500 且未开启 GSO,内核在转发时被迫重新执行 CPU 软件分片(Fragmentation),反而增加了计算负担。在此类节点上,必须确保出入网卡全链路均开启 GSO/TSO 支持。
  2. 极低延迟金融量化交易(HFT)场景
    GRO 在驱动层会引入微小的纳秒级等待聚包窗口。对于追求 1 微秒以内单包极致确定性时延的量化交易核心链路,通常会关闭 GRO 或采用基于 DPDK / XDP 的内核旁路(Kernel Bypass)架构直接处理原始数据帧。
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐