在上一篇文章中,我们了解了一些网络加速技术。它们致力于减少处理每个网络数据包所需的 CPU 时间,要么通过将某些网络协议操作卸载()到网卡上,要么通过减少数据复制对 CPU 资源的影响。消耗。在上一篇文章中,我们说过网络加速要解决的核心问题是CPU能够用来处理每个网络数据包的时间变得更短。由于带宽增长速度快于CPU处理速度,因此相同的CPU时间需要处理更多的网络数据包。如果换个思路:减少网络数据包的数量,那么在相同的CPU时间下,需要处理的网络数据包就更少了,分配给每个网络数据包的时间就更多了。这次我们来看看一些相关的技术。
以太网提出时,是基于1500字节MTU(Unit)来设计的,即最大(数据段)为1500字节。为什么是 1500 字节?这是效率和可靠性之间的折衷。因为单个数据包越长,效率越高,但相应的丢包概率也越大。反过来,单个数据包越小,效率就越低,因为有效数据占整个网络数据的比例越低,但相应的丢包概率也越小。因此,.3规定以太网的MTU为1500。
网络传输时,MTU必须匹配,向本机发送数据才不会出现问题。但反过来,当向你的机器发送数据时,由于数据太长,你的机器无法识别,就会丢包。因此网络数据发送端和接收端的MTU必须匹配。另一方面,互联网在几十年前就开始建设了。为了统一标准,增加兼容性,整个互联网按照.3的规定进行建设。
但现在的网络设备的可靠性已经大大提高,可以稳定传输更大的网络数据包。 MTU 为 9000 字节。对于每个网络数据包来说,有效数据所占的比例较多,因为网络协议的报头长度是固定的,网络数据包的长度只能说明有效数据较多。另一方面,以10G网络为例,要求CPU每秒处理80万个以上的网络数据包,而CPU每秒只需要处理14万个网络数据包。因此,CPU单位时间内需要处理的网络数据包较少,从而为CPU留下更多的时间来处理每个网络数据包。
需要相应的硬件支持。最新的硬件基本都支持,只需要简单的配置。但在实际使用中存在一定的局限性。因为在提出的时候,互联网已经按照要求搭建起来了,MTU必须匹配,所以想要对整个网络进行改造基本上是不可能的。因此,一般只用于数据中心内部网络,例如内部存储网络。连接的MTU一般设置为1500。
地球同步轨道
GSO的全称是GSO,仅在发送网络数据时有效。 GSO 的作者 Xu 说:“如果我们不能使用 MTU,我们可以选择次优的:我们就是 MTU。”有点像,现在我吃不了烤鸡,那老板就给我两片素鸡。 ,这总比没有好。由于是基于MTU 1500构建的,因此在上传输的网络数据包必须遵守MTU 1500。如果在操作系统中尽可能晚地进行IP,那么TCP/IP协议栈中就会有一条“路径”其中 data是超过1500字节的网络数据包,相当于传输MTU较大的网络数据。在这条“路径”上,CPU需要处理的网络数据包较少,相应地CPU就有更多的时间来处理每个网络包。
其实上一篇文章介绍的TSO也有这个想法。从用户程序到网卡,从来不进行TCP和IP,最大数据包可以到64K。但TSO仅支持TCP协议,需要硬件网卡的支持,而GSO则针对其他场合提出。其实严格来说,除了TCP之外,其他网络数据从大包到小包的转换都是发生在IP层的,所以属于IP,所以这里调用GS()O并不是100%合适。
由于它不依赖于硬件,并且需要尽可能晚地进行分段或分片,因此GSO选择在将大数据包发送到网卡驱动程序之前将其分成多个小数据包。这样,虽然网卡仍然收到多个小网络数据包,但TCP/IP协议栈中仍然有一条路径,如下图所示,CPU需要处理少量的大数据包。
因为它是在发送到网卡驱动程序之前完成的,所以 GSO 可以用作 TSO 的备份。向网卡驱动发送报文时,检查网卡是否支持TSO。如果是,则将大数据包直接传递给网卡驱动程序。如果不支持,请重试 GSO。
根据文档,使用 GSO 可以将网络吞吐量 () 提高 17.5%。
月球勘测轨道飞行器
LRO的全称是,或者也称为RSC(Side)。从名字可以看出,只有在接收网络数据时才有效。 LRO是TSO的逆向实现,意思是网卡将同一个TCP连接的TCP合并成一个大的TCP数据包,然后传输给操作系统。这样就避免了操作系统处理和合并多个小数据包,减少了CPU的计算时间,并且在TCP/IP协议栈中,CPU需要处理的网络数据包更少。与TSO一样,LRO也需要网卡的支持。
但与 TSO 不同的是,LRO 并不那么容易使用。由于TSO发生在数据的发送方,因此发送方拥有网络数据的所有信息,发送方可以根据自己的判断来控制发送过程。 LRO发生在数据的接收端,相对于数据发送端来说是异步接收。因此LRO只能根据目前获得的有限数据和信息进行合并,存在一定的困难。就好像把一个东西拆开很容易,但再装回去却很难。
LRO可能会丢失重要数据,例如数据发送方添加一些字段来区分不同的网络数据包。合并可能会导致这些字段丢失,因为合并后就只剩下一个了。并且当操作系统需要转发数据时,合并后的网络数据包可能需要重新分段/拼凑。当它被重新分成小包时,里面原来的差异字段就完全丢失了。由于LRO的限制,LRO在一些最新的网卡上已被删除。
格罗
GRO的全称是GSO,与接收端的GSO相对应。 GRO和GSO的作者是同一个人,都是徐。与GSO替代TSO不同,GRO逐渐取代LRO。由于GRO运行在系统内核中,拥有更多的信息,因此GRO可以使用更严格的规则来合并网络数据包。由于合并更加严格,可以避免关键信息丢失。另一方面,在某些需要转发的情况下,GRO可以使用GSO代码进行重新分段。
其他优点包括 GRO 的用途也更加广泛。它不仅不依赖硬件设备,而且支持TCP以外的协议。
飞碟
UFO的全称是UDP。从名字就可以看出,这是对UDP的优化。但与 TCP 不同的是,UDP 没有进程。无论用户程序向UDP发送多长(当然必须控制在64K以内),UDP都会将其传输到IP层。 IP 层将基于 MTU 进行。 UFO使网络设备(例如网卡)能够将极长的UDP数据段(超过MTU)分割成多个IPv4片段()。因为是在网卡上完成的,所以节省了CPU的计算负载。
然而,在最新的内核中,UFO 已被弃用。因为除了TSO之外,其他的基本都是在IP层完成的,所以UFO没有必要单独存在,所以和GSO合并了。
TX--
例如,互联网现在被用于越来越多的应用中。该网络允许用户创建、配置和管理所需的虚拟网络连接,而不受物理网络的限制。同时,多个租户可以共享物理网络,提高网络利用率。网络的类型有很多种,但最具代表性的是。它是UDP设计的MAC,具体格式如下。
从格式可以看出, 所代表的网络性能存在两个问题。一种是在原来的基础上再增加一层+IP+UDP+,这样每层比原来多传输50个字节。因此,可以预见,网络的效率一定会低于网络的效率。还有一个问题比传输50个字节更严重,那就是需要处理多余的50个字节。这50个字节包括4个,每个都涉及到复制和计算,需要消耗CPU。我们现在紧迫的问题是CPU处理每个网络数据包的时间更少。
首先,这50个字节是不可避免的。其次,这只能减少其影响。这里仍然可以采用这个思路,因为50字节是固定的,网络数据包越大,50字节的影响就越小。
我们先看一下虚拟机的网络连接图。虚拟机通过QEMU连接到位于主机上的TAP设备,然后通过虚拟机交换机传输到VTEP(),进行格式封装,发送到主机网卡。
理想的情况是大块数据直接传输到网卡,由网卡完成剩下的分片、切分、分割后的小网络数据包的封装以及校验和的计算。这样可以将对虚拟机网络的影响降到最低。实际上,这是可能的,但需要一系列先决条件。
首先,虚拟机需要向主机发送大的网络数据包。由于虚拟机也运行操作系统,并且有自己的TCP/IP协议栈,因此虚拟机完全有能力自行将大网络数据包分割成多个小网络数据包。从前面介绍的来看,真正能够向网卡发送大网络数据包的只有TSO。当GSO发送到网卡时,在进入驱动程序之前,它已经将大网络数据包分成了几个小网络数据包。那么这里就有要求:虚拟机的网卡支持TSO(默认支持),并且TSO开启(默认启用),虚拟机发送TCP数据。
然后经过QEMU、虚拟交换机转发、VTEP封装,就把这个大的TCP数据封装成一种格式。 50字节的数据被添加到这个大的TCP数据中。接下来就是问题了。这本来是 TCP 数据,但由于封装,现在看起来像 UDP 数据。如果操作系统不做任何处理,根据前面的介绍,那么GSO应该用于IP,分成多个小数据包,然后发送到网卡。这样,如果网卡原本支持TSO,现在就不能使用了。而且更严重的是TCP还没有实现。 TCP,我们在上一篇文章中花了很多时间介绍它的必要性,在这里也丢失了。
对于现代网卡来说,除了TSO、GSO等选项外,还多了一个选项tx--。如果打开这个选项,操作系统就会识别出封装的UDP数据是一个数据,操作系统会直接把这一大块数据丢给网卡处理。在网卡中,网卡会对内部的TCP数据完成TCP。然后给每个TCP加上封装(50字节),如下图右侧所示。这样,封装对虚拟机网络的影响就降到了最低。
从前面的描述来看,要达到上述效果,主机网卡需要同时支持TSO和tx--。如果这两个都不支持或者都不支持。然后系统内核会调用GSO将一大段TCP数据封装成某种格式,在发送给网卡驱动之前完成TCP,并为每个TCP添加封装。如下图左侧所示。
如果虚拟机中的TSO关闭,或者虚拟机中发送UDP数据。然后在虚拟机的TCP/IP协议栈调用GSO并发送给虚拟机网卡驱动之前就完成了切分和分片。虚拟机最终发送给QEMU的网络数据包是多个小网络数据包。此时,无论主机如何配置,都需要处理多个小网络数据包并对其进行封装。
总结
零碎说了这么多,这些网络加速技术一般不需要用户去配置。因为如果支持的话,就会默认开启。使用时,您只需确认您的系统是否具备这些功能即可。或者,在调试一些问题时,看看是否是这些功能引起的,如果是,手动将其关闭。
原文链接: