GaussDB(DWS)通信视图监控分析

举报
sevenjiang 发表于 2021/03/11 16:18:32 2021/03/11
【摘要】 数据库执行查询,负载均衡下发到CN,CN上的作业执行要进一步确认执行情况,可以通过查看相关视图分析,总结了常规的视图和方法可以参考使用

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连接

 CNDN的连接叫做pooler,数据库在运行过程中,CNDN之间的连接是可以进行复用的,由参数enable_stateless_pooler_reuse控制,关闭时,当前session结束后,CNDN相关的pooler连接会释放,下次连接进来时会重新建立连接;打开后,当前session结束后,CNDN相关的连接不会释放,下次相同参数的连接进来时会复用连接池中的连接,而不会新建连接,可以减少因建连引起的资源开销。

pooler连接查询视图:pg_pooler_status,每一行为CN与某一个DNpooler连接,其中in_use字段为f 表示此pooler为未使用状态,t 表示此pooler正在被使用。

在视图使用过程中要注意pooler连接的状态(如in_usesession_params)与实际是否相符。

 2、DN-DN连接

 DN与DN的连接叫做stream,其可以通过视图pg_comm_recv_stream/ pg_comm_send_stream查询DN之间的每个stream连接,并通过收发数据的状态判断有无问题。

如下图为query_id78250043526600681SQLdn6001上向dn6003发送数据的情况,显示此时在dn6001dn6003之间有两个stream数据流在传输数据,其中quota为正在传输数据的大小,其大小值不能超过comm_quota_size的值大小。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。