首页 > 其他分享 >openGauss 内置stack工具

openGauss 内置stack工具

时间:2024-03-30 09:56:10浏览次数:28  
标签:内置 gs int unsigned long 调用 openGauss stack

内置stack工具

可获得性

本特性自3.0.0版本开始引入。

特性简介

stack工具是获取数据库中各线程的调用栈的工具,用于辅助数据库运维人员定位死锁、hang等问题。

客户价值

提供函数级别的调用栈信息,提升数据库内核运维人员分析、定位死锁、hang等问题的效率。

特性描述

可以通过函数gs_stack()或者工具gs_ctl stack两种方式获取数据库中线程的调用栈。

  1. gs_stack()函数方式

    • select * from gs_stack(pid)获取指定线程调用栈。

      openGauss=# select * from gs_stack(139663481165568);
                                    gs_stack
      --------------------------------------------------------------------
       __poll + 0x2d                                                     +
       WaitLatchOrSocket(Latch volatile*, int, int, long) + 0x29f        +
       WaitLatch(Latch volatile*, int, long) + 0x2e                      +
       JobScheduleMain() + 0x90f                                         +
       int GaussDbThreadMain<(knl_thread_role)9>(knl_thread_arg*) + 0x456+
       InternalThreadFunc(void*) + 0x2d                                  +
       ThreadStarterFunc(void*) + 0xa4                                   +
       start_thread + 0xc5                                               +
       clone + 0x6d                                                      +
      (1 row)
      
    • select * from gs_stack()获取所有线程的调用栈。

      openGauss=# select * from gs_stack();
      -[ RECORD 1 ]-------------------------------------------------------------------------------------------------------
      tid   | 139670364324352
      lwtid | 308
      stack | __poll + 0x2d
            | CommWaitPollParam::caller(int (*)(pollfd*, unsigned long, int), unsigned long) + 0x34
            | int comm_socket_call<CommWaitPollParam, int (*)(pollfd*, unsigned long, int)>(CommWaitPollParam*, int (*)(pollfd*, unsigned long
      , int)) + 0x28
            | comm_poll(pollfd*, unsigned long, int) + 0xb1
            | ServerLoop() + 0x72b
            | PostmasterMain(int, char**) + 0x314e
            | main + 0x617
            | __libc_start_main + 0xf5
            | 0x55d38f8db3a7
      [ RECORD 2 ]-------------------------------------------------------------------------------------------------------
      tid   | 139664851859200
      lwtid | 520
      stack | __poll + 0x2d
            | WaitLatchOrSocket(Latch volatile*, int, int, long) + 0x29f
            | SysLoggerMain(int) + 0xc86
            | int GaussDbThreadMain<(knl_thread_role)17>(knl_thread_arg*) + 0x45d
            | InternalThreadFunc(void*) + 0x2d
            | ThreadStarterFunc(void*) + 0xa4
            | start_thread + 0xc5
            | clone + 0x6d
      
  2. gs_ctl stack方式获取调用栈

    • 执行以下命令获取指定线程的调用栈。

      gs_ctl stack -D data_dir -I lwtid
      

      上述命令中-D data_dir用于指定需要获取调用栈的gaussdb进程的数据目录,-I lwtid用于指定目标线程的lwtid,lwpid可以ls /proc/pid/task/获取。具体步骤如下所示。

      1. 获取gaussdb进程号和数据目录。

        ps -ux | more
        USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
        perfadm    308  9.3 10.1 8719348 1649108 ?     Sl   May20  58:58 /xxx/bin/gaussdb -u 92617 -D /xxx/openGauss/cluster/data1/dn1 -M pending
        
      2. 通过进程号获取lwtid,task目录下的目录名就是lwtid。

        ls /proc/308/task/
        1096  505  522  525  529  532  536  539  542  546  549  552  555  558  561  565  569  575  584  833  923  926  929  932  935  938
        
      3. 获取指定lwtid的调用栈。

        gs_ctl stack -D /xxx/openGauss/cluster/data1/dn1 -I 1096
        [2022-05-21 10:52:51.354][24520][][gs_ctl]: gs_stack start:
        tid<140409677575616> lwtid<1096>
        __poll + 0x2d
        CommWaitPollParam::caller(int (*)(pollfd*, unsigned long, int), unsigned long) + 0x34
        int comm_socket_call<CommWaitPollParam, int (*)(pollfd*, unsigned long, int)>(CommWaitPollParam*, int (*)(pollfd*, unsigned long, int)) + 0x28
        comm_poll(pollfd*, unsigned long, int) + 0xb1
        ServerLoop() + 0x72b
        PostmasterMain(int, char**) + 0x329a
        main + 0x617
        __libc_start_main + 0xf5
        0x55cf616e7647
        [2022-05-21 10:52:51.354][24520][][gs_ctl]: gs_stack finished!
        
    • 执行以下命令获取所有线程的调用栈。

      gs_ctl stack -D data_dir
      

      上述命令中,-D data_dir用于指定需要获取调用栈的gaussdb进程的数据目录。具体步骤如下所示。

      1. 获取gaussdb进程号和数据目录。

        ps -ux | more
        USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
        perfadm    308  9.3 10.1 8719348 1649108 ?     Sl   May20  58:58 /xxx/bin/gaussdb -u 92617 -D /xxx/openGauss/cluster/data1/dn1 -M pending
        
      2. 获取所有线程的调用栈。

        [panhongchang@euler_phy_194 panhongchang]$ gs_ctl stack -D /xxx/openGauss/cluster/data1/dn1
        [2022-05-21 10:59:44.063][34511][][gs_ctl]: gs_stack start:
        Thread 0 tid<140409677575616> lwtid<21045>
        __poll + 0x2d
        CommWaitPollParam::caller(int (*)(pollfd*, unsigned long, int), unsigned long) + 0x34
        int comm_socket_call<CommWaitPollParam, int (*)(pollfd*, unsigned long, int)>(CommWaitPollParam*, int (*)(pollfd*, unsigned long, int)) + 0x28
        comm_poll(pollfd*, unsigned long, int) + 0xb1
        ServerLoop() + 0x72b
        PostmasterMain(int, char**) + 0x329a
        main + 0x617
        __libc_start_main + 0xf5
        0x55cf616e7647
        
        Thread 1 tid<140405343516416> lwtid<21060>
        __poll + 0x2d
        WaitLatchOrSocket(Latch volatile*, int, int, long) + 0x29f
        SysLoggerMain(int) + 0xc86
        int GaussDbThreadMain<(knl_thread_role)17>(knl_thread_arg*) + 0x45d
        InternalThreadFunc(void*) + 0x2d
        ThreadStarterFunc(void*) + 0xa4
        start_thread + 0xc5
        clone + 0x6d
        

        此处省略剩余调用栈。

特性增强

无。

特性约束

  1. 仅用于gaussdb进程,其他进程,如cms、gtm等不支持。
  2. 如果使用SQL的方式执行,则需要CN、DN进程处于正常状态,可连接和执行SQL。
  3. 如果使用gs_ctl的方式执行,则需要CN、DN进程处于可响应信号的状态。
  4. 不支持并发,在获取全线程栈的场景,各个线程的调用栈不处于同一时间点。
  5. 最多支持128层调用栈,如果实际情况超过128层,则仅保留栈顶的128层。
  6. 符号表没有被trip(当前release版本,使用的是strip –d,仅去掉了debug信息,符号表没有被trip,如果改为strip –s,则仅能显示指针,无法显示出符号名)。
  7. SQL执行方式仅支持monadmin、sysadmin用户。
  8. 注册了SIGURG信号的线程,才能获取调用栈。
  9. 对于屏蔽操作系统SIGUSR2的代码段,无法获取调用栈 ,如果线程没有注册signal_slot,同样无法获取调用栈。

依赖关系

无。

标签:内置,gs,int,unsigned,long,调用,openGauss,stack
From: https://www.cnblogs.com/renxyz/p/18105103

相关文章

  • openGauss 慢SQL发现
    慢SQL发现可获得性本特性自openGauss1.1.0版本开始引入。特性简介本功能是一个SQL语句执行时间预测工具,通过模板化方法,实现在不获取SQL语句执行计划的前提下,依据语句逻辑相似度与历史执行记录,预测SQL语句的执行时间。客户价值工具不需要用户提供SQL执行计划,对数据库性能不......
  • openGauss 慢SQL根因分析
    慢SQL根因分析可获得性本特性自openGauss3.0.0开始引入。特性简介慢SQL一直是数据运维中的痛点问题,如何有效诊断慢SQL根因是当前一大难题,工具结合openGauss自身特点融合了现网DBA慢SQL诊断经验,该工具可以支持慢SQL根因15+,能同时按照可能性大小输出多个根因并提供针对性的建议......
  • openGauss 逻辑复制
    逻辑复制可获得性本特性自openGauss1.0.0版本开始引入。特性简介openGauss提供逻辑解码功能,将物理日志反解析为逻辑日志。通过DRS等逻辑复制工具将逻辑日志转化为SQL语句,到对端数据库回放,达到异构数据库同步数据的功能。目前支持openGauss数据库与MySQL数据库、Oracle数据库......
  • openGauss 访问控制模型
    访问控制模型可获得性本特性自openGauss1.1.0版本开始引入。特性简介管理用户访问权限,为用户分配完成任务所需要的最小权限。客户价值客户依据自身需求创建对应的数据库用户并赋予相应的权限给操作人员,将数据库使用风险降到最低。特性描述数据库提供了基于角色的访问控制......
  • openGauss 堆表支持预读
    堆表支持预读可获得性本特性自openGauss6.0.0版本开始引入。特性简介在对堆表进行扫描进行顺序页面读取时,通过一次行读入多个页面,来减少因频繁读单页的IO损耗,提升对堆表进行线性扫描的性能表现。客户价值提升客户在频繁进行全表线性扫描场景下的性能表现。特性描述在对数......
  • openGauss 发布订阅
    发布订阅可获得性本特性自openGauss3.0.0版本开始引入。特性简介发布订阅基于逻辑复制实现,其中有一个或者更多订阅者订阅一个发布者节点上的一个或者更多发布。订阅者从它们所订阅的发布拉取数据。实现集群间的数据实时同步。客户价值发布订阅的典型使用场景是:在一个数......
  • openGauss 反向迁移gs_replicate
    反向迁移gs_replicate特性简介支持openGauss的增量数据在线迁移至MySQL。客户价值反向迁移是指用户将源端数据库迁移到目标数据库,应用切到目标数据库后,再将目标端新产生的数据迁移回源端。反向迁移可满足用户业务迁移逃生的诉求,保持源端、目标端两个库并行运行,在目标端数据库......
  • openGauss 备机增加删除
    备机增加删除可获得性本特性自openGauss2.0.0版本开始引入。特性简介支持新增和删除备节点。客户价值当主库的读取压力较大,或者用户想要提升数据库灾难恢复能力,需要新增备节点。当集群中的某些备节点发生故障无法短时间内进行修复时,为保证集群状态正常,用户可以先将故障节点......
  • openGauss 动态数据脱敏机制
    动态数据脱敏机制可获得性本特性自openGauss1.1.0版本开始引入。特性简介数据脱敏是行之有效的数据库隐私保护方案之一,可以在一定程度上限制非授权用户对隐私数据的窥探。动态数据脱敏机制是一种通过定制化制定脱敏策略从而实现对隐私数据保护的一种技术,可以有效地在保留原始......
  • openGauss 物理备份
    物理备份可获得性本特性自openGauss1.0.0版本开始引入。特性简介支持将整个数据库的数据以内部格式备份到指定的存储介质中。客户价值通过物理备份特性,可以达成以下目的:整个数据库的数据备份到可靠性更高的存储介质中,提升系统整体的可靠性。通过采用数据库内部的数据格......