欢迎光临散文网 会员登陆 & 注册

openGauss 3.1.0 版本gs_stack功能解密

2022-11-15 19:54 作者:Gauss松鼠会  | 我要投稿

不管是测试还是研发,工作中总有遇到各种各样的问题。比如,你有没有遇到过在数据库中执行某个SQL,却一直不返回结果,这时候的你是不是非常想看一下代码执行到了哪个函数?或者是数据库不响应连接,需要查看数据库当前线程的执行情况呢?而在实际生产中,获取生产系统进程堆栈比较麻烦,需要在服务端后台执行gstack命令。本期为大家介绍的openGauss 3.1.0版本中内置gs_stack工具,则可以通过函数调用的方式输出指定线程的堆栈,用于解决现网环境缺少gs_stack工具无法获取调用栈的问题。

内置gs_stack工具介绍

在openGauss的很多客户场景中,会出现gdb、gstack等工具无法使用或当系统出现hang、慢等问题时,无法通过调用栈进行进一步的定位;还有一种情况是登录客户数据库的流程非常繁杂,需要经过层层审批,这时通过gsql等工具连接数据库就相对容易一些。针对以上痛点,通过复用openGauss未使用操作系统信号,并在信号处理函数中获取调用栈的方式开发了调用栈工具,以获得服务端openGauss的调用栈。

获取调用栈主要包含两种方式,一种是通过执行SQL语句获取,另一种是通过gs_ctl工具执行命令获取。

1在客户端工具执行gs_stack([tid])函数

使用具有monadmin或者sysadmin用户权限的用户,通过gsql或者其他工具连接数据库;

执行命令:

返回当前openGauss所有线程的调用栈:

只需要查看某一个线程的调用栈时,执行命令:

说明

xxx为某个线程的thread_id,能够返回thread_id为xxx的线程的调用栈:

在服务器端使用gs_ctl stack –D data_dir命令

当线程池满,无法通过gsql连接数据库的时候,可以使用gs_ctl工具执行命令获取线程调用栈:

使用集群用户登录服务器,执行命令gs_ctl stack –D data_dir,data_dir是指定gaussdb的数据目录的绝对路径:

可以取gaussdb所有线程的调用栈。

只需要查看某一个线程的调用栈时,执行命令:

说明

data_dir是指定gaussdb的数据目录的绝对路径,xxx指的是线程的lwpid(taskid),可以通过top –Hp的方式获取线程的lwpid, 也可以通过cat /proc/yyyy/task获取线程的lwpid 。yyyy指的是进程id,可以通过ps –ux | grep gaussdb获取。

总结

通过以上我们介绍的openGauss的gs_stack功能,我们可以很方便地定位某个openGauss线程正在做的事情,并可以根据这些函数调用情况判断当前openGauss任务是否出现了问题,以及发现性能瓶颈。后续,我们将会进一步在这个功能上进行演进,不断增强openGauss的核心竞争力。


openGauss 3.1.0 版本gs_stack功能解密的评论 (共 条)

分享到微博请遵守国家法律