GPDB-内核特性-gp_interconnect_fc_method参数

GPDB-内核特性-gp_interconnect_fc_method参数

gp_interconnect_fc_method参数控制使用哪种流量控制方式:capacity根据接收方窗口来控制发送;loss(默认)根据丢包情况控制发送速度。Loss是基于capacity,还会根据丢包情况调整发送速度。那么针对这个参数怎么解根据接收方窗口来控制发送呢?

1、接收端主线程

c5a271df3c3f6aabecdd072fc737bd1c.png

接收端主线程通过processIncomingChunks函数从接收队列中拿数据包构建tuple链表。如上图所示,prepareRxConnForRead中,可以看到从conn->pkt_q[]队列的头conn->pkt_q_head拿一个ICBuffer。然后通过RecvTupleChunk函数从ICBuffer中构建chunk链表chunkSorterEntry->chunk_list中并组装到chunkSorterEntry->ready_tuples。此时,该ICBuffer就可以释放掉了。

通过MlPutRxBufferIFC函数释放:可以在上图蓝框中看到其流程,会将该包的seq作为ack的extraSeq,当前已接收最大包的seq:conn->conn_info.seq-1作为ack的seq发送给发送端(setAckSendParam设置ack,sendAckWithParam发送ack)。

2、发送端

ecbbdce92e33d936d8aeb07fa1228568.png

发送端发送函数SendChunkUDPIFC,先通过sendBuffers进行发送。可以看到当conn->capacity大于0时才能发送。该值在SetupUDPIFCInterconnect_Internal中初始化为gp_interconnect_queue_depth(默认值4),即接收端接收队列大小,也就是接收窗口。初始表示接收队列空闲这4个空间。若发送成功,该值会减1。那么什么时候,该值会增加呢?

3、接收端接收线程

5ff4475dd92e669ab69412f556aeec0c.png

接收端接收线程接收到数据包后,回ack的函数是handleDataPacket。会收到三种数据包:正常包、乱序包、重复包。

4、接收线程收到正常包

16152c7e32b2c1cf9ac25d2fc30afc6c.png

因为接收队列总是根据包的seq号来决定放到哪个槽位。发送端发送一个包,会将当前连接的序列号conn_info.seq作为包的seq,并将序列号+1;若是重复包则不会加。因此正常包的seq总是递增的,反应到槽位上也是依次从前向后然后循环到头从新开始放。队列中每放一个正常包,队列tail向后移动一个槽位,并且接收端的conn_info.seq+1。因此判定正常包的条件:pos == tail

正常包时,会将当前接收队列的接收的包的seq作为ack的seq,将当前已处理包的序列号extraSeq作为ack的extraSeq回给发送端。

handleAcks处理接收端发来的ack中会更新该值。当回的是正常ack时:

pkt->extrsSeq > pkt->consumedSeq(初始0),正常情况下该条件会满足,接收端正常处理了包:pkt->extraSeq - ackConn->consumedSeq表示处理了包的个数。

注:不是每处理一个包就立即返回的。1)seq每隔2个,会回一次ack,反应到extraSeq上:已处理了该seq,但每次都会更新extraSeq;2)接收线程每接收一个包,并放到了队列中,也会回一次ack。当然这里的extraSeq是主线程处理一个包更新后的值。

举例:ackConn->consumedSeq开始是0,返回来的pkt->extraSeq为2。pkt->extraSeq - ackConn->consumedSeq表示接收端接收队列空出了2个,此时更新下consumedSeq值为2。再收到回复的ack时,pkt->extraSeq为3,接收端上次处理到了2,这次处理到了3,正好空闲出了1个,所以这样对应到发送端的黄框更新capacity上。

5、接收线程收到乱序的包

f9db0496f6b2b81393232a4c217e28e4.png

1)发送端后发送的先到达了,也会导致后接收到的包落到了接收队列前面.seq2先到,此时pos!=tail,即seq2是个乱序包。

b4e526c3c0420f33c2bd73ff897ed313.png

2)发送端发送时丢包了,接收端没接收到,但后续的包接收到了。丢的包再次发送时,它势必会在接收队列的前面。Seq1中途丢了,那么seq2到了后,pos!=tail,即seq2是乱序包。

handleDisorderPacket-->sendDisorderAck(conn, pkt->seq, conn->conn_info.seq - 1, lostPktCnt);

针对乱序包,回的ack:包的seq作为ack的seq,当前接收端已接收的包seq作为extraSeq。

例1)中,seq2先到,回的ack(seq,extraSeq)=(2,0);seq1到了后,会执行下面循环:更新到seq2的位置,即tail会移动到3,seq号加2。然后回ack(1,0)

306485aef991b105f744302d5e4f6cf5.png

乱序的包,如何导致extraSeq变小?

9b24f6ee6f3704abc54b17a6846f6282.png

1)接收端已处理了seq1,发送ack,更新了发送端capacity和consumedSeq为1

2)接收端陆续又接收了seq2、seq3,因是正常包,回ack的extraSeq为接收队列已处理的seq,此时是1,所以发送端pkt->extraSeq(1) > ackConn->consumedSeq(1)条件不满足,不会更新capacity和consumedSeq

3)seq4和seq5发送乱序,seq5先到,此时回的ack的extraSeq为3,发送端pkt->extraSeq(3) > ackConn->consumedSeq(1)条件满足,更新capacity(+2 -> 3)和consumedSeq(3)。

4)当接收端再次拿走seq2处理后,回ack的extraSeq为2,此时就发送extraSeq变小。当然,发送端也不会更新capacity和consumedSeq。

也就是,实际上接收端还每空闲出槽位,发送端就提前更新说接收端空闲出来了。导致发送端激进发送(当然这不会发生,因为还会和loss和capacity机制结合,当接收端发送队列都每接收到ack或达到拥塞窗口时,就不再发送)。

另外,发生乱序时,实际上接收端已消耗了一个槽位,但是仍旧不会向发送端报告说又消耗了一个,只有当丢的包或者慢的包收到时,才会将槽位一下子更新到之前接收到乱序包的位置,然后才告诉发送端:丢失包和乱序包占用的槽位都消耗了。

6、接收线程收到重复包的情况

6d5d548a298963c347fb9a901bb8bbb7.png

发送端发送的seq2在接收端接收到了,正常占用槽位,tail正常推进。接收队列还没处理,所以发送端的capacity和consumedSeq不能更新变大。Seq2接收到后,回的ack丢失了,那么发送端会超时重发,因此seq2在接收端已接收过,所以认定seq2是重复包。针对重复包seq2回的ack(seq,extraSeq)=(2,5),发送端会将capacity进行更新为5,consumedSeq更新5。

此时,接收端拿走seq1处理,回ack(1,1)。这种就和乱序包一样的情况了,不会继续更新capacity了。

针对重复包,接收队列还没空出槽位,同样会提前通知发送端说:我有空闲槽位了。

7、总结

主要介绍gp_interconnect_fc_method流量控制,如何理解根据接收端窗口来控制发送。针对正常包、乱序包、重复包、已处理包回的ack,来更新发送端capacity(标记接收窗口)。仅当capacity大于0时,才会进入是否发送数据包的判断流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/19942.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLOv8实战垃圾分类目标检测 (视频课程)

课程链接:https://edu.csdn.net/course/detail/38804 垃圾分类是一项利国利民的民生工程,需要全社会的共同参与。 YOLOv8是前沿的目标检测技术,它基于先前 YOLO 版本在目标检测任务上的成功,进一步提升性能和灵活性。 本课程将手…

基于OpenCV 和 Python 实现车牌检测--附免费源码

文末提供免费的源代码下载链接 车牌检测是使用计算机视觉技术自动检测和识别图像或视频流中的车牌/车牌的过程。 此任务在许多应用中都很有用,例如交通管理、自动收费和停车控制。 车牌检测基本上分为两个任务: 车牌检测:这是指识别图像或视频帧中车牌位置的过程。这涉…

实战:Springboot集成Sentinel实现流量控制、熔断降级、负载保护

文章目录 前言知识积累流量控制负载保护熔断降级官方文档 实战演练部署sentinel-dashboard直接jar包部署docker-compose编排 springboot集成sentinel基础架构搭建sentinel控制台sentinel验证 延伸:系统自适应限流系统规则原理配置页面 写在最后 前言 前面的文章我们…

面试官:请你说下深、浅拷贝并且手写深、浅拷贝,我:你咋知道我只会这个?

前后端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 web前端面试题库 VS java后端面试题库大全 一、引言 当我们需要在 JavaScript 中处理对象和数组时,经常需要使用对象和数组的复制功能。JS中有着两种…

TCP 与UDP区别

目录 网络参考模型TCPTCP 是什么特点 UDPUDP 是什么特点 TUP与UDP区别 总结什么时候选TCP or UDP 网络参考模型 TCP TCP 是什么 传输控制协议(TCP)是TCP/IP模型的传输层协议。它是一个面向连接的协议。因此,协议首先在源和目标之间建立连接…

谈谈对SpringMVC的理解

1、SpringMVC是属于SpringFramework生态里面的一个模块,它是在Servelet基础上构建的,并且使用了MVC模式设计的一个Web框架; 2、它的主要目的是为了简化传统模式下的Serveletjsp的开发模式,其次SpringMVC的架构模式是对于Java的web…

AR 技术应用与管理解决方案:施工建造、机柜扫描、办公室导航

建筑行业作为人类历史上最重要的产业之一,在数字化转型方面同样也在不断推进。图扑软件结合 AR 技术的应用,为建筑行业带来了更加便捷高效的建筑施工过程管理。 传统的建筑施工管理过程中,由于缺乏信息化手段,往往存在资料不全、…

面试算法题—编程题2023

面试算法题—编程题2023 一、冒泡排序二、选择排序三、快速排序四、其它排序 最近在看一些面试题,发现很多面试过程中都会要求手写排序编程题,经过一番查找整理,可以快速学习和使用相关排序算法题,通俗易懂,手撕代码吊…

RFC959 文件传输协议(FTP)翻译

发布时间:2023-07-12 21:14:54 前言 想做一下FTP的项目,带师说要参考RFC做才能标准化,先翻译一下。 官方文档:https://www.rfc-editor.org/rfc/inline-errata/rfc959.html 本备忘录的状态 本备忘录是文件传输协议&#xff08…

请求响应-数组集合参数的接受

数组集合参数 数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接受参数 具体关键代码如下: 在psotman中发出对应请求,结果如下: 集合参数:请求参数与形参集合名称相同且请求…

前端框架Layui实现动态树效果(书籍管理系统左侧下拉列表)

目录 一、前言 1.什么是树形菜单 2.树形菜单的使用场景 二、案例实现 1.需求分析 2.前期准备工作 ①导入依赖 ②工具类 BaseDao(通用增删改查) BuildTree(完成平级数据到父子级的转换) ResponseUtil(将数据转换成json格式进行回显&…

vue el-table的每行操作el-button添加单独的loading效果实现

vue el-table的每行操作el-button添加单独的loading效果实现 效果图&#xff1a;实现代码&#xff1a;结语 效果图&#xff1a; 实现代码&#xff1a; <tamplate><el-table :data"list" ><el-table-column fixed"right" label"操作&q…