GSO自动检测网卡支持特性, 硬件不支持也可以使用GSO它更通用(TSO一定需要硬件支持)。...命令(ethtool -K eth0 tso|gso off|on)可打开或关闭网卡驱动的gso/tso特性: 1, 物理网卡不支持GSO时, 使用TSO时TCP分段在驱动处调用硬件做,不使用TSO时TCP...TSO与GSO的重要区别 1, TSO只有第一个分片有TCP头和IP头,接着的分段只有IP头。意味着第一个分段丢失,所有分段得重传。...所以GSO本身是对UFO的优化);如果硬件不支持,则在进入device driver queue之前由linux内核调用UDP GSO分片函数,然后再一直往下到网卡。...如果物理网卡不支持TSO将调用skb_gso_segment软件执行GSO。
速查: tso在网卡层面拆包,gro在网卡层面拼包 ethtool -k eth0 generic-receive-offload:ethtool -K eth0 gso on tcp-segmentation-offload...:ethtool -K eth0 tso on tcpdump -i eth0 -s 0 -w s3_s.cap port 3001 默认tso:on,gso:on,gro:on 1 mysql...off # ethtool -K eth0 gso on LRO 的核心在于:在接收路径上,将多个数据包聚合成一个大的数据包,然后传递给网络协议栈处理,但 LRO 的实现中存在一些瑕疵: 数据包合并可能会破坏一些状态...而 Linux 网络子系统的维护者 David S....参考 https://www.ibm.com/developerworks/cn/linux/l-cn-network-pt/index.html http://wsfdl.com/%E8%B8%A9%
TSO 是利用网卡来对大数据包进行自动分段,降低CPU负载的技术。 GSO 是协议栈分段功能。分段之前判断是否支持TSO,支持则推迟到网卡分段。 如果TSO开启,GSO会自动开启。...如果TSO开启,GSO会自动开启。 以下是TSO和GSO的组合关系: GSO开启, TSO开启:协议栈推迟分段,并直接传递大数据包到网卡,让网卡自动分段。...GSO开启, TSO关闭:协议栈推迟分段,在最后发送到网卡前才执行分段。 GSO关闭, TSO开启:同GSO开启, TSO开启。...开启GSO/TSO 驱动程序在注册网卡设备的时候默认开启GSO: NETIF_F_GSO 是否推迟分段 GSO/TSO是否开启是保存在 dev->features 中,而设备和路由关联,当我们查询到路由后就可以把配置保存在...需要注意的是,只要开启了GSO,即使硬件不支持TSO,也会设置NETIF_F_TSO,使得sk_can_gso(sk)在GSO开启或者TSO开启的时候都返回true。
利用网卡特性:Large Receive Offload (LRO),UDP Fragmentation Offload (UFO)和TCP Segmentation Offload (TSO)。...如图1所示,LRO将从物理链路收到的TCP包(如1500B)合并为长度更长的TCP包(如64KB);UFO和TSO将上层应用发送的长数据负载的UDP和TCP包(如64KB)拆分成长度更短的数据包(如1500B...然而,LRO、TSO和UFO通常只能处理TCP和UDP包,而且并非所有的网卡都支持这些特性。...LRO、UFO和TSO工作原理 为了帮助基于DPDK的应用程序(如Open vSwitch)减少包头处理开销,DPDK分别于17.08和17.11支持了GRO和GSO。...例如Linux GRO无法合并乱序的数据包。
以太网头和尾数据包含:2bit的以太网类型+6bit的DMAC+6bit的SMAC+4bit的FCS Offload涉及到四个概念:TSO、GSO、LRO、GRO。...其作用通过两个图来对比: TSO off和GSO off 状态数据包的发送过程: ? TSO on状态数据包的发送过程: ? 一个大的网络包直到进入网卡内部后才由网卡进行了分片。...GSO GSO(Generic Segmentation Offload)是延缓分片技术。它比 TSO 更通用,原因在于它不需要硬件的支持就可以进行分片。...其过程是:首先查询网卡是否支持TSO 功能,如果硬件支持TSO则使用网卡的硬件分片能力执行分片;如果网卡不支持 TSO 功能,则将分片的执行,延缓到了将数据推送到网卡的前一刻执行。...网卡关闭TSO时,GSO on状态数据包的发送过程: ? 一个大的网络包直到进入网卡前的最后一步才进行了分片。 TSO和GSO对应数据发送过程,对应数据接收过程的是LRO和GRO。
通用分段卸载 (GSO) - Generic Segmentation Offload使用 TCP 或 UDP 协议发送大数据包。...重新分段可以由 NIC 或 GSO 代码处理。使用 NIC 卸载卸载应该用在传输或接收大量数据的高速系统上,并且优先考虑吞吐量而不是延迟。...第四个(也是 Linux 中原生支持的最高级别)是 TSO。...这就是 LRO/TSO 的简单规则参考红帽网卡卸载: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html...网络硬件卸载: https://www.the-toffee-project.org/the-linux-channel/index.php?
这技术通常被称做TCP分段卸载(TSO)或者大段卸载(LSO)。...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 Off and GSO on: 2.1.5 Checksum卸载 Checksum是用于校验目的的一组数据项的和,用于在远距离通信中保证数据的完整性和准确性。...、GSO、LRO、GRO 卸载技术 Linux环境中的网络分段卸载技术GSO/TSO/UFO/LRO/GRO 《重识云原生系列》专题索引: 第一章——不谋全局不足以谋一域 第二章计算第1节——计算虚拟化技术总述
问题解决: 在分析问题前,先给出上述问题答案,在10.81.2.92中关闭抓包的网卡的tso和tx功能. ethtool -K eth0 tso off ethtool -K eth0 tx off...仅支持TCP; udp-fragmentation-offload(UFO):工作方式与tcp-fragmentation-offload类似; generic-segmentation-offload(GSO...):工作方式与TSO,UFO类似,但支持所有的网络协议。...接受方向的参数为generic-receive-offload(GRO);GSO/GRO和的TSO/LRO的使用参见这篇文档 rx-vlan-offload:移除接收到的vlan tag; tx-vlan-offload...:对出去的报文加上vlan tag; TIPS: 类似地,如果抓UDP报文显示校验和等异常时,可以通过ethtool临时关闭UDP offload功能 TSO,UFO,GSO等功能可以提高报文交互能力
TSO, GSO, UFO和GRO可能会导致驱动队列中数据的增加,因此为了提高吞吐量的延迟,可以关闭这些功能。...为了方式这种情况下导致创建和传输大量符合MTU要求的报文,Linux实现了TSO,USO和GSO,参见下面描述 In order to avoid the overhead associated with...segmentation offload (TSO), UDP fragmentation offload (UFO) and generic segmentation offload (GSO)....In the case of TSO and UFO, the NIC hardware takes responsibility for breaking the single large packet...For NICs without hardware support, GSO performs the same operation in software immediately before queueing
并无影响tcp-segmentation-offloadgeneric-segmentation-offloadgeneric-receive-offload关闭命令为ethtool -K ens192 tso...offethtool -K ens192 gso offethtool -K ens192 gro off打开命令为ethtool -K ens192 tso onethtool -K ens192...gso onethtool -K ens192 gro on
作者:Toshiaki Makita 讲述内容 背景 提升网络性能的基本技术 如何提升UDP性能 作者介绍 Toshiaki Makita NTT开源软件中心的Linux内核工程师 NTT集团公司的技术支持.../GSO/GRO 报文分割/聚合 减少报文在服务中的处理 适用于TCP 字节流(使用UDP隧道的TCP也可以) 不适用于UDP数据报(除了UFO,其他都依赖物理NICs) UDP...TSO/GSO用于发送报文时,将上层聚合的数据进行分割,分割为不大于MTU的报文;GRO在接受侧,将多个报文聚合为一个数据,上送给协议栈。总之就是将报文的处理下移到了网卡上,减少了网络栈的负担。...TSO/GSO等可以增加网络吞吐量,但有可能造成某些连接上的网络延迟。...Tx Qdisc锁(_raw_spin_lock)的消耗比较严重 没有竞争,但出现了很多原子操作 在Linux netdev社区中进行优化 更多热点2 ?
为了避免在传输路径上对大报文处理产生的开销,Linux内核实现了几类优化:TCP分段卸载(TSO),UDP分片卸载(USO)以及通用的分段卸载 (GSO)。...在TSO和UFO场景下,NIC硬件负责将单个大报文切分为可以在物理接口上传输的小报文。对于没有硬件支持的NIC,GSO会在报文进入驱动队列之前对其进行相同的操作。...回顾一下,驱动队列包含一个固定数目的描述符,每个描述符指向大小不同的报文,由于TSO, UFO 和GSO 允许更大长度的报文,因此这些优化会大大增加驱动队列中保存的字节数(即驱动中的描述符可能指向一个大于...如前面所述,当启用TSO, UFO 或 GSO时,驱动队列中的报文大小可以大于1500字节,这将导致延迟更加严重。...在学术、网络和Linux开发社区中,分组交换网络存在的延迟和吞吐量之间的关系是众所周知的。 Linux流量控制核心数据结构可以追溯到1990年代,并且一直在不断开发和扩展,并增加了新的调度器和功能。
Linux的进程相互之间有一定的关系。比如说,在Linux进程基础中,我们看到,每个进程都有父进程,而所有的进程以init进程为根,形成一个树状结构。...进程组会有一个进程组领导进程 (process group leader),领导进程的PID (PID见Linux进程基础)成为进程组的ID (process group ID, PGID),以识别进程组...从上面的结果,我们可以推测出如下关系: ? 图中箭头表示父进程通过fork和exec机制产生子进程。ps和cat都是bash的子进程。进程组的领导进程的PID成为进程组ID。领导进程可以先终结。...如今,图形化界面可以帮助我们解决这一需求,但工作组和会话机制依然在Linux的许多地方应用。
猜测二:设备buffer了报文 设备开启了TSO,GSO特性,能极大提升数据包处理效率。...带着这个猜想进行了如下验证: 1)关闭所有设备的高级功能(TSO,GSO,GRO,tx-nocache-copy,SG) 2)关闭容器内部delay ack功能(net.ipv4.tcp_no_delay_ack...但是有很多路径能到达这个函数,需要打印backtrace确定调用关系。...网卡的TSO,GSO特性原本设计是为了优化终端协议栈处理性能的,但是在容器网络场景,Node的身份到底是属于网关还是终端?
前言 上周Linux内核修复了4个CVE漏洞[1],其中的CVE-2019-11477感觉是一个很厉害的Dos漏洞,不过因为有其他事打断,所以进展的速度比较慢,这期间网上已经有相关的分析文章了。...所以本文将通过Linux内核源码对TCP的MSS机制进行详细分析。...tcp-flags RST RST -s 192.168.11.111 -j DROP 对于MSS的深入研究 关于该漏洞的细节,别的文章中已经分析过了,这里简单的提一下,该漏洞为uint16溢出: tcp_gso_segs...类型为uint16 tcp_set_skb_tso_segs: tcp_skb_pcount_set(skb, DIV_ROUND_UP(skb->len, mss_now)); skb->len的最大值为...随机进行源码审计,对发生溢出的函数tcp_set_skb_tso_segs进行回溯: tcp_set_skb_tso_segs <- tcp_fragment <- tso_fragment <- tcp_write_xmit
6. generic-segment-offload:当使用TSO和UFO时,一般都要打开此功能。TSO和UFO都是靠网卡硬件支持,而GSO在linux中大部分是在driver层通过软件实现。...对于转发设备来说,个人推荐不使能GSO。以前测试过,开启GSO会增大转发延时。 7. rx-vlan-offload:部署在vlan网络环境内,则启用。...而RSS可以解决这个问题,当工作线程处理socket的报文时,内核会记录这个报文是由某个CPU处理的,将这个映射关系保存到一个flow表中。...XPS RPS和RFS是用于建立接收队列与处理CPU的关系,而XPS不仅可以用于建立发送队列和处理CPU的关系,还可以建立接收队列与发送队列的关系。...early_demux开关 对linux内核比较熟悉的同学都知道,linux收到报文后,会通过查找路由表,来判断报文是发给本机还是转发的。
我们怀疑是否跟宿主机的某些TCP参数有关,比如TSO/GSO,一番测试后发现开启关闭TSO/GSO和修改内核参数对解决问题无效,但同时我们也观察到,从相同IDC里任选一台宿主机Ping有问题的宿主机,百分之几的概率看到很高的响应值...而这时DBA告诉我们,他们的某台物理机ServerB也有类似的的问题,Ping延迟很大,SSH上去后明显感觉到有卡顿,这无疑给我们解决问题带来了希望,但又更加迷惑: 1)延迟好像跟内核版本没有关系,3.10...尽管linux的CFS调度并非实时的调度,但在负载很低的情况下超过1s的调度延迟也是匪夷所思的。 ? 图10 ?.../kernel/git/stable/linux.git/commit/?...这时我们查看有问题的宿主机CPU信息,奇怪的事情发生了,如图15所示,12核的机器上possbile CPU居然是235个,而其中12-235个是offline状态,也就是说真正工作的只有12个,这么说好像还是跟延迟没有关系
作者:Hcamael@知道创宇 404 实验室 时间:2019 年 6 月 26 日 英文版本:https://paper.seebug.org/967/ 前言 上周Linux内核修复了4个CVE漏洞[...所以本文将通过Linux内核源码对TCP的MSS机制进行详细分析。 测试环境 1....tcp-flags RST RST -s 192.168.11.111 -j DROP 对于MSS的深入研究 关于该漏洞的细节,别的文章中已经分析过了,这里简单的提一下,该漏洞为uint16溢出: tcp_gso_segs...类型为uint16 tcp_set_skb_tso_segs: tcp_skb_pcount_set(skb, DIV_ROUND_UP(skb->len, mss_now)); skb->len的最大值为...随机进行源码审计,对发生溢出的函数tcp_set_skb_tso_segs进行回溯: tcp_set_skb_tso_segs <- tcp_fragment <- tso_fragment <- tcp_write_xmit
领取专属 10元无门槛券
手把手带您无忧上云