【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的性能,增加聚合率。

➡️

继续阅读