网络卸载技术
网络卸载(Offload)技术指的是在操作系统中将数据包的处理尽量向下层移动,避免 CPU 消耗大量的计算资源用于处理网络包。
网络卸载技术当前主要应用于三个层面:硬件层面、驱动层面和操作系统层面。
硬件层面
TSO / UFO
TSP 全称 (TCP 分段卸载技术, TCP Segmentation Offload);UFO 全称(UDP 分片卸载技术,UDP Fragmentation Offload)。
开启 TSO 能力后,OS 可将一个不超过 64K 字节(包含 TCP 头部)的任意大小的TCP报文传给网卡,由网卡执行TCP分段、Checksum 计算和包头、帧头生成以及封装等工作,这样就消除了 TCP 分段工作带给 CPU 的负担。被 TCP 分段后的每个 TCP Segment,都需要封装 TCP 头,TCP 头部中有 Checksum(校验和),因此TSO通常需要 Checksum Offload 支持,即由网卡同时完成TCP校验工作。
工作流程如图所示:
RSC
RSC 全称(接受侧合并技术,Receive Side Coalescing (RSC) or hardware LRO)。
RSC 允许网卡在接收同一个连接的数据包时,将多个数据包拼接为一个大的网络包(不超过64kb)再传递到操作系统进行处理。
RSC 工作流程如图所示:
网卡驱动层面
LRO/LSO
LRO 全称大段接收卸载技术, Large Receive Offload;LSO 全称大段分片卸载技术,Large Segment Offload。原理和上面硬件层面的技术类似,只不过这个发生在网卡驱动层面。
原理如图所示:
操作系统层面
GSO/GRO
GSO(Generic Segmentation Offload) 和 GRO(Generic Receive Offload),比 LSO 和 LRO 更通用。
网卡驱动在注册时会告诉 GSO/GRO 自身支持的能力。因此 GSO/GRO 能够自动选择是交给网卡进行包处理还是自身进行包处理。
在 Linux 环境下,可以通过 ethtool -K eth0 gso/gro off/on
进行 GSO/GRO 能力的开关。
流程如图所示:
实验
利用 iperf3 进行灌包测试。
未启用 TSO :
带宽:
数据包总量:
数据包分析:
启用 TSO:
带宽:
数据包总量:
数据包分析:
实验分析
根据实验结果可以发现,未 TSO 时,TCP 连接会根据协商的 MSS=1460
进行数据包构造,因此在系统网络栈中会构造大量的数据包;在启用了 TSO 之后,数据包的长度超过了协商的 MSS=1460
,最大数据长度来到的 64kb。
大包让操作系统不用去构造大量的数据包,减少了 CPU 在数据包构造上面的花销。因此会发现测试出来的带宽比未开启 TSO 时大了许多。
参考资料: