浅谈常见的网络加速技术
发布时间:2022-05-05作者:小编阅读:0
简介TCP/IP协议栈。
当用户需要向网络发送数据时,用户实际上是通过应用程序来完成这项工作的。应用程序将数据写入描述对端连接的文件描述符(Filedescription)。
之后,位于操作系统核心的TCP/IP协议栈从文件描述符中收到数据,完成TCP分段(如果是TCP连接),添加TCP、IP、Ethernetheader。添加这些Header时,还涉及一些内容的计算,如验证和序列号。
最后,由网卡驱动的操作系统核心通知网卡需要发送的数据。这里的数据长度合适,并包装了各种协议头的网络数据。网卡将添加一些其他数据,以确保传输的可靠性。最后,网络数据由网卡从网络电缆(如果是有线连接)发送,并通过各种网络转发设备发送到对端。
对端,也就是网络数据的接收端,有一个类似的过程,但方向是相反的。网卡从网线接收数据,通知系统内核获取数据。位于系统内核的TCP/IP协议栈完成验证,剥离TCP、IP、Ethernet头部,拼接数据。最后,将完整的数据传输给应用程序或最终用户。用户程序仍然通过文件描述符读取数据。
因此,网络传输在操作系统中的整个过程可分为三部分:
Userarea:应用程序发送和接收数据。
Kernelarea:TCP/IP协议栈和系统中检查用户数据的Devicearea:网卡实际发送并接收网络数据。
从前面的描述可以看出,Userarea和Devicearea的工作相对简单,复杂的网络协议主要在Kernelarea处理。Kernelarea的任何处理都需要CPU来完成。显然,单位时间传输的数据越多,CPU需要操作的数据就越多。
近年来,网络带宽有了很大的改进,以太网从最初的10M增加到现在的100G,增加了1万倍。虽然CPU近年来也有了很大的发展,但单核CPU的频率并没有增加那么多。有些人可能会说CPU核增加了很多,但网络数据流到多个CPU核心处理本身有一定的挑战,另一方面,计算机需要处理任务越来越复杂,特别是在虚拟化引入后,计算机不仅运行应用程序,还需要运行容器、虚拟机、CPU本身的负载可能非常重。
以太网速度的提高大于CPU计算速度的提高,减少了CPU处理单个网络包的时间。如果CPU不能及时处理网络数据,将不可避免地影响网络传输的延迟和吞吐量roughput)。因此,需要一些技术/方案来减少CPU处理单个网络包的时间。这系统中常见的网络加速技术。
DMA
DMA的全称是DirectMemoryAccess。DMA可以同时应用于网络数据的发送和接收。DMA本身就是一种独立于CPU的DMA控制器的通用技术。当数据复制时,CPU只需告诉DMA控制器复制数据的起始地址和长度,然后将总线控制权交给DMA控制器,即可完成数据复制,无需CPU的干预。
使用DMA,只需要很少的CPU介入网卡从内存复制数据(发送)和网卡到内存复制数据(接收)。
RSS
RSS的全称是ReceiveSideScaling。从名称上可以看出,这种加速技术只有在接收网络数据时才有效。具有RSS能力的网卡有多个接收队列。网卡可以通过不同的接收队列接收不同的网络流量,然后将这些队列分配到不同的CPU核,充分利用多核处理器的能力分散网络数据接收的负载,从而提高网络传输的效率。
虽然RSS可以更好地利用多核CPU,但一方面,网络数据的分发需要考虑TCP连接、NUMA等因素,这本身就更为复杂。另一方面,它增加了网络传输对CPU的影响,计算机本身有计算任务,不仅可以用来收集和发送网络数据。在实际使用中,RSS通常局限于有限的CPU核,以隔离网络传输的CPU影响。
NAPI
NAPI的全称是NewAPI,是Linux系统对网络接收的优化。硬件I/O和CPU之间的交互通常有两种方式:中断和轮询。中断的CPU成本高,但实时性好,不需要CPU一直值班。轮询需要CPU定期查询I/O,CPU一直值班,而不是真正的实时。对于网卡来说,一个繁忙的网络,如果每次网络数据包到达时都中断,频繁的中断会影响系统的整体效率。对于流量小的网络,如果使用轮询,一个是实时性差,会导致延迟(Latency)上升。另一方面,CPU需要始终值班,CPU效率低。
根据不同的场景,NAPI采用不同的方式作为CPU和网卡的交互方式。在大网络流量中,通过轮询读取网卡数据,在小网络流量中断,从而提高CPU的效率。
checksumofload。
许多网络协议,如IP、TCP和UDP,都有自己的验证和(checksum)。传统上,验证和计算(发送数据包)和验证(接收数据包)是通过CPU完成的。这对CPU有很大的影响,因为每个字节的验证和数据都参与了计算。对于一个100g带宽的网络,CPU最多需要每秒计算12g左右的数据。
为了减少这部分的影响,目前的网卡支持验证和计算验证。在包装网络数据包时,系统核心可以跳过验证和验证。网卡收到网络数据包后,根据网络协议的规则进行计算,然后将验证并填写到相应的位置。
由于checksumofload的存在,在使用tcpdump等抓取包分析工具时,有时会发现抓取的包提示校准和错误(checksumincorect)。tcpdump抓取的网络包是系统中发送给网卡的网络包。如果验证并放入网卡进行计算,tcpdump抓取包的时间、验证和未计算,自然会看到错误的值。
Scatter/Gather。
这种加速只能用于网络数据的发送。Scatter/Gather本身也是操作系统中的一种通用技术,也称为vectoradresing。简单地说,在数据传输过程中,数据读取器可以从多个离散的内存地址读取数据,而不需要从连续内存读取数据。例如,当系统内核收到应用程序传输的原始数据时,该数据可以保持不变。然后在另一个内存中计算各级协议的Header。最后,通知网卡驱动程序从这两个内存中复制数据。SG可以减少不必要的内存复制操作。
SG需要Checksumofload的支持,因为现在数据离散,系统内核不容易计算Checksum。
TSO
TSO全称是TCPSegmentationofload,只能用于网络数据的发送。从名称上看,这是一种与TCP协议密切相关的方法。
应用程序可以将任何长度数据传输给TCP。TCP位于传输层,不会直接将整个用户数据传输给下层协议。由于TCP本身是一种可靠的传输协议,而IP/Ethernet在下层协议中不可靠,因此下层协议在数据传输过程中可能会丢失数据。TCP不仅需要保证传输的可靠性,还需要尽可能提高传输的成功率,以保证效率。TCP的方法是将其整合到零并打破。
在开始后面的描述之前,先说两个相似且容易混淆的词。一个是Segmentation(分段),另一个是Fragmentation(分段)。TCP协议在将用户数据传输到IP层之前,会根据MSS(Maximumsention)将大段数据分成多个小段。这个过程是Segmention,分离出来的数据是Segments。由于MTU(Maximumtionsionsiontiontion)的限制,IP协议将上层传输的数据和超过MTU的数据分成多个分段。这个过程是Fragmention,分离出来的数据是Fragments。这两个过程都是大数据分成多个小数据,区别是一个在TCP(L4),一个在IP(L3)。
然后回来,如果TCP直接将整个数据传输给下层协议,假设是15000字节的用户数据,网卡的MTU是1500。考虑到Header,IP层将数据分为11个IPFragments在网络上传输。为了简单描述,我们假设它被分为10个IPFragments。假设每个IPpacket的传输成功率为90%,因为TCP协议有自己的验证和验证。在数据接收端,IP协议必须收集完整的15000字节用户数据,并拼接传输给TCP,才能成功接收数据。这样,一次传输成功的概率成功的概率为(90%)^10=34%。一旦TCP接收端未能收到数据,发送端需要重新发送整个15000字节。假设发送4次,即总共6000字节,传输成功率可提高到80%。
如果TCP协议本身将数据分为小段,并逐段传输?正如前面提到的,TCP根据MSS完成Segmentation,MSS通常根据MTU计算,以确保TCPSegment不需要在IP协议层进行Fragmentation。为了描述简单,我们仍然抛开网络协议的头部。现在TCP将应用层的15000字节数据分为10个Segments。每个Segment对应一个IPpacket,成功率仍然是90%。如果Segment发送失败,TCP只需重新传输当前的Segment,以前成功发送的TCPSegment不需要重新传输。这样,对于每个Segment,只要发送两次,成功率就可以达到99%。假设每个Segment发送两次,相应的应用层数据发送两次,即3万字节,传输成功率可达到(99%)^10=90%。也就是说,TCPSegmentation传输后,需要发送的数据量更少,成功率更高。当然,在实践中,由于TCPSegmentation,每个TCPSegment都会增加TCP头部,相应的传输数据会更多。
亿联云作为国内知名的云服务综合解决方案提供商,拥有包括数据中心专线、互联网专线、MPLS专线、云专线以及SD-WAN在内的多种产品,可为您提供专业、灵活、多样性的专线及SD-WAN组网解决方案,如有疑问,欢迎致电010-53390328详细咨询!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,请联系站长邮箱:shawn.lee@eliancloud.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
标题:浅谈常见的网络加速技术
TAG标签:网络传输
地址:https://www.elinkcloud.cn/article/20220505163545.html