GaussDB(DWS)stream线程池设计(三)

一、外部接口

1.1 新增接口介绍

stream线程池新增GUC参数max_stream_pool,用于控制线程池中最大可用线程的个数。

默认值:65535(整数最大值)

取值范围:-1~INT_MAX-1表示不开启stream线程池

max_stream_pool支持reload更新,更新规则:设置max_stream_pool小于当前可用线程个数,支持线程个数实时减少;当设置max_stream_pool大于当前idle线程个数,将由业务驱动线程个数的增加。

1.2  修改接口介绍

stream线程池修改pg_thread_wait_status视图中等待状态,新增wait stream cond状态表示线程池中等待被复用的stream线程,DN上可见。

图一 pg_thread_wait_status视图

pg_comm_status视图补充三个变量:复用stream线程的次数、使用stream线程的次数(含复用和create)、stream线程并发个数的历史峰值。

performance显示是否复用线程,拿连接唤醒等开销性能数据,超出1ms输出到performance。

二、  内部接口

Stream线程池提供了三种接口以管理stream线程,除外部接口外,内部的接口包含被动清理接口和超时清理接口。如图六所示:

图二、stream线程管理接口

被动清理接口CleanStreamPool负责根据database清理stream线程,其提供三种清理模式:

  • CLEAN_QUARTER_FREE:清理四分之一idle线程;
  • CLEAN_ALL_FREE:清理所有idle线程;
  • CLEAN_ALL_FORCE:清理所有dababase相关的stream线程。

该接口由内部函数调用,例如dropdbclean connection等。

自动清理接口负责自行定时清理超时未使用的idle线程,其不开放给任何调用,此处接口可以理解为线程的一种管理方式。

清理逻辑:max_stream_pool阈值不作强约束,尽量缓存线程,通过空闲连接利用率决定回收间隔,空闲率高时快速回收,反之慢速回收

三、接口实现逻辑

接口的实现逻辑:

3.1、被动清理接口

int StreamThreadPool::CleanStreamPool(const char *dbName, cleanOption cleanMode)

入参:dbName cleanMode

返回值:清理的个数

CleanMode可选:CLEAN_QUARTER_FREECLEAN_ALL_FREECLEAN_ALL_FORCE

实现流程如下:

 

图三、CleanStreamPool接口执行逻辑

3.2、超时清理接口

超时清理接口是指idle状态的slot超时未被使用而自动清理,其实现在图七的wait()模块,对应StreamThreadPool::Wait()函数,其实现流程如图十一所示:

可以看出当线程超时需要清理时,实际对应的操作为:将slot的状态从IDLE置为HOLD,表示该slot已被预占作为退出线程。随后返回false,函数退出。

根据图七所示,wait()返回false后,stream线程会退出,调用回调函数StreamQuitAndClean(),将slot归还emptyRing,其执行逻辑如图十二所示。

由图十一和十二可以看出,当slot超时退出,此时slot的状态仅仅被修改为了EXIT,而其所处的位置仍然在idleRing中,slot此时在idleRing中等待被poppop后发现状为EXIT,会将slot放回置empty状态中,pop的逻辑如图十二所示。

 

图四、wait()执行逻辑


图五、slot异常退出执行逻辑

  图六、slot获取执行逻辑

  1. 外部接口

stream线程池可通过reload参数max_stream_pool,用于控制线程池中最大可用线程的个数。具体流程如下:


图七、外部guc set逻辑

想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料~

(完)