searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

TCP Segmentation Offload原理

2024-04-26 03:03:38
446
0

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负担并提高网络性能。其原理如下:

  1. 数据缓冲区填充:当应用程序通过套接字发送数据时,数据首先存储在操作系统内核的TCP发送缓冲区中。在传统情况下,内核需要逐个字节地读取这些数据,并将其分段成适当大小的TCP数据包,然后发送到网络适配器进行传输。

  2. TCP Segmentation Offload(TSO):开启TSO后,TCP分段过程被移至网络适配器(网卡)上执行。这意味着操作系统内核不再需要执行TCP数据包的分段操作。相反,它会将应用程序的大块数据传递给网卡,并告知网卡应如何分段。网卡负责将大块数据切分成适当大小的TCP数据包,并在网络上传输。

  3. 大块数据传输:由于网卡可以直接操作大块数据,并将其切分成较小的TCP数据包,因此可以实现更高效的数据传输。较大的TCP数据包可以降低TCP头部的开销,并且在网络上传输时占用较少的带宽和系统资源。这有助于提高网络吞吐量和降低系统负载。

  4. 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 之中,需要等待较长的时间才能被处理,这可能会带来不可接受的延迟。

       网络分段也无形增加了网卡的负担,在网络拥塞的情况下,这一问题可能会被放大,造成网络性能下降严重的问题。同时在虚拟化和容器网络环境下,因为虚拟网络和物流网卡的差异,有很多不可预知的问题;

0条评论
0 / 1000
穆****飞
8文章数
0粉丝数
穆****飞
8 文章 | 0 粉丝
原创

TCP Segmentation Offload原理

2024-04-26 03:03:38
446
0

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负担并提高网络性能。其原理如下:

  1. 数据缓冲区填充:当应用程序通过套接字发送数据时,数据首先存储在操作系统内核的TCP发送缓冲区中。在传统情况下,内核需要逐个字节地读取这些数据,并将其分段成适当大小的TCP数据包,然后发送到网络适配器进行传输。

  2. TCP Segmentation Offload(TSO):开启TSO后,TCP分段过程被移至网络适配器(网卡)上执行。这意味着操作系统内核不再需要执行TCP数据包的分段操作。相反,它会将应用程序的大块数据传递给网卡,并告知网卡应如何分段。网卡负责将大块数据切分成适当大小的TCP数据包,并在网络上传输。

  3. 大块数据传输:由于网卡可以直接操作大块数据,并将其切分成较小的TCP数据包,因此可以实现更高效的数据传输。较大的TCP数据包可以降低TCP头部的开销,并且在网络上传输时占用较少的带宽和系统资源。这有助于提高网络吞吐量和降低系统负载。

  4. 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 之中,需要等待较长的时间才能被处理,这可能会带来不可接受的延迟。

       网络分段也无形增加了网卡的负担,在网络拥塞的情况下,这一问题可能会被放大,造成网络性能下降严重的问题。同时在虚拟化和容器网络环境下,因为虚拟网络和物流网卡的差异,有很多不可预知的问题;

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
1
0