GPDB-内核特性-UDP流量控制

简介: Greenplum UDP流量控制

GPDB-内核特性-UDP流量控制

GPDB是在开源PostgreSQL基础上,采用MPP架构的关系型分布式数据库,具有强大的大规模数据分析任务处理能力。采用Shared-Nothing架构,整个集群由多个数据节点(segment)和控制节点(master)组成。数据节点之间会出现数据洗牌,并且数据节点会将数据发送到控制节点进行汇总输出。数据节点之间的数据洗牌和数据节点向控制节点发送数据通过Interconnect实现。

1、Interconnect概要介绍

Interconnect是GPDB数据库中负责不同节点进行内部数据传输的组件。GPDB中由特定的执行算子Motion用来负责查询处理执行器节点之间交互数据,底层网络通信协议通过Interconnect实现。

由控制参数gp_interconnect_type来指定使用哪种协议。该参数取值范围:UDPIFC:基于UDP的可靠协议,实现了重传、乱序处理、不匹配处理、流量控制等功能;TCP:TCP协议;proxy:基于TCP改造而来,主要用来应对在大规模集群里面网络连接数巨大的情况。

本文关注UDPIFC协议。该协议下由gp_interconnect_fc_method参数控制使用哪种流量控制方式:capacity根据接收方窗口来控制发送;loss(默认)根据丢包情况控制发送速度。

gp_interconnect_snd_queue_depth:设置发送方发送窗口大小,增加该值会占用更多内存,默认2。仅在UDPIFC协议下才生效。

gp_interconnect_queue_depth:设置接收端UDP接收窗口大小。当数据达到接收方,但是接收窗口每位置的时候,就会丢弃这个数据,需要重新传输。因此,增加该值需要更多内存,但能够改善性能。默认为4,设置1-10较为合理。

2、UDPIFC如何控制流量

通过拥塞控制来控制发送速度。和TCP的拥塞控制类似。先介绍几个概念相关变量。

static SendControlInfo snd_control_info::拥塞控制相关信息

  struct SendControlInfo

{

/* The buffer used for accepting acks */

icpkthdr   *ackBuffer;

floatcwnd;//拥塞窗口

floatminCwnd;//最小拥塞窗口

floatssthresh;//慢启动门限

};

网络拥塞:ack超过超时传送时还没收到。

流量控制机制

流量控制流程如下图所示。

1)SendControlInfo初始化:初始化在进程初始化的时候操作,也就是InitMotionLayerIPC函数完成。仅将拥塞窗口初始化为0。

2)在执行器执行的时候,primary上设置拥塞窗口和慢启动门限值。可以看到拥塞窗口cwnd被设置成了1,而慢启动门限被设置成了2,即门限值由gp_interconnect_snd_queue_depth控制。

3)SendChunkUDPIFC函数完成发送数据的功能:sendBuffers发送后进入pollAcks等待ack事件发生。有ack事件到来后,由函数handleAcks处理接收到的ack。可以看到若拥塞窗口小于慢启动门限值,则拥塞窗口+1,否则+1/cwnd。但这里有个阈值,cwn最大不能超过gp_interconnect_snd_queue_depth(默认2)的值。

4)当接收端发生丢包发来对应ack:会将慢启动门限值调整到一半,拥塞窗口更新为ssthresh值。此时认为拥塞不严重,还可以慢慢增加发包数;当超时重传时,认为拥塞比较严重了,此时将ssthresh门限值调整为一半,拥塞窗口重回1值,从发送一个包重新开始。

5)sendBuffers函数中根据拥塞值控制是否发送:当numSharedOutStanding值>=拥塞窗口cwnd时,表示已经有这么多的发送未接收到ack了,发生丢包严重了。就不再让发送数据了。

image.png

3、总结

image.png

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
网络安全 网络虚拟化
内核中的UDP socket流程(10)——ip_append_data
作者:gfree.wind@gmail.com 博客:linuxfocus.blog.chinaunix.net 现在换一种风格,把一些对代码的解读直接写到代码段。那样看起来可能更好 继续ip_append_data,     /* hh_len是hardware header...
1189 0
|
缓存
内核中的UDP socket流程(11)——ip_append_data
作者:gfree.wind@gmail.com博客:linuxfocus.blog.chinaunix.net 继续ip_append_data,         if (copy > length)             copy = length;         if (!(rt->dst.
858 0
|
Linux
内核中的UDP socket流程(3)——sock_create
内核中的UDP socket流程(3)——sock_create作者:gfree.wind@gmail.com 原文:http://blog.chinaunix.net/space.php?uid=23629988&do=blog&id=85909 由于种种原因,工作的,私人的,学习停了几天。
1600 0
内核中的UDP socket流程(7)——udp_sendmsg
作者:gfree.wind@gmail.com 原文:http://blog.chinaunix.net/space.php?uid=23629988&do=blog&id=85925 sock_sendmsg的代码很简单 int sock_sendmsg(struct sock...
1254 0
|
网络协议 Linux
内核中的UDP socket流程(4)——sock_create
内核中的UDP socket流程(4)——sock_create作者:gfree.wind@gmail.com 原文:http://blog.chinaunix.net/space.php?uid=23629988&do=blog&id=85910 又懒了2天,继续sock_create     /* Compatibility.
1512 0
|
API
内核中的UDP socket流程(2)——API “sys_socket”
内核中的UDP socket流程(2)——API “sys_socket” 作者:gfree.wind@gmail.com 原文:http://blog.chinaunix.
1215 0
内核中的UDP socket流程(5)——inet_create
内核中的UDP socket流程(5)——inet_create 作者:gfree.wind@gmail.com 原文:http://blog.chinaunix.net/space.
1316 0
|
索引 Unix API
内核中的UDP socket流程(6)——sendto
内核中的UDP socket流程(6)——sendto作者:gfree.wind@gmail.com 原文:http://blog.chinaunix.net/space.php?uid=23629988&do=blog&id=85912 现在开始新的API sendto,那么就重新回到了socket.c文件。
1372 0
内核中的UDP socket流程(8)——udp_sendmsg
作者:gfree.wind@gmail.com 原文:http://blog.chinaunix.net/space.php?uid=23629988&do=blog&id=91590 继续分析udp_sendmsg,      ipc.
2422 0
|
网络协议
内核中的UDP socket流程(9)——ip_append_data
作者:gfree.wind@gmail.com 原文:http://blog.chinaunix.net/space.php?uid=23629988&do=blog&id=96739 下面开始分析ip_append_data这个函数。
1491 0