【Linux 网络子系统深度拆解】分段卸载:GRO/GSO/TSO 的内核实现与陷阱
💡
原文中文,约19000字,阅读约需46分钟。
📝
内容提要
本文探讨了Linux内核中的GRO(通用接收卸载)和GSO(通用分段卸载)机制,旨在提高网络性能。GRO通过聚合多个小包减少协议栈遍历次数,而GSO则延迟将大包拆分为小包,从而降低CPU负担。文章分析了这两种机制的实现及其对网络性能的影响,强调理解这些机制对性能调优和故障排查的重要性。
🎯
关键要点
- GRO(通用接收卸载)通过聚合多个小包减少协议栈遍历次数,提升网络性能。
- GSO(通用分段卸载)延迟将大包拆分为小包,从而降低CPU负担。
- 理解GRO和GSO的实现对于性能调优和故障排查至关重要。
- GRO的核心数据结构是skb_shared_info,包含gso_size和gso_segs等字段。
- GRO在NAPI轮询阶段将同一流的多个小包聚合为一个大sk_buff。
- GSO的核心思想是尽可能晚地将大包拆分成小包,减少CPU开销。
- TSO(TCP分段卸载)是GSO的硬件加速版,允许网卡直接完成分段。
- LRO(大接收卸载)因其设计缺陷被废弃,GRO取而代之。
- 隧道设备的处理增加了GRO和GSO的复杂性,需要独立的处理机制。
- GRO和GSO对Netfilter和TC的行为有深远影响,可能导致性能问题。
❓
延伸问答
GRO和GSO的主要功能是什么?
GRO通过聚合多个小包减少协议栈遍历次数,提升网络性能;GSO则延迟将大包拆分为小包,从而降低CPU负担。
GRO的核心数据结构是什么?
GRO的核心数据结构是skb_shared_info,包含gso_size和gso_segs等字段。
GSO的工作机制是怎样的?
GSO的核心思想是尽可能晚地将大包拆分成小包,减少CPU开销,通常在dev_queue_xmit()的最后一步进行软件分段。
为什么LRO被废弃?
LRO因重写TCP/IP头部导致聚合后的包不合法,破坏了转发、Netfilter和桥接的处理,因此被废弃,GRO取而代之。
GRO和GSO对Netfilter的影响是什么?
GRO聚合发生在Netfilter之前,conntrack看到的是一个假包,可能导致性能问题;GSO则使得TC qdisc看到的是GSO大包,可能引发微突发。
如何优化GRO的性能?
可以通过调整gro_flush_timeout和napi_defer_hard_irqs等参数来优化GRO的性能,增加聚合率。
➡️