TCP Incast 问题TCP INCAST解决思路 应用场景:在集群文件系统内,客户端应用请求某个逻辑数据块(通常情况下一个读数据块大小是1MB),该数据块以条带化方式分别存储在几个存储服务器上,即采用更小的数据片存储(32KB,256KB等),这种小数据片称为服务器请求单元(SRU)。只有当客户端接收到所有的服务器返回的其所请求数据块的SRU后才继续发送出下一个数据块请求,即客户端同时向

TCP INCAST解决思路

应用场景:在集群文件系统内,客户端应用请求某个逻辑数据块(通常情况下一个读数据块大小是1MB),该数据块以条带化方式分别存储在几个存储服务器上,即采用更小的数据片存储(32KB,256KB等),这种小数据片称为服务器请求单元(SRU)。只有当客户端接收到所有的服务器返回的其所请求数据块的SRU后才继续发送出下一个数据块请求,即客户端同时向多个存储服务器发起并发TCP请求,且所有服务器同时向客户端发送SRU。

出现的问题

1)         这种多对一的服务器向客户端并发传输数据的模式,很容易造成与客户端相连接交换机端口的缓冲区溢出,从而导致丢包及随后的TCP重传。在丢包严重的情况下,TCP将经历一个最少持续200ms的超时期,这由TCP最小重传超时(RTOmin)确定。

2)         在并发传输过程中,当某个服务器发生了传输超时但其他服务器完成了传输,则客户端在接收到剩余SRU之前必须等待至少RTOmin,而等待期间客户端的链路很有可能处于完全空闲状态,这就导致在应用层的可见吞吐量与链路容量相比较显著下降且总的请求延迟将高于RTOmin。

切入角度:

深入研究瓶颈链路吞吐量下降甚至降为0,使得瓶颈链路处于完全空闲状态,带宽利用率极低的问题。

若不会发生TCP Incast问题,瓶颈链路的吞吐量会保持在一定范围内波动,带宽利用率也会较高。

当TCP Incast现象发生了,一旦多个SRU发生超时重传,其他完成数据传输的SRU必须等待其超时重传的SRU传输完成,客户端才可以发送下一个数据块请求。这样在成功发送完的SRU和正在等待超时的SRU交叠的时间块上,瓶颈链路的吞吐量降为0,带宽利用率同时也会降为0.

具体的例子:

假设一共有10个服务器请求单元:SRU1,SRU2…SRU9,SRU10;

其中SRU2,SRU3,SRU6发生超时重传,其他服务器请求单元要在完成传输后等待SRU2,SRU3,SRU6传输完成。而此时,SRU2,SRU3,SRU6正在等待超时。

处于这种情况下,7个成功发送数据的服务器正在等待3个未成功发送数据的服务器超时重传,这段时间内,瓶颈链路的吞吐量降为0,处于完全空闲状态,同时带宽利用率也为0。

根本原因分析:

1)         障碍同步机制(应用本身的问题,前提条件)

2)         我们发现瓶颈链路吞吐量下降为0的时间不仅仅和超时等待的RTO有关系。

²  若拥塞发生在7个成功发送数据的服务器之后,3个未成功发送数据的服务器将等待超时,此时,瓶颈链路将没有数据传输,吞吐量降为0,带宽利用率为0。Time(瓶颈链路吞吐量=0)> RTO;

²  若拥塞发生在7个成功发送数据的服务器之前,3个未成功发送数据的服务器即使在等待超时,瓶颈链路仍然有数据在传输,吞吐量不会降为0,带宽利用率也会保持在一定范围内。此时Time(瓶颈链路吞吐量=0)< RTO;

²  事实上,一个发送端超时了,有可能其他的发送端还在继续发送数据,此时瓶颈链路仍然有数据在发送。这样来说瓶颈链路的带宽利用率,吞吐量大小是由超时等待的时间长短(RTO)与未超时的流的传输时间共同决定的。

解决方法:

         一方面,我们减少超时等待的流的个数以延长处于障碍同步的流的个数,另一方面,我们减少超时等待的时延以使瓶颈链路吞吐量为0的时间进一步减少。

一方面增加成功的发送端的个数,拉长其传输时间以使瓶颈链路一直有数据在传输,不至于让吞吐量降为0。另一方面缩短未成功的发送端的超时等待时间RTO。

1)         减少超时重传的服务器个数(本质上丢包是无法避免的,丢包解决不了只能从快速重传,快速恢复来切入。但是有的情况下无法触发快速重传机制,只能等待超时。我们就是要减少这种情况的发生,将那些超时等待的情况转变为快速重传

超时的原因主要分为三个方面:数据块头部,数据块尾部,数据块重传丢失

数据块头部超时:

²  拥塞窗口值较小的流不幸丢掉了窗口所有的数据包,由于没有ACK 回来,所以只能等待超时重传。

数据块尾部超时:

²  块尾倒数三个数据包中的任何一个包丢失都会导致发送端超时。

数据块重传丢失

²  另一个重要的超时是重传的包丢失。当tcp的发送端通过监测发现了丢包,会立即快速重传丢失的包。然而如果重传的包再一次丢失。发送端就只能等待超时。

针对数据块头部超时,其实本质上慢启动过程中的不公平现象。当一个回合的传输开始时,所有的发送端进入慢启动阶段。在慢启动阶段拥赛窗口按指数级增长,由于发送端窗口增长的步伐并不是一致的,先启动窗口增长过程的发送端取得竞争带宽的优势,这种优势会随着指数级的窗口增长被逐渐放大,等到网络拥赛时,所有的发送端的窗口大小是层次不齐的。拥塞窗口值较小的流就有可能全部丢失,被迫超时重传。

所以我们要设计策略提高慢启动阶段的公平性。如果有一个集中的控制器,它知道所有流的占据的带宽值并据此调整他们的发送速率。交换机完全可以充当这个集中的控制器,当所有流经过交换机时,交换机计算所有流的平均窗口值AVG,通过ACK显示回馈给发送端。发送端统一将发送窗口调整为AVG大小来公平的分配带宽。

针对数据块尾部超时,本质上是由于没有足够的ACK触发快速重传。我们只要重传数据块尾部最后一个数据包,即能够产生足够的ACK触发快速重传,也不需要产生和处理新的数据包。

针对数据块重传丢失,这个问题我们可以选择概率性重传那些需要重传的包。减小这种情况的发生概率。

2)         动态调整RTO的值(根据拥塞程度)

时间: 2024-08-01 22:44:18

TCP Incast 问题TCP INCAST解决思路 应用场景:在集群文件系统内,客户端应用请求某个逻辑数据块(通常情况下一个读数据块大小是1MB),该数据块以条带化方式分别存储在几个存储服务器上,即采用更小的数据片存储(32KB,256KB等),这种小数据片称为服务器请求单元(SRU)。只有当客户端接收到所有的服务器返回的其所请求数据块的SRU后才继续发送出下一个数据块请求,即客户端同时向的相关文章

Apache mina 输出报文大小修改,解决用作http服务客户端接收到数据最大98304的限制

最近做的一个基于mina的application,用http服务里管理,http服务也是mina实现的,运行时发现,如果http返回的数据大于 98304,客户端将接收不完全折腾了2天,才发现mina每次发送的报文大小是98304,我没有找到多次发送的方法,也不确定多次发送会不会被客户端多次接收到,最后参考了一些资料后,想办法修改了这个大小,你首先要知道你要送的数据的总大小,我实现的方法是HttpResponseMessage里面增加一个总大小,在HttpResponseEncoder (Mes

TCP协议及TCP正常连接与断开

一.TCP协议简介TCP,全称Transfer Control Protocol,中文名为传输控制协议,它工作在OSI的传输层,提供面向连接的可靠传输服务.TCP的工作主要是建立连接,然后从应用层程序中接收数据并进行传输.TCP采用虚电路连接方式进行工作,在发送数据前它需要在发送方和接收方建立一个连接,数据在发送出去后,发送方会等待接收方给出一个确认性的应答,否则发送方将认为此数据丢失,并重新发送此数据.下面我们来介绍一下TCP的报头结构和相关工作原理:1.TCP报头TCP报头总长最小为20个字

跨域分析与解决思路

一.分析 跨越是浏览器对XMLHttpRequest(XHR)请求方式的限制.XHR讲解请参考: https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest 二.解决思路 1.浏览器方:禁止浏览器检查[启动浏览器时,设置参数 --disable-web-security --user-data-dir=g:\temp3 禁止浏览器对跨域的限制] 2.JSONP方式 未完待续................ 原文地址:https:

Linux服务器丢包故障的解决思路及引申的TCP/IP协议栈理论

我们使用Linux作为服务器操作系统时,为了达到高并发处理能力,充分利用机器性能,经常会进行一些内核参数的调整优化,但不合理的调整常常也会引起意想不到的其他问题,本文就一次Linux服务器丢包故障的处理过程,结合Linux内核参数说明和TCP/IP协议栈相关的理论,介绍一些常见的丢包故障定位方法和解决思路. 问题现象 本次故障的反馈现象是:从办公网访问公网服务器不稳定,服务器某些端口访问经常超时,但Ping测试显示客户端与服务器的链路始终是稳定低延迟的. 通过在服务器端抓包,发现还有几个特点:

TCP/IP之TCP交互数据流、成块数据流

建立在TCP协议上的网络协议有telnet,ssh,ftp,http等等.这些协议根据数据吞吐量来分成两大类: (1)交互数据类型,例如telnet,ssh,这种类型的协议在大多数情况下只是做小流量的数据交换,比如说按一下键盘,回显一些文字等等. 交互数据类型在通讯中比例为10%: (2)数据成块类型,例如ftp,这种类型的协议要求TCP能尽量的运载数据,把数据的吞吐量做到最大,并尽可能的提高效率.数据成块类型在通讯中比例为90%: 针对这两种情况,TCP给出了两种不同的策略来进行数据传输: 1

【oracle11g,18】存储结构:临时表,手工条带化,表/索引迁移表空间,删除表,外部表

一. 临时表 临时表放在临时表空间,不生成redo,只有undo. 在临时表中可以创建索引.视图及触发器,还可以使用"Export and Import(导出和导入)"或"Data Pump(数据泵)"导出和导入临时表的定义.但是,即使使用了ROWS 选项,也不会导出数据. 有基于事务(默认)和基于session两种,其他的会话不能访问到. 在临时表中,DML锁永远不需要. 1.创建默认的(基于事务的)临时表:(on commit delete rows:提交时清空

【oracle11g,18】存储结构:暂时表,手工条带化,表/索引迁移表空间,删除表,外部表

一. 暂时表 暂时表放在暂时表空间,不生成redo,仅仅有undo. 在暂时表中能够创建索引.视图及触发器,还能够使用"Export and Import(导出和导入)"或"Data Pump(数据泵)"导出和导入暂时表的定义.可是.即使使用了ROWS 选项,也不会导出数据. 有基于事务(默认)和基于session两种.其它的会话不能訪问到. 在暂时表中.DML锁永远不须要. 1.创建默认的(基于事务的)暂时表:(on commit delete rows:提交时清

TCP传输协议中如何解决丢包问题

TCP在不可靠的网络上实现可靠的传输,必然会有丢包.TCP是一个"流"协议,一个详细的包将会被TCP拆分为好几个包上传,也是将会把小的封裝成大的上传,这就是说TCP粘包和拆包难题. 但是许多人有不同的理解.TCP协议本身确保传输的数据不会丢失完整性.如果在传输过程中发现数据丢失或数据包丢失,最大的可能性是在发送或接收程序的过程中出现问题. 例如,服务器向客户端发送大量数据,并且发送频率非常高,因此发送链接中很可能会出现错误(1.程序处理逻辑错误:2.多线程同步问题:3.缓冲区溢出等)如

解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据

我们都知道,各种主流的社交应用或者阅读应用,基本都有列表类视图,并且都有滑到底部加载更多这一功能, 对应后端就是分页拉取数据.好处不言而喻,一般来说,这些数据项都是按时间倒序排列的,用户只关心最新的动态,而不关心几个月甚至几年前消息,所以后端返回给客户端的数据是不会一次性传递全部内容的(不仅耗费流量,而且还给服务器带来巨大压力). 举个例就说MySQL,它已经给我们提供了相应的语句来支持这一功能,那就是limit关键字.比如我要拉取一个消息表中用户id为1的前10条最新数据,SQL语句如下: s