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线程。
该接口由内部函数调用,例如dropdb、clean connection等。
自动清理接口负责自行定时清理超时未使用的idle线程,其不开放给任何调用,此处接口可以理解为线程的一种管理方式。
清理逻辑:max_stream_pool阈值不作强约束,尽量缓存线程,通过空闲连接利用率决定回收间隔,空闲率高时快速回收,反之慢速回收。
三、接口实现逻辑
接口的实现逻辑:
3.1、被动清理接口
int StreamThreadPool::CleanStreamPool(const char *dbName, cleanOption cleanMode)
入参:dbName cleanMode
返回值:清理的个数
CleanMode可选:CLEAN_QUARTER_FREE、CLEAN_ALL_FREE、CLEAN_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中等待被pop,pop后发现状为EXIT,会将slot放回置empty状态中,pop的逻辑如图十二所示。
图四、wait()执行逻辑
图五、slot异常退出执行逻辑
图六、slot获取执行逻辑
- 外部接口
stream线程池可通过reload参数max_stream_pool,用于控制线程池中最大可用线程的个数。具体流程如下:
图七、外部guc set逻辑
想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料~
- 点赞
- 收藏
- 关注作者
评论(0)