TCP Segmentation Offload(TSO)是一种网络传输优化技术,旨在减轻CPU负担并提高网络性能。
1.为什么需要TSO
,Linux 内核传输层和网络层都要做大量的计算工作,具体见上图,这些计算都在服务器的主 CPU 中进行。这里有一些网络协议栈计算所需要的 CPU 资源的一些参考数据。大体上,发送或者接收 1 bit/s 的数据需要 1 赫兹的 CPU 处理能力,也就是说,5 Git/s (625 MB/s) 的网络流量大概需要 5 GHz 的 CPU 处理能力,相当于此时需要 2 个 2.5 Ghz 的多核处理器。因为以太网是单向的,发送和接收 10 Gbit/s (吞吐量就是 20 10 Gbit/s)时,大概需要 8 个 2.5 GHz 的 CPU 内核。
这些计算大概可以分为两类:(1)数据计算,比如校验和计算和验证、分包和组包等,这个和所处理的 packets 的数量有关(2)数据传输和上下文切换带来的 overhead,这个和传输和切换的次数有关。
为了解决问题,考虑到越来越多的物理网卡具有较强的处理能力,就出现了两个思路:
(1)如果网卡能够支持某些 Linux 内核协议栈所承担的计算任务,那么就可以将这些计算从协议栈 offload (卸载)到物理网卡。
(2)如果网卡不能支持这些计算,那么尽可能地将这些计算在 Linux 内核网络栈中延后(传输过程)和提前(接收过程)来减少 overhead。以 TCP 分组或者 IP 分片为例,延迟该过程,可以减少在网络栈中传输和处理的 packets 的数目,从而减少数据传输和上下文切换所需要的主 CPU 计算能力。
2.TSO原理
TCP Segmentation Offload(TSO)是一种网络传输优化技术,旨在减轻CPU负担并提高网络性能。其原理如下:
-
数据缓冲区填充:当应用程序通过套接字发送数据时,数据首先存储在操作系统内核的TCP发送缓冲区中。在传统情况下,内核需要逐个字节地读取这些数据,并将其分段成适当大小的TCP数据包,然后发送到网络适配器进行传输。
-
TCP Segmentation Offload(TSO):开启TSO后,TCP分段过程被移至网络适配器(网卡)上执行。这意味着操作系统内核不再需要执行TCP数据包的分段操作。相反,它会将应用程序的大块数据传递给网卡,并告知网卡应如何分段。网卡负责将大块数据切分成适当大小的TCP数据包,并在网络上传输。
-
大块数据传输:由于网卡可以直接操作大块数据,并将其切分成较小的TCP数据包,因此可以实现更高效的数据传输。较大的TCP数据包可以降低TCP头部的开销,并且在网络上传输时占用较少的带宽和系统资源。这有助于提高网络吞吐量和降低系统负载。
-
TCP校验和和IP首部校验和的计算:在分段过程中,网卡负责重新计算TCP数据包的校验和,并在必要时重新计算IP首部的校验和。这确保了数据在传输过程中的完整性和正确性。
总的来说,TCP Segmentation Offload(TSO)是一种利用网口硬件协助TCP大数据包分段分送的技术,通过将TCP分段过程从操作系统内核转移到网络适配器上,实现了数据传输的优化,减轻了CPU负担,提高了网络性能和系统吞吐量。
硬件分片逻辑如下:
硬件会根据前端virtio传来的头相关信息进行报文分段;标准的virtio头格式如下:
其中flags 用于告诉硬件TSO模块是否做ip以及tcp的checksum;
gso_typey用于告诉硬件TSO模块当前报文数据NONE/TCPV4/UDP /TCPV6;
hdr_len用于告诉硬件TSO模块该报文的报文头长度;
gso_size用于告诉硬件TSO模块需要切包的pyaload的长度,即MSS;
MTUMMS 的关系如下:
当前该实现不支持gso_ipv4/gso_ipv6的IP里面的option,支持tcp里面的option;
分片后的header中变化的域段只有IP length ,tcp_seqnum,以及checksum;
3.要实现tso,是需要以下支持的:
- 物理网卡支持。
- Linux 网卡驱动支持。可以使用 ethtool -K ethX tso on 命令打开网卡和驱动对 TSO 的支持,如果返回错误则表示不支持。
- 还需要 Net:TCP checksum offloading and Net:Scatter Gather 支持。
4.TSO 的开关命令:
临时关闭
# ethtool -K eth0 tso off
临时开启
# ethtool -K eth0 tso on
查看效果
#ethtool -k eth0
5.网络分段带来的问题
分段offloading 可能会带来潜在的问题,比如网络传输的延迟 latency,因为 packets 的大小的增加,大大增加了 driver queue 的容量(capacity)。比如说,系统一方面在使用大的 packet size 传输大量的数据,同时在运行许多的交换式应用(interactive application)。因为交互式应用会定时发送许多小的packet,这时候可能会应为这些小的 packets 被淹没在大的 packets 之中,需要等待较长的时间才能被处理,这可能会带来不可接受的延迟。
网络分段也无形增加了网卡的负担,在网络拥塞的情况下,这一问题可能会被放大,造成网络性能下降严重的问题。同时在虚拟化和容器网络环境下,因为虚拟网络和物流网卡的差异,有很多不可预知的问题;