GaussDB(DWS)通信视图监控分析
1 主要视图及函数
1.1 pg_stat_activity
显示数据库连接查询相关信息,主要查询结果有:当前数据库的所有连接(包括开始时间、连接参数、客户端信息),执行SQL(包括start时间、执行状态、query_id、pid)
1.2 pgxc_thread_wait_status
可以查看集群全局各个节点上所有SQL语句产生的线程之间的调用层次关系,以及各个线程的阻塞等待状态,从而更容易定位进程停止响应问题以及类似现象的原因。
1.3 pg_comm_recv_stream/ pg_comm_send_stream
展示单个DN上所有的通信库接收/发送流状态,可以查询DN间数据收发是否有阻塞。
1.4 comm_quota_size
DN间每个连接可连续发送包的总大小。
1.5 enable_stateless_pooler_reuse
pooler复用切换开关,新下发的作业是否利用已存在并空闲的连接。
1.6 pg_pooler_status
查询CN上pooler中的缓存连接状态,查询当前CN与所有DN的连接,是否在使用状态。
1.7 pg_terminate_backend()/pg_cancel_backend()
根据pid终止作业。
2 视图及函数使用
2.1 Hang问题定位
一般在hang问题定位时都要用到通信相关视图,如果遇到疑似hang问题,可以通过以下方法定位:
1、通过pg_stat_activity视图查出目标SQL的query_id及等待状态等相关信息。
如下select datname,query_start,state,query_id,query from pg_stat_activity where query like '%pg_stat_get_workload_struct_info%' ,通过以下视图可知当前作业正在执行(active),且query_id为76561193665300467。
2、根据query_id查询视图pgxc_thread_wait_status得知query各线程等待关系。
通过以下视图可知,当前作业一直停在CN的一线程上85480,状态为none,需要找出线程在干什么。
3、gstack打印问题线程堆栈,通过堆栈确认问题来源,多次打印,如堆栈一直在动,则查询在正常执行,如果一直未动,则可能发生hang。
根据函数名及cpp名可以确定稳定来源于资源管理。
4、补充。
以上作业比较简单,有时会有比较复杂的作业,就需要理清各线程之间的等待关系,如下图的复杂查询,所有的线程都在等待dn_6047_6048(等待其他DN的最后也都在等待dn_6047_6048,1在等2,2在等3,最终都是在等3),而dn_6047_6048上的线程21561状态为none,需要打印出其堆栈来确认问题点。
如果所有线程一直hang在发送或者接收数据上,就需要通过视图查询线程的数据接收和发送有无问题,pg_comm_recv_stream和pg_comm_send_stream:DN上所有的通信库接收与发送流状态。如下图为dn6001从dn6003接收数据的各线程信息,根据quota判断线程是否有数据在传输,并进行多次查询对比。
2.2 通信连接问题
1、CN-DN连接
CN与DN的连接叫做pooler,数据库在运行过程中,CN与DN之间的连接是可以进行复用的,由参数enable_stateless_pooler_reuse控制,关闭时,当前session结束后,CN与DN相关的pooler连接会释放,下次连接进来时会重新建立连接;打开后,当前session结束后,CN与DN相关的连接不会释放,下次相同参数的连接进来时会复用连接池中的连接,而不会新建连接,可以减少因建连引起的资源开销。
pooler连接查询视图:pg_pooler_status,每一行为CN与某一个DN的pooler连接,其中in_use字段为f 表示此pooler为未使用状态,t 表示此pooler正在被使用。
在视图使用过程中要注意pooler连接的状态(如in_use,session_params)与实际是否相符。
2、DN-DN连接
DN与DN的连接叫做stream,其可以通过视图pg_comm_recv_stream/ pg_comm_send_stream查询DN之间的每个stream连接,并通过收发数据的状态判断有无问题。
如下图为query_id为78250043526600681的SQL在dn6001上向dn6003发送数据的情况,显示此时在dn6001和dn6003之间有两个stream数据流在传输数据,其中quota为正在传输数据的大小,其大小值不能超过comm_quota_size的值大小。
- 点赞
- 收藏
- 关注作者
评论(0)