GaussDB(DWS) 集群通信系列一:pooler连接池
一、pooler连接池是什么?
pooler连接池是GaussDB CN进程内保存与其他GaussDB进程数据连接的数据结构,主要作用是连接复用,节省建连、认证、对端线程启动初始化开销。
如上图所示,CN的pooler连接池中会保存与其他CN/DN的连接,每一个连接在对端会对应一个postgres工作线程。
postgres工作线程是带状态属性的,如database,所以可以认为pooler连接池中的连接也是带属性的。不同属性间的连接是不能复用的,如上图所示,按不同属性切分为pool A/B/C等连接池。每个连接池中会存有连接往不同节点的空闲连接的数组,提供接口给外部使用或放入连接。
CN上的postgres工作线程在需要连接其他节点时,会创建一个本地agent,尝试从pooler连接池取跟本线程相同属性的空闲连接,pooler如果没有空闲连接,就会新建一个连接。连接交给agent后,可以视为线程私有。在线程退出时,agent才会将连接还给pooler。
注意:enable_stateless_pooler_reuse为on时,连接只按database区分连接池;enable_stateless_pooler_reuse为off时,连接按database+user+option区分连接池
二、怎么查看pooler连接池
可以连接CN后通过pg_pooler_status查看,如下图:
一般pooler连接池中的连接会非常多,可以按不同字段group by查看某个db pool池中的连接情况,或连往某个node的连接情况,如:
select database,user_name,node_name,in_use,count(*) from pg_pooler_status group by 1, 2, 3 ,4 order by 5 desc limit 50;
三、pooler连接池相关问题定位
1,空闲连接太多导致DN线程超过max_connections
DN上报错误信息:FATAL :dn_6011_6012 :[FATAL] Already too many clients. active/non-active: 998/1069/3
表明DN上2000个线程用满了,但有1069个空闲线程,此时可以通过在各个CN上查询pooler视图,统计连接此DN的空闲连接,确认问题。并通过手动clean connection清理空闲连接。
CLEAN CONNECTION TO ALL FORCE FOR DATABASE postgres;
GaussDB内核8.0.0版本已支持自动清理空闲连接功能。
2,查询性能慢,查看CN pg_thread_wait_status视图显示大量建连状态"pooler create conn"
大量pooler建连状态,说明空闲连接不够用。需要先确认当前的空闲连接状态:
select in_use,count(*) from pg_pooler_status group by 1 order by 2 desc where database='XXX' and node_name='XXX';
如果空闲连接和非空闲连接都很少,说明连接用完即销毁了。需要确认pooler连接池开关参数cache_connection=on,并确认CN日志没有报错。
如果非空闲连接很多,空闲连接很少,说明并发太大,连接都在使用中,需要降低并发,或调大max_pool_size。
- 点赞
- 收藏
- 关注作者
评论(0)