写点什么

带你走进数仓大集群内幕丨详解关于作业 hang 及残留问题定位

  • 2023-08-07
    广东
  • 本文字数:1820 字

    阅读完需:约 6 分钟

带你走进数仓大集群内幕丨详解关于作业hang及残留问题定位

本文分享自华为云社区《【带你走进DWS大集群内幕】大集群通信:作业hang、残留问题定位》,作者: 雨落天穹丶。

前言


测试过程中,我们会遇到这样一种情况,我的作业都执行很久了,为啥还不结束,是不是作业 hang 掉了? 或者说,明明看到 CN 上的作业都没了,为什么通过全局视图发现 DN 上还有作业在执行而没有退出,这是不是有问题啊?那么就带着这样的疑问点来阅读本篇分析问题的方式方法,给初学者一点定位思路。

【通信系统视图】


pgxc_comm_send_stream :展示所有 DN 上的通信库发送流状态。


pgxc_comm_recv_stream :展示所有 DN 上的通信库接收流状态。


pg_thread_wait_status :通过 PG_THREAD_WAIT_STATUS 视图可以检测当前实例中工作线程(backend thread)以及辅助线程(auxiliary thread)的阻塞等待情况。


pgxc_thread_wait_status :通过 CN 节点查看 PGXC_THREAD_WAIT_STATUS 视图,可以查看集群全局各个节点上所有 SQL 语句产生的线程之间的调用层次关系,以及各个线程的阻塞等待状态,从而更容易定位进程停止响应问题以及类似现象的原因。


pg_stat_activity :PG_STAT_ACTIVITY 视图显示和当前用户查询相关的信息。若有管理员权限或预置角色权限可以显示和所有用户查询相关的信息。


pgxc_stat_activity :PGXC_STAT_ACTIVITY 视图显示当前集群下所有 CN 的当前用户查询相关的信息。


单实例查询:可直连 DN/CN 通过此条 SQL 进行 DN/CN 上活跃会话访问查询。


select datname,usename,pid,query_id,query_start,query from pg_stat_activity where state='active' order by query_start;
复制代码


全局查询: 获取所有的 CN 上当前的作业执行情况


select coorname,datname,usename,pid,query_id,query_start,query from pgxc_stat_activity where state='active' order by query_start;
复制代码


【发现问题】1. 集群作业停止一段时间后,发现集群 DN 还存在比较高的压力 CPU,查询活跃会话视图,观察是否存在未执行完的作业,或者只是主备 DN 数据同步(同步属于正常情况,但持续时间过长,就要分析 DN HA catchup 机制是否正常)


例如,如下查询到的结果可以观察到,当前时间 19:38,作业已经退出很久了,发现在 linux0802 集群的 6606 端口 DN 上还存在 16:49 分的作业还在执行,且通过作业分析发现,该作业是简单的 create table as select * 场景 ,正常测试返回结果在 10s 之内,那当前作业还存在于此 DN 上处于 active 执行状态,就显得很不正常。



那我们就针对这条存在的活跃会话进行分析。


【分析问题】通过全局会话等待视图观察这个作业当前的执行状态


获取上图中的执行 query 的 query_id 通过 query_id 查询作业执行状态:


select * from pgxc_thread_wait_status where query_id='219269006857675600' order by 1,2;  
复制代码


-- 通过上面查出 query_id 分析



查询结果发现所有的线程都是在获取 stream 连接状态,且已经不存在与 CN 的连接信息

那我们找一个 DN 节点查看堆栈:选取 dn_6007_6008 lwtid = 2238755



通过 cm_ctl query -Cv 查找 dn 6007 所在的物理节点环,观察当前主 DN 是 6007 还是 6008(一般业务连接都是主 DN,如果发生主备切换,那么我们查看堆栈就要到 6008 节点[当前的主 DN 节点])



连接到到所在物理节点, 用 gstack 2238755 (多执行几遍,如果栈内容一直不变,可能就是 hang,需要分析位,如果栈一直在变可能是在工作,确实是 sql 执行慢,可联系开发帮忙确认分析是不是正常堆栈)



【问题初步结论】初步分析堆栈代码属于通信相关,找对应的责任田定位问题。


【发现问题】2. 集群作业停止一段时间后,发现集群 CN 上还存在未执行完的作业,但是 DN 上的作业连接已经全部退出


还是通过上面的例子中的查询活跃会话的语句,分析找到对应的 query id。


通过线程等待视图查询当前作业执行情况。


select * from pgxc_thread_wait_status where query_id='237283405371509247' order by 1,2;
复制代码



上图中当前只剩下 CN 线程,DN 线程全部退出,那么这种情况就需要去分析 CN 对应等待状态中的 dn 6301 实例上的对应远端线程在干什么


通过通信 pooler 视图查询对应的 remote node 线程号: select * from pg_pooler_status where pid=140069915589224;



然后用线程等待视图查询:select * from pgxc_thread_wait_status where pid = 140704341249976 order by 1,2;



可以按上面第一种类型的查询 DN 节点操作 访问 dn_6301_6302 主 DN 所在的物理机器节点 用 gstack 39625 观察堆栈。



【问题初步结论】


初步判断是 DN 在等主备同步呢,此时 DN 上的 query id 清 0 了,用 query_id 匹配不到,后续联系对应责任田分析。


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 5
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
带你走进数仓大集群内幕丨详解关于作业hang及残留问题定位_数据库_华为云开发者联盟_InfoQ写作社区