1 传统网络卸载概述
大部分服务器都需要配置多个网络适配器端口以满足网络连通性。现在有越来越多的卸载技术,帮助CPU分担网络管理工作。
传统网络环境下,处理器需要处理诸如封装与卸载IP数据包、计算与检查校验和数值等网络任务。在拥有多个网络适配器的情况下,处理器会在这些任务上花费更多资源。卸载技术需要与操作系统相匹配,如Windows Server 2008 R2,可以把这类任务转交给网络适配器进行处理。
卸载技术主要包含了校验、分割、传输控制协议栈(TCP)和接收端缩放(RSS)。一旦管理员理解了现今可用的卸载功能,他们便可以选择特定的网络适配器来满足企业IT环境需求。
1.1 校验和卸载
校验和算法扫描TCP与用户数据报协议数据包以捕获错误。校验确保网络适配器收到数据包时进行验证。
活跃结点每天可能会交换百万甚至几十亿数据包。如果服务器处理器可以将卸载计算与校验和比对任务交给网络适配器完成,那么系统整体性能还是可以提升的。
选择支持IPv4与IPv6发送与接收时卸载校验和计算的网络适配器。用于安全通信的网络适配器同样可以无须占用服务器处理器资源,完成卸载加密校验和计算与验证工作。
1.2 分段卸载
数据在网络中按分段传输,每个包1,448字节,与TCP、IP和数据链路层报头匹配。传统情况下,处理器会准备分段数据并准备数据包。例如,移动某个65,536的字节块会需要处理器创建并发送最少46个数据包。
如果网络适配器来处理分段卸载,处理器可以将整个数据片段发给网络适配器。这技术通常被称做TCP分段卸载(TSO)或者大段卸载(LSO)。
1.3 TCP卸载
TCP卸载有个很有利的因素,就是将整个TCP栈转移到硬件上,这样可以把这些CPU计算资源归还给操作系统。实际上,这意味着将第三层(网络/IP)和第四层(传输/TCP)下降到网络适配器,可以利用适配器的TCP卸载引擎(TOE)处理多种数据组织和传输任务。
投资具备完全TOE功能的网络适配器,可见的回报在于当通过卸载可以释放先前占用不少的CPU资源。传统的千兆网网络适配器可能会消耗CPU约70%的处理能力,大量占用服务器应用程序所需资源。如iSCSI这类占用带宽的基于网络的存储,需要为其配置TOE适配器。
如果不需要完整的TOE功能,可以选择其他网络适配器,这些适配器可以灵活支持TOE的功能子集,如校验与卸载(TSO)或LRO。
1.4 接收端调节卸载
处理器需要花费时间来重组提取自单个数据包的数据,当需要处理多个网络端口和应用程序数据包时,单个处理器会比较繁忙。RSS会同时向多个物理处理器(不是内核)传递数据包,这样相同物理处理器只会处理来自相同TCP连接传来的数据包。处理器一直处理相同的数据流,会比重新接收与组合新的数据数据来得更容易也更快。
大多数情况下,文件服务器、Web服务器和数据库服务器都能受益于完整的卸载功能,包括校验和卸载、分段卸载、TOE和接收端调解。其他类型的服务器可以有选择的启用卸载功能。分段对于处理短信息的邮件服务器来说没有太大作用,而媒体服务器不需要分段,因为大部分服务器的经理都花在移动大数据上了。
2 普通网卡网络卸载技术详述
普通网卡用软件方式进行一系列TCP/IP相关操作,因此,会在三个方面增加服务器的负担,这三个方面是:数据复制、协议处理和中断处理。
2.1 发送方向
2.1.1 VLAN Tag的插入
VLAN虽然只有四个字节,却可以实现以太网的隔离。其基本使用方式机在以太网中报文中增加一个4字节的802.1q Tag,也称为VLAN Tag。VLAN Tag的插入和过滤剥离均可以通过网卡来完成。在发送方向,需要进行VLAN的插入操作。
2.1.2 LSO(large-segment-offload)
计算机网络上传输的数据基本单位是离散的网包,其大小的限制为MTU(Maximum Transmission Unit)的大小,一般是1518字节。比如我们想发送很多数据出去,经过os协议栈的时候,会自动帮你拆分成几个不超过MTU的网包。然而,这个拆分是比较费CPU计算资源的。把这些简单重复的操作 offload 到网卡上就是LSO。
在发送数据超过 MTU 限制的时候(太容易发生了),OS 只需要提交一次传输请求给网卡,网卡会自动的把数据拿过来,然后进行切片,并封包发出,发出的网包不超过 MTU 限制。
2.1.3 TSO(Tcp-segment-offload)/UFO(udp-fragmentation-offload)分片
对于从应用层获取的比较大的数据包,需要根据下层网络的报文大小限制,将其切分为较小的分片发送。TCP报文使用TSO,而UDP报文则使用UFO,都属于LSO的范畴。
TSO (TCP-Segmentation-Offload):将TCP分段工作交由网卡驱动执行,该特性需要网卡硬件支持。使能TSO后,操作系统可以将一个不超过64K字节(包含IP头长度和以太头长度在内)的任意大小的TCP报文传给网卡驱动,由网卡驱动层执行TCP分段、Checksum 计算和包头、帧头生成以及封装等工作,这样就消除了TCP分段工作带给CPU的负担。被TCP分段后的每个TCP Segment,都需要封装TCP头,TCP头部中有Checksum(校验和),因此TSO通常需要Checksum Offload支持,即由网卡驱动层同时完成TCP校验工作。
TSO off和GSO off:
TSO on:
UFO(UDP-Fragmentation-Offload):TSO针对TCP报文分段处理,UFO将对UDP报文进行IP分片的工作交由网卡驱动层处理。
2.1.4 GSO(generic-segmentation-offload)分片
相对于TSO和UFO,GSO是一种更通用的机制。其基本思想就是把数据分片的操作尽可能的向底层推迟直到数据发送给网卡驱动之前,并先检查网卡是否支持TSO或UFO机制,如果支持就直接把数据发送给网卡,否则的话就软件进行分片后再发送给网卡,以此来保证最少次数的协议栈处理,提高数据传输和处理的效率。
TSO Off and GSO on:
2.1.5 Checksum卸载
Checksum是用于校验目的的一组数据项的和,用于在远距离通信中保证数据的完整性和准确性。在Ethernet、IPV4、UDP、TCP、SCTP各个协议层中都有checksum字段。IPV6头部没有checksum字段,因此不需要进行checksum计算。在收发方向上,均需要对checksum进行支持。由于checksum需要整个报文参与计算,逐包计算对于CPU来说是个不小的开销。
在发送侧,需要计算计算协议的checksum,将其写入合适的位置。原理上,网卡在设计之初就需要依赖软件做额外设置,软件需要逐包提供发送侧的上下文状态描述符,这段描述符通过Pcie总线写入到网卡设备内,帮助网卡进行checksum计算。
2.2 接收方向
2.2.1 VLAN Tag的过滤(filtering)剥离(stripping)
在收包时,需要完成VLAN Tag的过滤和剥离操作。过滤的实现方式是设置VLAN过滤表,无法在过滤表中匹配的报文会被直接丢弃。VLAN Tag的剥离也是由网卡来完成的。此时网卡会在硬件描述符中设置两个域,包含此包是否曾被剥离了VLAN Tag,以及被剥离的VLAN Tag,并通知驱动软件。
2.2.2 LRO(large-receive-offload)/GRO(generic-receive-offload)
与LSO对应, 收方向上网卡会将接受到的多个数据包分片聚合成一个大的数据包,然后上传给协议栈处理。GRO对LRO有了一些改进,更加通用,目前主流的网卡所使用的都是GRO的offload。
LRO off and GRO off:
LRO on:
GRO on:
2.2.3 Checksum
在接收方向,通过设置端口配置,强制对所有达到的数据报文进行检测,即判断哪些包的checksum是错误的,对于出错的包可直接进行丢弃。
2.2.4 RSS(Receive-side-scaling)
RSS是网卡上一种用于将流量均匀分散到不同的队列上的技术。简而言之,就是首先在硬件上根据关键字进行哈希值的计算,再由哈希值确定队列。不同的数据包类型对应不同的数据包类型,如IPV4包对应四元组,使用者甚至可以修改包类型对应的关键字以满足不同的要求。
具备多个RSS队列的网卡,可以将不同的网络流分成不同的队列,再将这些队列分配到多个CPU核心上进行处理,从而将负荷分散,充分利用多核处理器的能力,提交数据接收的能力和效率。
2.2.5 Flow Director
Flow Director技术是Intel公司提出的根据包的精确字段匹配,将其分配到某个特定队列的技术。如果说RSS主要用来做负载均衡的话,Flow Director则是用来做精确的流导向。
Flow Director的工作方式为:网卡上存储了一张Flow Director的表,它记录了需要匹配关键字段的关键字以及匹配后的动作。驱动负责操作这张表。网卡收到数据包之后,根据关键字查询这张表,匹配后按照表项中的动作来进行处理。
参考链接
网卡offload功能介绍_hello_courage的博客-CSDN博客_offload
网卡收发包的offload总结_Clouds Early的博客-CSDN博客_offload和unload区别
网卡VXLAN的offload技术介绍_天马行空_xaut的博客-CSDN博客_offload
网络硬件卸载简介_虚拟化云计算技术的博客-CSDN博客_硬件卸载
网络适配器新功能之卸载技术-51CTO.COM
Smart NIC — TSO、GSO、LRO、GRO 卸载技术
Linux环境中的网络分段卸载技术GSO/TSO/UFO/LRO/GRO
《重识云原生系列》专题索引:
- 第一章——不谋全局不足以谋一域
- 第二章计算第1节——计算虚拟化技术总述
- 第三章云存储第1节——分布式云存储总述
- 第四章云网络第一节——云网络技术发展简述
- 第四章云网络4.2节——相关基础知识准备
- 第四章云网络4.3节——重要网络协议
- 第四章云网络4.3.1节——路由技术简述
- 第四章云网络4.3.2节——VLAN技术
- 第四章云网络4.3.3节——RIP协议
- 第四章云网络4.3.4节——OSPF协议
- 第四章云网络4.3.5节——EIGRP协议
- 第四章云网络4.3.6节——IS-IS协议
- 第四章云网络4.3.7节——BGP协议
- 第四章云网络4.3.7.2节——BGP协议概述
- 第四章云网络4.3.7.3节——BGP协议实现原理
- 第四章云网络4.3.7.4节——高级特性
- 第四章云网络4.3.7.5节——实操
- 第四章云网络4.3.7.6节——MP-BGP协议
- 第四章云网络4.3.8节——策略路由
- 第四章云网络4.3.9节——Graceful Restart(平滑重启)技术
- 第四章云网络4.3.10节——VXLAN技术
- 第四章云网络4.3.10.2节——VXLAN Overlay网络方案设计
- 第四章云网络4.3.10.3节——VXLAN隧道机制
- 第四章云网络4.3.10.4节——VXLAN报文转发过程
- 第四章云网络4.3.10.5节——VXlan组网架构
- 第四章云网络4.3.10.6节——VXLAN应用部署方案
- 第四章云网络4.4节——Spine-Leaf网络架构
- 第四章云网络4.5节——大二层网络
- 第四章云网络4.6节——Underlay 和 Overlay概念
- 第四章云网络4.7.1节——网络虚拟化与卸载加速技术的演进简述
- 第四章云网络4.7.2节——virtio网络半虚拟化简介
- 第四章云网络4.7.3节——Vhost-net方案
- 第四章云网络4.7.4节vhost-user方案——virtio的DPDK卸载方案
- 第四章云网络4.7.5节vDPA方案——virtio的半硬件虚拟化实现
- 第四章云网络4.7.6节——virtio-blk存储虚拟化方案
- 第四章云网络4.7.8节——SR-IOV方案
- 第四章云网络4.7.9节——NFV
- 第四章云网络4.8.1节——SDN总述
- 第四章云网络4.8.2.1节——OpenFlow概述
- 第四章云网络4.8.2.2节——OpenFlow协议详解
- 第四章云网络4.8.2.3节——OpenFlow运行机制
- 第四章云网络4.8.3.1节——Open vSwitch简介
- 第四章云网络4.8.3.2节——Open vSwitch工作原理详解
- 第四章云网络4.8.4节——OpenStack与SDN的集成
- 第四章云网络4.8.5节——OpenDayLight
- 第四章云网络4.8.6节——Dragonflow