GRO, GSO, and the Cost of SKB Coalescing on High-PPS Links
Generic Receive Offload (GRO) is critical for sustaining 10GbE+ throughput without saturating CPU cores in softirq handlers. By aggregating sequential TCP segments into single 64KB sk_buff structures, GRO minimizes the traversal cost through the IP and TCP stack layers.
Yet, when profiling packet delays for real-time telemetry flows sharing the same NIC, GRO introduce subtle latency penalties. An aggregated 64KB frame takes approximately 51 microseconds to serialize at 10Gbps, creating head-of-line blocking for subsequent packets in the ring buffer.
# Checking GRO status and flush stats
ethtool -k eth0 | grep generic-receive-offload
cat /proc/net/softnet_stat
By tuning gro_flush_timeout down to 20,000 ns on dedicated telemetry interfaces, we recovered a deterministic 99.9th percentile latency curve while preserving 94% of the CPU efficiency advantages gained from batching.