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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
4月前
|
缓存 网络协议 算法
TCP、UDP是如何流量、拥塞控制的?今天一口气讲透!
TCP、UDP是如何流量、拥塞控制的?今天一口气讲透!
153 2
|
缓存 网络协议 算法
计算机网络学习26:TCP/UDP对比区别、TCP流量控制、拥塞控制、超时重传时间的选择、可靠传输的实现
UDP: User Datagram Protocol 用户数据报协议 TCP: Transmission Control Protocol 传输控制协议 同时这里指的连接是指逻辑连接,而不是物理连接。
计算机网络学习26:TCP/UDP对比区别、TCP流量控制、拥塞控制、超时重传时间的选择、可靠传输的实现
|
网络安全 网络虚拟化
内核中的UDP socket流程(10)——ip_append_data
作者:gfree.wind@gmail.com 博客:linuxfocus.blog.chinaunix.net 现在换一种风格,把一些对代码的解读直接写到代码段。那样看起来可能更好 继续ip_append_data,     /* hh_len是hardware header...
1260 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.
890 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 由于种种原因,工作的,私人的,学习停了几天。
1689 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...
1295 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.
1563 0
|
API
内核中的UDP socket流程(2)——API “sys_socket”
内核中的UDP socket流程(2)——API “sys_socket” 作者:gfree.wind@gmail.com 原文:http://blog.chinaunix.
1239 0
内核中的UDP socket流程(5)——inet_create
内核中的UDP socket流程(5)——inet_create 作者:gfree.wind@gmail.com 原文:http://blog.chinaunix.net/space.
1361 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文件。
1431 0