GPDB-内核特性-gp_interconnect_fc_method参数

简介: GreenPlum流量控制机制

GPDB-内核特性-gp_interconnect_fc_method参数

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

1、接收端主线程

image.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、发送端

image.png

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

3、接收端接收线程

image.png

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

4、接收线程收到正常包

image.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、接收线程收到乱序的包

image.png

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

image.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)

image.png

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

image.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、接收线程收到重复包的情况

image.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时,才会进入是否发送数据包的判断流程。

相关实践学习
【玩转ComfyUI】基于函数计算一键部署AI生图平台ComfyUI
本次实验将带大家通过使用阿里云产品函数计算FC,快速使用ComfyUI实现更高质量的图像生成。
从 0 入门函数计算
在函数计算的架构中,开发者只需要编写业务代码,并监控业务运行情况就可以了。这将开发者从繁重的运维工作中解放出来,将精力投入到更有意义的开发任务上。
目录
相关文章
|
JSON Serverless API
Serverless 应用引擎常见问题之query参数无法取到上一步传输过来的jjson参数如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
369 3
|
缓存 Serverless 开发者
serverless devs部署问题之push image失败如何解决
Serverless部署是指将应用程序部署到无服务器架构中,该架构允许开发者专注于代码而无需关心底层服务器的运行和维护;针对Serverless部署过程中可能遇到的挑战,本合集提供全面的指南和最佳实践,帮助开发者顺利实现应用的无服务器化部署。
285 1
|
消息中间件 网络协议 JavaScript
函数计算产品使用问题之删除应用重建后,如何快速生成之前的模型和参数
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
存储 计算机视觉
OpenCV 中 CV_8UC1,CV_32FC3,CV_32S等参数的含义
OpenCV 中 CV_8UC1,CV_32FC3,CV_32S等参数的含义
1693 3
|
运维 Serverless API
函数计算产品使用问题之如何通过API传递ControlNet参数
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
Serverless API 网络安全
函数计算操作报错合集之如何解决在cfg_scale参数传入4.5等浮点数时遇到报错
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
284 1
|
运维 Serverless API
Serverless 应用引擎产品使用之在阿里函数计算中,“允许函数默认网卡访问公网” 参数配置如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
210 6
|
人工智能 运维 Java
Serverless 应用引擎产品使用之在阿里云函数计算中设置JVM参数如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
222 0
|
JSON Serverless 数据格式
函数计算入口参数event详解
函数计算入口参数event是一个可以根据具体需求高度自由化定制的参数,真的可以为所欲为
3680 0
|
7月前
|
人工智能 运维 Kubernetes
Serverless 应用引擎 SAE:为传统应用托底,为 AI 创新加速
在容器技术持续演进与 AI 全面爆发的当下,企业既要稳健托管传统业务,又要高效落地 AI 创新,如何在复杂的基础设施与频繁的版本变化中保持敏捷、稳定与低成本,成了所有技术团队的共同挑战。阿里云 Serverless 应用引擎(SAE)正是为应对这一时代挑战而生的破局者,SAE 以“免运维、强稳定、极致降本”为核心,通过一站式的应用级托管能力,同时支撑传统应用与 AI 应用,让企业把更多精力投入到业务创新。
769 30

热门文章

最新文章